Auto Scaling は Server Load Balancer (SLB) および ApsaraDB RDS とネイティブに統合されていますが、ApsaraDB for MongoDB とは統合されていません。MongoDB インスタンスの IP アドレスホワイトリストをスケーリングイベントと同期させるには、Auto Scaling ライフサイクルフックと CloudOps Orchestration Service (OOS) パブリックテンプレートを組み合わせます。スケールアウトイベントが発生すると、ライフサイクルフックは新しい ECS インスタンスを Pending Add 状態にし、インスタンスが稼働する前に OOS をトリガーしてそのプライベート IP アドレスを MongoDB ホワイトリストに追加します。
このトピックでは、ACS-ESS-LifeCycleModifyMongoDBIPWhitelist パブリックテンプレートを使用したスケールアウトのケースについて説明します。同じアプローチがスケールインにも適用されます。スケールインイベント用に個別のライフサイクルフックを作成し、modifyMode を IP の追加ではなく削除に設定します。
前提条件
開始する前に、次のものがあることを確認してください。
有効化された状態のスケーリンググループ
ApsaraDB for MongoDB インスタンス
OOS 用の RAM ロール。信頼できるエンティティが [Alibaba Cloud サービス] に、信頼できるサービスが [CloudOps Orchestration Service] に設定されており、RAM ロールには OOS テンプレートで操作を実行する権限が必要です。詳細については、「RAM を使用して OOS に権限を付与する」をご参照ください。
このトピックでは、OOSServiceRole を RAM ロール名の例として使用します。必要な OOS 信頼関係で設定された任意の RAM ロールが機能します。
仕組み
スケールアウトイベントがライフサイクルフックをトリガーし、新しい ECS インスタンスを Pending Add 状態にします。
Auto Scaling は、
NotificationMetadataで定義されたパラメーターを含む通知を OOS に送信します。OOS は ACS-ESS-LifeCycleModifyMongoDBIPWhitelist テンプレートを実行し、インスタンスのプライベート IP アドレスを取得して MongoDB ホワイトリストに追加します。
OOS がタスクを完了すると、ライフサイクルフックはインスタンスをリリースし、インスタンスは In Service 状態に移行します。
ライフサイクルフックは、スケジュールされたタスクや監視タスクを含むスケーリングルールが実行されるときに有効になります。スケーリンググループからインスタンスを手動で追加または削除する場合には有効になりません。
OOS 実行を作成するために必要なパラメーターを指定するには、NotificationMetadata (略して metadata) を使用する必要があります。
metadataは JSON 文字列形式である必要があります。metadata内のキーは、OOS テンプレート内のパラメーターと一致する必要があります。OOS テンプレートにデフォルト設定がないパラメーターについては、これらのパラメーターの値を指定する必要があります。OOS テンプレートにデフォルト設定があるパラメーターについては、デフォルト設定を上書きするかどうかを指定できます。
ステップ 1: OOS に RAM ロール権限を付与する
ACS-ESS-LifeCycleModifyMongoDBIPWhitelist テンプレートには、ECS インスタンスを記述し、MongoDB セキュリティ IP を変更し、ライフサイクルアクションを完了するための権限が必要です。これらの権限を付与するポリシーを作成し、OOSServiceRole にアタッチします。
ポリシーの作成
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、[権限] > [ポリシー] を選択します。
[ポリシーの作成] をクリックします。
[ポリシーの作成] ページで、[JSON] タブをクリックし、次のポリシードキュメントを入力して、[OK] をクリックします。
パラメーター 値 名前 ESSHookPolicyForMongoDBWhitelist ポリシードキュメント 以下の JSON を参照 { "Version": "1", "Statement": [ { "Action": [ "ecs:DescribeInstances" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "dds:ModifySecurityIps" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "ess:CompleteLifecycleAction" ], "Resource": "*", "Effect": "Allow" } ] }
OOSServiceRole にポリシーをアタッチする
左側のナビゲーションウィンドウで、ID > ロール を選択します。
「OOSServiceRole」を見つけ、[権限の付与] を [操作] 列でクリックします。
[権限の付与] パネルで、次の設定を構成し、[権限を付与] をクリックします。
パラメーター 値 リソーススコープ アカウント ポリシー ESSHookPolicyForMongoDBWhitelist
ステップ 2: ライフサイクルフックを作成し、スケールアウトイベントをトリガーする
ライフサイクルフックの作成
Auto Scaling コンソールにログインします。
左側のナビゲーションウィンドウで、[スケーリンググループ] をクリックします。
上部のナビゲーションバーで、Auto Scaling がアクティブ化されているリージョンを選択します。
スケーリンググループを見つけ、[スケーリンググループ名/ID] 列のその ID をクリックするか、[操作] 列の [詳細] をクリックします。
スケーリンググループの詳細ページで、[ライフサイクルフック] タブをクリックします。
[ライフサイクルフックの作成] をクリックします。
以下のパラメーターを設定し、[OK] をクリックします。
パラメーター 値 名前 ESSHookForAddMongoDBWhitelist スケーリングアクティビティ スケールアウトイベント タイムアウト期間 OOS によるホワイトリスト更新の完了に十分な時間を設定します。本例では 300 秒を指定しています。タイムアウトが発生した時点で OOS の処理が完了していない場合、ライフサイクルアクションはデフォルトで 続行 となり、IP アドレスが追加されない状態でインスタンスが起動します。 デフォルト実行ポリシー 続行 ライフサイクルフックの有効化時に通知を送信 OOS テンプレート > パブリックテンプレート > LifeCycleModifyMongoDBIPWhitelist dbInstanceId ご利用の MongoDB インスタンスの ID(本例ではレプリカセットインスタンスを使用) modifyMode Append OOSAssumeRole OOSServiceRole
スケーリンググループにすでに ECS インスタンスが含まれている場合は、この自動化を有効にする前に、それらのプライベート IP アドレスを MongoDB ホワイトリストに手動で追加します。スケールインイベントが実行されたときにそれらの IP がホワイトリストにない場合、削除ステップは失敗します。
スケールアウトイベントをトリガーする
この例では、スケーリングルールを手動で実行してスケールアウトをトリガーします。本番環境では通常、スケジュールされたタスクまたは監視タスクを使用します。
スケーリンググループの詳細ページで、[スケーリングルールとイベントトリガータスク] タブをクリックします。
[スケーリングルール] タブで、[スケーリングルールの作成] をクリックします。
以下のパラメーターを設定して、[OK] をクリックしてください。
パラメーター 値 ルール名 Add1 ルールタイプ シンプルスケーリングルール 操作 インスタンスを1台追加 「Add1」ルールを見つけ、[実行] を [操作] 列でクリックします。
「[スケーリングルールの実行]」メッセージで、[OK] をクリックします。
Auto Scaling はスケーリンググループに ECS インスタンスを1台追加します。ESSHookForAddMongoDBWhitelist ライフサイクルフックが有効になっているため、インスタンスは Pending Add 状態になります。タイムアウト期間中に、OOS は ACS-ESS-LifeCycleModifyMongoDBIPWhitelist テンプレートを実行して MongoDB ホワイトリストを更新します。
ステップ 3: MongoDB ホワイトリストを確認する
MongoDB コンソールにログインします。
左側のナビゲーションウィンドウで、[Replica Set インスタンス] をクリックします。
目的の MongoDB インスタンスを見つけ、[インスタンス ID/名前] 列にある ID をクリックします。
左側のナビゲーションウィンドウで、[データセキュリティ] > [ホワイトリスト設定] を選択します。
新しい ECS インスタンスのプライベート IP アドレスがホワイトリストに表示されている場合、自動化は正しく機能しています。IP が見つからない場合は、次のステップで説明するように OOS 実行ログを確認します。
(オプション) ステップ 4: OOS 実行ログを表示する
OOS コンソールにログインします。
左側のナビゲーションウィンドウで、[自動化タスク] > [タスク実行管理] を選択します。
タイムスタンプで実行を検索し、[詳細] を [操作] 列でクリックします。
実行の詳細ページで、[基本情報] セクションを確認し、実行 ID およびステータスを確認します。 [実行ステップと結果] セクションで、個別のタスクノードをクリックして、ステップレベルの出力を表示します。
詳細については、「実行の詳細を表示する」をご参照ください。
よくある質問
運用保守 (O&M) タスクが失敗した場合は、実行結果のエラーメッセージに基づいて原因を特定します。詳細については、「よくある質問」をご参照ください。
一般的なエラーメッセージは次のとおりです。
エラーメッセージ | 原因 | 解決策 |
Forbidden.Unauthorized message: A required authorization for the specified action is not supplied. | Auto Scaling は、指定されたアクションを実行する権限がありません。 | 必要な権限が OOSServiceRole RAM ロールに付与されていることを確認します。 |
Forbidden.RAM message: User not authorized to operate on the specified resource, or this API doesn't support RAM. | RAM ユーザーまたは RAM ロールには、対応するリソースを操作する権限がありません。 | OOSServiceRole RAM ロールに必要な権限があることを確認します。たとえば、OOS サービスのサンプル権限を RAM ロールに付与できます。OOS サービスが OOS テンプレートで指定されたリソースを管理できるように、RAM ロールに操作権限を追加する必要があります。 |
LifecycleHookIdAndLifecycleActionToken.Invalid message: The specified lifecycleActionToken and lifecycleActionId you provided does not match any in process lifecycle action. | 進行中のライフサイクルアクションが期限切れになったか、中止されました。 | OOS テンプレートで定義された運用保守タスクがタイムアウト期間内に完了できるように、ライフサイクルフックのタイムアウト期間を評価します。 |
トラブルシューティング
IP アドレスがホワイトリストに追加されない
現象:スケールアウトイベントは完了しますが、ECS インスタンスのプライベート IP アドレスが MongoDB ホワイトリストに表示されません。
手順:
OOS 実行ログ (ステップ 4 を参照) を開き、実行ステータスが [失敗] であるかどうかを確認します。
実行が失敗した場合は、次のいずれかのエラーメッセージを探し、対応する解決策を適用します。
エラーメッセージ 原因 修正 Forbidden.Unauthorized: A required authorization for the specified action is not suppliedOOSServiceRole に必要な権限がありません ステップ 1 で説明されているように、 ESSHookPolicyForMongoDBWhitelistポリシーを OOSServiceRole にアタッチします。Forbidden.RAM: User not authorized to operate on the specified resource, or this API doesn't support RAMOOSServiceRole に必要な権限がありません ステップ 1 で説明されているように、 ESSHookPolicyForMongoDBWhitelistポリシーを OOSServiceRole にアタッチします。実行ログに OOS タスクがトリガーされたレコードが表示されない場合、ライフサイクルフックが正しく設定されていない可能性があります。フックが [スケールアウトイベント] を対象とし、OOS テンプレートが [ACS-ESS-LifeCycleModifyMongoDBIPWhitelist] に設定されていることを確認してください。
OOS が完了する前にライフサイクルアクションがタイムアウトする
現象:IP がホワイトリストに追加される前にインスタンスが Pending Add 状態から移行するか、OOS 実行ログに中断されたタスクが表示されます。
手順:
OOS 実行ログを開き、実行が
LifecycleHookIdAndLifecycleActionToken.Invalidエラーで終了したかどうかを確認します。LifecycleHookIdAndLifecycleActionToken.Invalid: The specified lifecycleActionToken and lifecycleActionId you provided does not match any in process lifecycle action.このエラーが表示された場合、ライフサイクルフックの[タイムアウト期間]が短すぎます。ライフサイクルフックで[タイムアウト期間]を延長し、OOS がホワイトリストの更新を完了できるだけの時間を確保した後、スケーリングルールを再実行して再度テストしてください。