コマーシャル マーケットプレース使用状況測定サービスを使用した Azure コンテナーの従量制課金
コマーシャル マーケットプレース使用状況測定サービスを使用すると、非標準ユニットに従って課金される Azure Container オファーを作成できます。 コマーシャル マーケットプレースにオファーを発行する前に、帯域幅、シャード、ログ ファイル、スキャン、処理された電子メールなどの課金ディメンションを定義します。その後、顧客は、これらのディメンションの使用量に従って支払いを行い、アプリケーションは、発生した課金対象イベントの コマーシャル マーケットプレース使用状況測定サービス API を介して Microsoft に通知します。
従量制課金の前提条件
Azure Container オファーで従量制課金を使用するには、まず、azure Container プランの プランで説明されている ライセンス オプション 確認し、既存の 6 つの定義済み課金モデルのいずれかに満たされていないカスタム課金ニーズがあることを確認する必要があります。
その後、Azure Container オファーを コマーシャル マーケットプレース使用状況測定サービス API と統合して、課金対象のイベントを Microsoft に通知できます。
重要
アプリケーションでは、コマーシャル マーケットプレース使用状況測定サービス API を呼び出す必要があります。 現時点では、(アプリケーションの外部で) ホステッド サービスで測定サービス API を呼び出すオプションはありません。
注釈
Marketplace 測定サービスは、カスタム課金モデルでのみ使用でき、ユーザーごとの課金モデルには適用されません。
従量制課金が価格にどのように適合するか
オファーの階層を理解することは、オファーとその価格モデルを定義する場合に重要です。
- 各オファーは、Microsoft 経由で販売するか、販売しないように構成されています。 オファーが発行されると、このオプションを変更することはできません。
- Microsoft を通じて販売するように構成された各オファーには、1 つ以上のプランを含めることができます。
- 各プランには、関連付けられた価格モデル (使用量ベースの月次課金プランまたはライセンス持ち込み (BYOL)) があります。 使用量ベースの月単位の課金プランでは、無料、6 つの定義済み課金オプションのいずれか、またはカスタムを選択できます。
- 価格モデルと価格入力オプションは、公開後は更新できません。
- 各プランには、完全な価格プランが必要です。
- カスタム ディメンションを使用して価格を設定し、請求ニーズを満たすために顧客に請求することができます。 各ディメンションは、コマーシャル マーケットプレース使用状況測定サービス APIを使用してサービスが Microsoft と通信する課金対象ユニットを表します。
重要
コード内の使用状況を追跡し、顧客に請求する使用状況に対してのみ使用状況イベントを Microsoft に送信する必要があります。
注釈
オファーは、オファーの作成時に公開された現地の市場価格を使用して、顧客の契約通貨で顧客に請求されます。 顧客が支払う金額と ISV が支払われる金額は、顧客がオファーを取引した時点の外国為替レートによって異なります。 詳細については、「通貨 変換する方法」を参照してください。
カスタム価格オプションのサンプル
たとえば、Contoso は、Kubernetes アプリケーションのシャーディング ロジックに IP が含まれる発行元です。 Contoso は、使用されたシャードの数に基づいて顧客に課金したいと考えています。 また、他の便利で競争力のある価格の課金オプションも検討しています。 Contoso は、コマーシャル マーケットプレース プログラムのパートナー センターで発行元として登録されており、コンテナー オファーを Azure のお客様に発行したいと考えています。 Contoso には、次の 4 つのプランが関連付けられています。
1 時間あたりに使用されるシャードあたりの料金 (たとえば、$1,000/シャード/時間)
1 回限りの支払いまたは定期請求のモデル化: Contoso は、アプリケーションから最大 100 個のログ ファイルを使用するために顧客に $449/mo を請求したいとします。 Contoso のアプリケーション ロジックは、その月の使用状況イベントを追跡し、100 個のログ ファイルの使用状況に対して月末に課金をトリガーします。
階層化課金のモデル化: Contoso は最大 100 シャードに対して月額 $449 の料金を課し、超過分には階層化された価格設定を適用するとします。 アプリケーション ロジックは、月の使用状況を追跡し、それに応じて使用状況をセグメント化し、期間の終了時に以下の測定 API を使用してレポートします。
多次元課金: Contoso はカスタムメーターを使用して、複数のディメンションに対応した高度な課金ニーズを満たすこともできます。
選択したプランに基づいて、Contoso Container オファーを受け取る Azure のお客様は、その使用状況に基づいて課金されます。 Contoso は、使用状況イベントを Microsoft に送信せずに使用状況をカウントします。 顧客が十分な量を消費するか、定期的に使用すると、Contoso は使用状況を報告します。 顧客は、プランを変更したり、何か異なったりする必要はありません。 Contoso は使用状況を測定し、コマーシャル マーケットプレース使用状況測定サービス APIを使用して超過分の使用量を課金するために、使用状況イベントを Microsoft に出力し始めます。 Microsoft は、カスタム ディメンションで発行元によって指定された使用量について顧客に請求します。 課金は、次の毎月の請求サイクルで行われます。
課金ディメンション
各課金ディメンションは、ISV が使用状況イベントを生成できるカスタム ユニットを定義します。 課金ディメンションは、ソフトウェアの使用に対する請求方法について顧客に伝えるためにも使用されます。 これらは次のように定義されます。
- ID: 使用状況イベントの生成中に参照される不変ディメンション識別子。
- 表示名: ディメンションに関連付けられた表示名 ("送信されたテキスト メッセージ" など)。
- 測定単位: 課金単位の説明 ("テキスト メッセージごと" や "100 メールごと" など)。
- USD単位あたりの価格: 1 つのディメンションの単位の価格。 0 にすることができます。
重要
アプリケーション コードの使用状況を追跡し、課金のニーズに基づいて使用状況イベントを Microsoft に送信する必要があります。
請求ディメンションは、オファーのすべてのプランで共有されます。 一部の属性はすべてのプランでディメンションに適用され、他の属性はプラン固有です。
ディメンション自体を定義する属性は、オファーのすべてのプランで共有されます。 オファーを発行する前に、プランのコンテキストからこれらの属性を変更すると、すべてのプランのディメンション定義に影響します。 オファーを発行すると、これらの属性は編集できなくなります。 これらの属性は次のとおりです。
- 身分証明書
- 表示名
- 測定単位
ディメンションの他の属性は、各プランに固有であり、プランごとに異なる値を持つことができます。 プランを発行する前に、これらの値を編集できます。このプランのみが影響を受けます。 プランを発行すると、これらの属性は編集できなくなります。 これらの属性は次のとおりです。
- ユニットあたりの価格 (USD)
ディメンションには、"enabled" という特別な概念もあります。
- 有効 は、このプランがこのディメンションに参加することを示します。 このディメンションに基づいて使用状況イベントを送信しない新しいプランを作成する場合は、このオプションをオフのままにします。 また、プランが最初に発行された後に追加された新しいディメンションは、既に公開されているプランでは "有効になっていません" と表示されます。 無効なディメンションは、顧客が表示するプランのディメンションの一覧には表示されません。
注釈
次のシナリオが明示的にサポートされています。
- 新しいプランに新しいディメンションを追加できます。 新しいディメンションは、既に発行されているプランでは有効になりません。
サポートされている市場ごとのユニットあたりのディメンション価格の設定
他の使用量ベースの価格と同様に、請求ディメンションの価格は、サポートされている国または地域ごとに設定できます。 次のように、パートナー センターで価格データのインポートとエクスポート機能を使用する必要があります。
- 目的のディメンションを定義し、サポートされている市場をマークします。
- このデータをファイルにエクスポートします。
- 国/地域ごとに適切な価格を追加し、パートナー センターでファイルをインポートします。
メーターのユーザー インターフェイスは、ディメンションの価格がファイル内でのみ表示されることを反映するように変更されます。
プライベート プラン
定義済みの使用量ベースの課金プランと同様に、カスタム ディメンションを持つプランはプライベート プランとして設定でき、プランの定義済みの対象ユーザーのみがアクセスできます。
制約
ロック動作
コマーシャル マーケットプレースの使用状況測定サービスで使用されるディメンションは、顧客がサービスに対して支払う方法を理解していることを表しているため、ディメンションを公開した後、ディメンションのすべての詳細を編集できなくなります。 発行する前に、プランのディメンションを完全に定義することが重要です。
ディメンションを使用してオファーが発行されると、そのディメンションのオファー レベルの詳細は変更できなくなります。
- 身分証明書
- 表示名
- 測定単位
プランが発行されると、このプラン レベルの詳細は変更できなくなります。
- ディメンションがプランに対して有効かどうか
上限
1 つのオファーに対して構成できるディメンションの最大数は、30 個の一意のディメンションです。
Azure コンテナーの従量制課金
従量制課金 API は、パブリッシャーがパートナー センターで発行するオファーのカスタム測定ディメンションを作成するときに使用する必要があります。 従量制課金 API との統合は、使用状況イベントを生成するためのカスタム ディメンションを持つ 1 つ以上のプランを持つ購入済みオファーに必要です。
重要
Kubernetes Apps のカスタム測定ディメンションの作成の詳細については、「Azure Container Offerの作成」を参照してください。
TLS 1.2 の適用に関する注意事項
TLS バージョン 1.2 バージョンは、HTTPS 通信の最小バージョンとして適用されます。 コードでこの TLS バージョンを使用していることを確認します。 TLS バージョン 1.0 と 1.1 は非推奨となり、接続の試行は拒否されます。
従量制課金の単一使用イベント
特定の顧客が購入したプランのアクティブなリソース (サブスクライブ済み) に対して使用状況イベントを生成するには、パブリッシャーが使用状況イベント API を呼び出す必要があります。 使用状況イベントは、オファーの発行時に発行元によって定義されたプランのカスタム ディメンションごとに個別に生成されます。
リソースとディメンションごとにカレンダー日の 1 時間ごとに生成できる使用状況イベントは 1 つだけです。 1 時間に複数のユニットが消費される場合は、1 時間に消費されたすべてのユニットを蓄積し、1 つのイベントで出力します。 使用状況イベントは、過去 24 時間のみ生成できます。 8:00 から 8:59:59 (および受け入れ可能) の間に使用状況イベントを生成し、同じ日の 8:00 から 8:59:59 の間に別のイベントを送信すると、重複として拒否されます。
POST: https://marketplaceapi.microsoft.com/api/usageEvent?api-version=<ApiVersion>
クエリ パラメーター:
パラメーター | 勧告 |
---|---|
ApiVersion |
2018-08-31 を使用します。 |
要求ヘッダー:
コンテンツタイプ | application/json を使用する |
---|---|
x-ms-requestid |
クライアントからの要求を追跡するための一意の文字列値 (できれば GUID)。 この値が指定されていない場合は、1 つが生成され、応答ヘッダーに指定されます。 |
x-ms-correlationid |
クライアントでの操作の一意の文字列値。 このパラメーターは、クライアント操作のすべてのイベントをサーバー側のイベントと関連付けます。 この値が指定されていない場合は、1 つが生成され、応答ヘッダーに指定されます。 |
authorization |
この API 呼び出しを行っている ISV を識別する一意のアクセス トークン。 トークン値は、発行者によって取得されるとき、Kubernetesアプリケーションの認証戦略で説明されているように、形式は"Bearer <access_token>" です。 |
リクエスト本文の例:
{
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", // unique identifier of the resource against which usage is emitted.
"quantity": 5.0, // how many units were consumed for the date and hour specified in effectiveStartTime, must be greater than 0 or a double integer
"dimension": "dim1", // custom dimension identifier
"effectiveStartTime": "2018-12-01T08:30:14", // time in UTC when the usage event occurred, from now and until 24 hours back
"planId": "plan1", // id of the plan purchased for the offer
}
注釈
Kubernetes アプリの場合、resourceUri
は Kubernetes アプリ インスタンスの ARM リソース URI です。
応答
コード: 200
わかりました。 使用量の排出量が受け入れられ、Microsoft 側で記録され、さらに処理と課金が行われました。
応答ペイロードの例:
{
"usageEventId": <guid>, // unique identifier associated with the usage event in Microsoft records
"status": "Accepted" // this is the only value in case of single usage event
"messageTime": "2020-01-12T13:19:35.3458658Z", // time in UTC this event was accepted
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", // unique identifier of the resource against which usage is emitted. For SaaS it's the subscriptionId.
"quantity": 5.0, // amount of emitted units as recorded by Microsoft
"dimension": "dim1", // custom dimension identifier
"effectiveStartTime": "2018-12-01T08:30:14", // time in UTC when the usage event occurred, as sent by the ISV
"planId": "plan1", // id of the plan purchased for the offer
}
コード: 400
要求が正しくありません。
- 指定された要求データが見つからないか無効です。
effectiveStartTime
は24時間以上前の過去の出来事です。 イベントの有効期限が切れています。
応答ペイロードの例:
{
"message": "One or more errors have occurred.",
"target": "usageEventRequest",
"details": [
{
"message": "The resourceUri is required.",
"target": "ResourceUri",
"code": "BadArgument"
}
],
"code": "BadArgument"
}
コード: 400
要求が正しくありません。
- リソース URI は既に登録されています。使用状況を送信する前に 24 時間待機する必要があります。
応答ペイロードの例:
{
"message": "One or more errors have occurred.",
"target": "usageEventRequest",
"details": [
{
"message": "Invalid usage state.",
"target": "ResourceUri",
"code": "BadArgument"
}
],
"code": "BadArgument"
}
コード: 403
禁じられた。 承認トークンが指定されていないか、無効であるか、期限切れです。
コード: 409
葛藤。 指定されたリソース ID、有効な使用日、および時間について、使用状況イベントが既に正常に報告されています。
応答ペイロードの例:
{
"additionalInfo": {
"acceptedMessage": {
"usageEventId": "<guid>", //unique identifier associated with the usage event in Microsoft records
"status": "Duplicate",
"messageTime": "2020-01-12T13:19:35.3458658Z",
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", //unique identifier of the resource against which usage is emitted.
"quantity": 1.0,
"dimension": "dim1",
"effectiveStartTime": "2020-01-12T11:03:28.14Z",
"planId": "plan1"
}
},
"message": "This usage event already exist.",
"code": "Conflict"
}
従量制課金のバッチ使用イベント
バッチ使用状況イベント API を使用すると、複数の購入済みリソースの使用状況イベントを一度に出力できます。 また、カレンダー時間が異なる限り、同じリソースに対して複数の使用状況イベントを出力することもできます。 1 つのバッチ内のイベントの最大数は 25 です。
POST:https://marketplaceapi.microsoft.com/api/batchUsageEvent?api-version=<ApiVersion>
クエリ パラメーター:
パラメーター | 勧告 |
---|---|
ApiVersion |
2018-08-31 を使用します。 |
要求ヘッダー:
コンテンツタイプ | application/json を使用する |
---|---|
x-ms-requestid |
クライアントからの要求を追跡するための一意の文字列値 (できれば GUID)。 この値が指定されていない場合は、1 つが生成され、応答ヘッダーに指定されます。 |
x-ms-correlationid |
クライアントでの操作の一意の文字列値。 このパラメーターは、クライアント操作のすべてのイベントをサーバー側のイベントと関連付けます。 この値が指定されていない場合は、生成され、応答ヘッダーで指定されます。 |
authorization |
この API 呼び出しを行っている ISV を識別する一意のアクセス トークン。 形式は、トークンの値が発行者によって取得されると Bearer <access_token> になります。これは、Kubernetes アプリケーションの 認証戦略で説明されています。 |
注釈
要求本文では、Kubernetes アプリのリソース識別子が resourceUri
。
Kubernetes アプリの要求本文の例:
{
"request": [ // list of usage events for the same or different resources of the publisher
{ // first event
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", // Unique identifier of the resource against which usage is emitted.
"quantity": 5.0, // how many units were consumed for the date and hour specified in effectiveStartTime, must be greater than 0 or a double integer
"dimension": "dim1", //Custom dimension identifier
"effectiveStartTime": "2018-12-01T08:30:14",//Time in UTC when the usage event occurred, from now and until 24 hours back
"planId": "plan1", // id of the plan purchased for the offer
},
{ // next event
"resourceUri": "<ARM resource URI of the Kubernetes app instance>",
"quantity": 39.0,
"dimension": "email",
"effectiveStartTime": "2018-11-01T23:33:10
"planId": "gold", // id of the plan purchased for the offer
}
]
}
応答
コード: 200
わかりました。 バッチ使用量の排出量が受け入れられ、Microsoft 側で記録され、さらに処理と課金が行われました。 応答リストは、バッチ内の個々のイベントの状態と共に返されます。 バッチ イベントの一部として送信された個々の使用状況イベントの応答を理解するには、応答ペイロードを反復処理する必要があります。
応答ペイロードの例:
{
"count": 2, // number of records in the response
"result": [
{ // first response
"usageEventId": "<guid>", // unique identifier associated with the usage event in Microsoft records
"status": "Accepted" // see list of possible statuses below,
"messageTime": "2020-01-12T13:19:35.3458658Z", // Time in UTC this event was accepted by Microsoft,
"resourceUri": "<ARM resource URI of the Kubernetes app instance>", // unique identifier of the resource against which usage is emitted.
"quantity": 5.0, // amount of emitted units as recorded by Microsoft
"dimension": "dim1", // custom dimension identifier
"effectiveStartTime": "2018-12-01T08:30:14",// time in UTC when the usage event occurred, as sent by the ISV
"planId": "plan1", // id of the plan purchased for the offer
},
{ // second response
"status": "Duplicate",
"messageTime": "0001-01-01T00:00:00",
"error": {
"additionalInfo": {
"acceptedMessage": {
"usageEventId": "<guid>",
"status": "Duplicate",
"messageTime": "2020-01-12T13:19:35.3458658Z",
"resourceUri": "<ARM resource URI of the Kubernetes app instance>",
"quantity": 1.0,
"dimension": "email",
"effectiveStartTime": "2020-01-12T11:03:28.14Z",
"planId": "gold"
}
},
"message": "This usage event already exist.",
"code": "Conflict"
},
"resourceId": "<guid2>",
"quantity": 1.0,
"dimension": "email",
"effectiveStartTime": "2020-01-12T11:03:28.14Z",
"planId": "gold"
}
]
}
BatchUsageEvent
API 応答で参照される状態コードの説明:
状態コード | 説明 |
---|---|
Accepted |
承認された。 |
Expired |
使用期限切れ。 |
Duplicate |
重複した使用が確認されました。 |
Error |
エラー コード。 |
ResourceNotFound |
指定された使用状況リソースが無効です。 |
ResourceNotAuthorized |
このリソースの使用状況を提供する権限がありません。 |
ResourceNotActive |
リソースが中断されているか、アクティブ化されませんでした。 |
InvalidDimension |
使用量が渡されるディメンションは、このオファー/プランでは無効です。 |
InvalidQuantity |
渡される数量は 0 以下です。 |
BadArgument |
入力が欠落しているか、形式が正しくありません。 |
コード: 400
要求が正しくありません。 バッチには、25 を超える使用状況イベントが含まれていました。
コード: 403
禁じられた。 承認トークンが指定されていないか、無効であるか、期限切れです。
従量制課金での使用イベントの取得
使用状況イベント API を呼び出して、使用状況イベントの一覧を取得できます。 ISV は、この API を使用して、特定の構成可能な期間に投稿された使用状況イベントと、API を呼び出した時点でのこれらのイベントの状態を確認できます。
GET: https://marketplaceapi.microsoft.com/api/usageEvents
クエリ パラメーター:
パラメーター | 勧告 |
---|---|
ApiVersion | 2018-08-31 を使用します。 |
使用開始日 | ISO8601形式の DateTime。 たとえば、2020-12-03T15:00 や 2020-12-03 などです。 |
使用終了日 (任意) | ISO8601形式の DateTime。 既定値 = 現在の日付 |
offerId(任意) | 既定値 = 使用可能なすべての値 |
planId(オプション) | 既定値 = 使用可能なすべての値 |
dimension (省略可能) | 既定値 = 使用可能なすべての値 |
azureSubscriptionId (省略可能) | 既定値 = 使用可能なすべての値 |
reconStatus (省略可能) | 既定値 = 使用可能なすべての値 |
reconStatusの使用可能な値:
ReconStatus | 説明 |
---|---|
送信済み | PC Analytics でまだ処理されていません |
受け入れられた | PC Analytics と一致 |
拒否 | パイプラインで拒否されました。 原因を調査するには、Microsoft サポートにお問い合わせください。 |
ミスマッチ | MarketplaceAPI とパートナー センターの分析の数量はどちらも 0 以外ですが、一致しません |
TestHeaders | テスト ヘッダーを含むサブスクリプションが一覧表示されるため、PC Analytics では表示されません |
DryRun | SessionMode=DryRun を使用して送信されるため、PC では送信されません |
要求ヘッダー:
コンテンツ タイプ | application/json を使用する |
---|---|
x-ms-requestid | クライアントからの要求を追跡するための一意の文字列値 (できれば GUID)。 この値が指定されていない場合は、1 つが生成され、応答ヘッダーに指定されます。 |
x-ms-correlationid | クライアントでの操作の一意の文字列値。 このパラメーターは、クライアント操作のすべてのイベントをサーバー側のイベントと関連付けます。 この値が指定されていない場合は、1 つが生成され、応答ヘッダーに指定されます。 |
認可 | この API 呼び出しを行っている ISV を識別する一意のアクセス トークン。 トークン値がパブリッシャーによって取得されるとき、形式は Bearer <access_token> です。- 認証の戦略の Kubernetes アプリケーション |
応答
応答ペイロードの例:
承認済み
[
{
"usageDate": "2020-11-30T00:00:00Z",
"usageResourceId": "11111111-2222-3333-4444-555555555555",
"dimension": "tokens",
"planId": "silver",
"planName": "Silver",
"offerId": "mycooloffer",
"offerName": "My Cool Offer",
"offerType": "SaaS",
"azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
"reconStatus": "Accepted",
"submittedQuantity": 17.0,
"processedQuantity": 17.0,
"submittedCount": 17
}
]
Submitted
[
{
"usageDate": "2020-11-30T00:00:00Z",
"usageResourceId": "11111111-2222-3333-4444-555555555555",
"dimension": "tokens",
"planId": "silver",
"planName": "",
"offerId": "mycooloffer",
"offerName": "",
"offerType": "SaaS",
"azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
"reconStatus": "Submitted",
"submittedQuantity": 17.0,
"processedQuantity": 0.0,
"submittedCount": 17
}
]
不一致
[
{
"usageDate": "2020-11-30T00:00:00Z",
"usageResourceId": "11111111-2222-3333-4444-555555555555",
"dimension": "tokens",
"planId": "silver",
"planName": "Silver",
"offerId": "mycooloffer",
"offerName": "My Cool Offer",
"offerType": "SaaS",
"azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
"reconStatus": "Mismatch",
"submittedQuantity": 17.0,
"processedQuantity": 16.0,
"submittedCount": 17
}
]
拒否された
[
{
"usageDate": "2020-11-30T00:00:00Z",
"usageResourceId": "11111111-2222-3333-4444-555555555555",
"dimension": "tokens",
"planId": "silver",
"planName": "",
"offerId": "mycooloffer",
"offerName": "",
"offerType": "SaaS",
"azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
"reconStatus": "Rejected",
"submittedQuantity": 17.0,
"processedQuantity": 0.0,
"submittedCount": 17
}
]
状態コード
コード: 403 禁止。 承認トークンが指定されていないか、無効であるか、期限切れです。
開発とテストのベスト プラクティス
カスタム測定の排出量をテストするには、測定 API との統合を実装し、発行済みの Kubernetes Apps オファーのプランを作成し、1 ユニットあたりの価格をゼロにしてカスタム ディメンションを定義します。 また、このオファーをプレビューとして発行すると、制限付きユーザーのみが統合にアクセスしてテストできるようになります。
既存のライブ オファーのプライベート プランを使用して、テスト中にこのプランへのアクセスを制限対象ユーザーに制限することもできます。
関連コンテンツ
サポートを受ける
次のいずれかの問題がある場合は、サポート チケットを開くことができます。
- Marketplace 測定サービス API に関する技術的な問題。
- あなた側のエラーまたはバグが原因でエスカレートが必要となる問題(例: 誤った使用イベント)。
- 従量制課金に関連するその他の問題。
発行元のサポート オプションを理解し、Microsoft でサポート チケットを開くには、パートナー センター のコマーシャル マーケットプレース プログラムのサポートの手順に従ってください。