Auto Scaling は、Server Load Balancer (SLB) や ApsaraDB RDS とはネイティブに統合されていますが、PolarDB とは統合されていません。アプリケーションデータが PolarDB クラスターに保存されている場合、ライフサイクルフックと CloudOps Orchestration Service (OOS) のパブリックテンプレートを併用することで、スケーリンググループのスケールアウトまたはスケールイン時に、Elastic Compute Service (ECS) インスタンスのプライベート IP アドレスを PolarDB クラスターの IP アドレスホワイトリストに自動で追加または削除できます。
仕組み
Auto Scaling がスケールアウトイベント中に ECS インスタンスを追加すると、ライフサイクルフックによってインスタンスはサービスインする前に Pending Add 状態になります。この待機期間中に、Auto Scaling は OOS に通知し、ACS-ESS-LifeCycleModifyPolarDBIPWhitelist テンプレートを実行させます。このテンプレートは、インスタンスのプライベート IP アドレスを PolarDB クラスターの IP アドレスホワイトリストに追加します。OOS がタスクを完了すると、インスタンスは InService 状態に移行します。
スケールインの場合も同様の仕組みで動作します。スケールインイベントのライフサイクルフックがインスタンスを待機状態にし、OOS がプライベート IP アドレスをホワイトリストから削除した後、インスタンスはリリースされます。
前提条件
開始する前に、以下が準備できていることを確認してください。
有効状態のスケーリンググループ
PolarDB クラスター
OOS 用の RAM ロール。信頼できるエンティティとして Alibaba Cloud サービス、信頼できるサービスとして CloudOps Orchestration Service が設定されていること
注: このチュートリアルでは、RAM ロール名として OOSServiceRole を使用します。要件を満たす任意の RAM ロールを使用できます。ステップ 1: RAM ロールへの権限付与
ACS-ESS-LifeCycleModifyPolarDBIPWhitelist テンプレートには、ECS インスタンスのクエリ、PolarDB クラスターのホワイトリストの更新、およびライフサイクルアクションの完了を行うための権限が必要です。これらの権限を持つポリシーを作成し、OOS の RAM ロールにアタッチします。
ポリシーの作成
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、[権限] > [ポリシー] を選択します。
[ポリシーの作成] をクリックします。
「[ポリシーの作成]」ページで、「[JSON]」タブをクリックし、以下のポリシードキュメントを入力して、「[OK]」をクリックします。ポリシー名を
ESSHookPolicyForPolarDBWhitelistに設定します。{ "Version": "1", "Statement": [ { "Action": [ "ecs:DescribeInstances" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "polardb:DescribeDBClusterAccessWhitelist", "polardb:ModifyDBClusterAccessWhitelist" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "ess:CompleteLifecycleAction" ], "Resource": "*", "Effect": "Allow" } ] }
OOS RAM ロールへのポリシーのアタッチ
左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] の順に選択します。
OOSServiceRole を探し、[アクション] 列の [権限を付与] をクリックします。
「[権限の付与]」パネルで、以下の設定を設定し、「[権限を付与]」をクリックします。
パラメーター 値 リソースのスコープ アカウント ポリシー ESSHookPolicyForPolarDBWhitelist
ステップ 2: ライフサイクルフックの作成とスケールアウトイベントのトリガー
このステップでは、スケールアウトイベントで発動し、OOS テンプレートを呼び出して PolarDB のホワイトリストを更新するライフサイクルフックを作成します。
ライフサイクルフックの作成
Auto Scaling コンソールにログインします。
左側のナビゲーションウィンドウで、[スケーリンググループ] をクリックします。
上部のナビゲーションバーで、スケーリンググループが配置されているリージョンを選択します。
スケーリンググループの ID をクリックするか、[操作] 列の [詳細] をクリックします。
スケーリンググループの詳細ページで、[ライフサイクルフック] タブをクリックします。
[ライフサイクルフックの作成] をクリックします。
以下の設定を設定し、[OK] をクリックします。
パラメーター 値 名前 ESSHookForAddPolarDBWhitelist スケーリングアクティビティ スケールアウトイベント タイムアウト期間 300 (秒)。OOS テンプレートが完了するのに十分な長さに設定します。タイムアウト期間が経過する前に OOS タスクが完了しない場合、デフォルトの実行ポリシーが適用されます。 既定の実行ポリシー [続行] を選択します。 ライフサイクルフック有効時の通知 [OOS テンプレート] を選択し、[パブリックテンプレート] を選択してから、 ACS-ESS-LifeCycleModifyPolarDBIPWhitelistを選択します。ACS-ESS-LifeCycleModifyPolarDBIPWhitelistテンプレートのパラメーターで、以下を設定します。パラメーター 値 dbClusterId ご利用の PolarDB クラスターの ID modifyMode Append (スケールアウト時にプライベート IP アドレスをホワイトリストに追加します) OOSAssumeRole OOSServiceRole
スケールアウトイベントのトリガー
スケーリングルールを実行して、スケールアウトイベントをトリガーします。定期タスクや監視タスクを使用してスケールアウトイベントをトリガーすることもできます。
注: ライフサイクルフックは、スケーリングイベントがスケーリングルール、定期タスク、または監視タスクによってトリガーされた場合にのみ有効になります。手動でスケーリンググループに ECS インスタンスを追加または削除した場合には有効になりません。
スケーリンググループの詳細ページで、[スケーリングルールおよびイベントトリガー型タスク] タブをクリックします。
「スケーリングルール」タブで、「スケーリングルールの作成」をクリックします。
以下の設定を構成し、[OK] をクリックします。
パラメーター 値 [ルール名] Add1 ルールタイプ シンプルスケーリングルール [操作] 1 個のインスタンスを追加 「Add1」スケーリングルールを見つけ、[実行] を [操作] 列でクリックします。
確認ダイアログで、[OK]をクリックします。
スケーリングルールが実行されると、Auto Scaling はスケーリンググループに 1 つの ECS インスタンスを追加します。ライフサイクルフックが有効になっているため、インスタンスは Pending Add 状態になります。タイムアウト期間中に、OOS は ACS-ESS-LifeCycleModifyPolarDBIPWhitelist テンプレートを実行して、インスタンスのプライベート IP アドレスを PolarDB クラスターの IP アドレスホワイトリストに追加します。
ステップ 3: ホワイトリスト更新の確認
PolarDB クラスターのホワイトリストをチェックして、インスタンスのプライベート IP アドレスが追加されたことを確認します。
PolarDB コンソールにログインします。
左側のナビゲーションウィンドウで、[クラスター]をクリックします。
クラスターを探して、[クラスター ID / 名前] 列でその ID をクリックします。
左側のナビゲーションウィンドウで、設定項目と管理 > クラスタホワイトリスト を選択します。
プライベート IP アドレスがホワイトリストに表示されている場合: OOS テンプレートは正常に実行されました。設定は完了です。
プライベート IP アドレスが見つからない場合: OOS テンプレートが正常に完了しなかった可能性があります。ステップ 4 に進んで原因を調査してください。
ステップ 4: (オプション) OOS 実行詳細の表示
ホワイトリストが更新されなかった場合は、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 テンプレートで定義された O&M タスクがタイムアウト期間内に完了できることを確認してください。 |
トラブルシューティング
| エラー | 原因 | 解決策 |
|---|---|---|
Forbidden.Unauthorized: A required authorization for the specified action is not supplied | OOS RAM ロールに必要な権限がありません。 | ステップ 1 で説明したように、OOSServiceRole に ESSHookPolicyForPolarDBWhitelist ポリシーがアタッチされていることを確認してください。 |
Forbidden.RAM: User not authorized to operate on the specified resource, or this API doesn't support RAM | OOS RAM ロールに必要な権限がありません。 | ステップ 1 で説明したように、OOSServiceRole に ESSHookPolicyForPolarDBWhitelist ポリシーがアタッチされていることを確認してください。 |
LifecycleHookIdAndLifecycleActionToken.Invalid: The specified lifecycleActionToken and lifecycleActionId you provided does not match any in process lifecycle action | OOS テンプレートが完了する前にライフサイクルフックがタイムアウトしました。 | タイムアウト期間ライフサイクルフックの を長くして、OOS テンプレートが完了するのに十分な時間を確保してください。 |
次のステップ
スケールイン中の IP アドレスの削除を自動化するには、[スケールインイベント] 用に別のライフサイクルフックを作成し、OOS テンプレートパラメーターを適宜設定します。
OOSServiceRoleの代わりにカスタム RAM ロールを使用するには、信頼できるエンティティとして [Alibaba Cloud サービス] を、信頼できるサービスとして [CloudOps Orchestration Service] を指定して RAM ロールを作成し、同じポリシーをアタッチして、[OOSAssumeRole] パラメーターでロール名を指定します。