チュートリアル: インスタンスメタデータを使用してターゲットライフサイクル状態を取得するようにユーザーデータを設定する - Amazon EC2 Auto Scaling

チュートリアル: インスタンスメタデータを使用してターゲットライフサイクル状態を取得するようにユーザーデータを設定する

ライフサイクルフックのカスタムアクションを作成する一般的な方法は、Amazon EC2 Auto Scaling が Amazon EventBridge などの他のサービスに送信する通知を使用することですが、その代わりに、インスタンスを設定してライフサイクルアクションを完了するコードをインスタンスそのものに移動させるユーザーデータスクリプトを使用することによって、追加のインフラストラクチャを作成する手間を省くことができます。

以下のチュートリアルは、ユーザーデータスクリプトとインスタンスメタデータを使用して開始する方法を説明します。グループ内のインスタンスのターゲットライフサイクル状態を読み取り、インスタンスのライフサイクルの特定のフェーズでコールバックアクションを実行して起動プロセスを続行するユーザーデータスクリプトを使用した、基本的な Auto Scaling グループ設定を作成します。

ステップ 1: ライフサイクルアクションを完了するための許可を持つ IAM ロールを作成する

ライフサイクルアクションを完了するためのコールバックの送信に AWS CLI または AWS SDK を使用するときは、ライフサイクルアクションを完了するための許可を持つ IAM ロールを使用する必要があります。

ポリシーを作成するには
  1. IAM コンソールの [ポリシーページ] を開き、[ポリシーの作成] を選択します。

  2. [JSON] タブを選択します。

  3. [Policy Document] (ポリシードキュメント) ボックスで、以下のポリシードキュメントをコピーし、ボックスに貼り付けます。sample text を、お使いのアカウント番号と、作成する Auto Scaling グループの名前 (TestAutoScalingEvent-group) に置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/TestAutoScalingEvent-group" } ] }
  4. [次へ:タグ] を選択し、[次へ:レビュー] を選択します。

  5. [Name] (名前) に「TestAutoScalingEvent-policy」と入力します。[Create policy] を選択します。

ポリシーの作成が完了したら、それを使用するロールを作成できます。

ロールを作成するには
  1. 左側のナビゲーションペインで、[Roles] を選択します。

  2. [ロールの作成] を選択します。

  3. [Select trusted entity] (信頼されたエンティティの選択) で、[AWS のサービス] を選択します。

  4. ユースケースに [EC2] を選択してから、[Next] (次へ) を選択します。

  5. [Add permissions] (許可を追加) で、作成したポリシー ([TestAutoScalingEvent-policy]) を選択します。続いて、[Next (次へ)] を選択します。

  6. [Name, review, and create] (名前、確認、および作成) ページで、[Role name] (ロール名) に TestAutoScalingEvent-role を入力し、[Create role] (ロールを作成) を選択します。

ステップ 2: 起動テンプレートを作成して IAM ロールとユーザーデータスクリプトを含める

Auto Scaling グループで使用する起動テンプレートを作成します。作成した IAM ロールと、提供されたサンプルユーザーデータスクリプトを含めます。

起動テンプレートを作成するには
  1. Amazon EC2 コンソールの [Launch templates] (起動テンプレート) ページを開きます。

  2. [起動テンプレートの作成] を選択します。

  3. [起動テンプレート名] を使用する場合、TestAutoScalingEvent-template を入力します。

  4. [Auto Scaling ガイダンス] で、チェックボックスを選択します。

  5. [アプリケーションおよび OS イメージ (Amazon マシンイメージ)] で、[クイックスタート] から Amazon Linux 2 (HVM)、SSD Volume Type、64 ビット (x86) を選択します。

  6. [Instance type] (インスタンスタイプ) には、Amazon EC2 インスタンスのタイプ (「t2.micro」など) を選択します。

  7. [詳細設定] を使用する場合、セクションを展開してフィールドを表示します。

  8. [IAM instance profile] (IAM インスタンスプロファイル) で、IAM ロールの IAM インスタンスプロファイル名を選択します (TestAutoScalingEvent-role)。インスタンスプロファイルは IAM ロールのコンテナであり、インスタンスの起動時に Amazon EC2 インスタンスに IAM ロール情報を渡すために使用できます。

    IAM コンソールを使用して IAM ロールを作成すると、コンソールが対応するロールと同じ名前を使用したインスタンスプロファイルを自動的に作成します。

  9. [User data] (ユーザーデータ) では、以下のサンプルユーザーデータスクリプトをコピーして、フィールドに貼り付けます。group_name のサンプルテキストは、作成する Auto Scaling グループの名前に置き換え、region は、Auto Scaling グループが使用する AWS リージョンに置き換えます。

    #!/bin/bash function get_target_state { echo $(curl -s http://169.254.169.254/latest/meta-data/autoscaling/target-lifecycle-state) } function get_instance_id { echo $(curl -s http://169.254.169.254/latest/meta-data/instance-id) } function complete_lifecycle_action { instance_id=$(get_instance_id) group_name='TestAutoScalingEvent-group' region='us-west-2' echo $instance_id echo $region echo $(aws autoscaling complete-lifecycle-action \ --lifecycle-hook-name TestAutoScalingEvent-hook \ --auto-scaling-group-name $group_name \ --lifecycle-action-result CONTINUE \ --instance-id $instance_id \ --region $region) } function main { while true do target_state=$(get_target_state) if [ \"$target_state\" = \"InService\" ]; then # Change hostname export new_hostname="${group_name}-$instance_id" hostname $new_hostname # Send callback complete_lifecycle_action break fi echo $target_state sleep 5 done } main

    このシンプルなユーザーデータスクリプトは、以下を実行します。

    • インスタンスメタデータを呼び出して、インスタンスメタデータからターゲットライフサイクル状態とインスタンス ID を取得する

    • ターゲットライフサイクル状態が InService に変更されるまで、状態を繰り返し取得する

    • ターゲットライフサイクル状態が InService の場合、インスタンスのホスト名を Auto Scaling グループの名前が先頭に付加されたインスタンス ID に変更する

    • complete-lifecycle-action CLI コマンドを呼び出すことによってコールバックを送信し、EC2 起動プロセスを CONTINUE するように Amazon EC2 Auto Scaling に通知する

  10. [起動テンプレートの作成] を選択します。

  11. 確認ページで、[Auto Scaling グループの作成] を選択します。

注記

ユーザーデータスクリプトを開発する際の参考として使用できるその他の例については、Amazon EC2 Auto Scaling の GitHub リポジトリを参照してください。

ステップ 3: Auto Scaling グループを作成する

起動テンプレートを作成したら、Auto Scaling グループを作成します。

Auto Scaling グループを作成する
  1. [Choose launch template or configuration] (起動テンプレートまたは起動設定を選択する) ページで、[Auto Scaling group name] (Auto Scaling グループ名) に Auto Scaling グループの名前 (TestAutoScalingEvent-group) を入力します。

  2. [Next] (次へ) を選択して、[Choose instance launch options] (インスタンス起動オプションを選択) ページに進みます。

  3. [Network] (ネットワーク) で VPC を選択します。

  4. [Availability Zones and subnets] (アベイラビリティーゾーンとサブネット) で、1 つ、または複数のアベイラビリティーゾーンから 1 つ、または複数のサブネットを選択します。

  5. [Instance type requirements] (インスタンスタイプの要件) セクションでは、このステップを簡略化するためにデフォルト設定を使用します。(起動テンプレートを上書きしないでください。) このチュートリアルでは、起動テンプレートで指定されたインスタンスタイプを使用して、オンデマンドインスタンスを 1 つだけ起動します。

  6. 画面の最下部にある [Skip to review] (スキップして確認) を選択します。

  7. [Review] (確認) ページで Auto Scaling グループの詳細を確認してから、[Create Auto Scaling group] (Auto Scaling グループを作成) を選択します。

ステップ 4: ライフサイクルフックを追加する

ライフサイクルアクションが完了するまでインスタンスを待機状態に維持するライフサイクルフックを追加します。

ライフサイクルフックを追加するには
  1. Amazon EC2 コンソールの Auto Scaling グループページを開きます。

  2. Auto Scaling グループの横にあるチェックボックスを選択します。

    [Auto Scaling グループ] ページの下のパートに分割ペインが開き、グループに関する情報が表示されます。

  3. 下部のペインで、[Instance management (インスタンス管理)] タブの [Lifecycle hooks (ライフサイクルフック)] で、[Create lifecycle hook (ライフサイクルフックを作成)] を選択します。

  4. ライフサイクルフックを定義するには、以下を実行します。

    1. [ライフサイクルフック名] で、TestAutoScalingEvent-hookを入力します。

    2. [Lifecycle transition (ライフサイクルの移行)] で、[Instance launch (インスタンスの起動)] を選択します。

    3. [Heartbeat timeout] (ハートビートタイムアウト) に、ユーザーデータスクリプトからのコールバックを待つ秒数として 300 を入力します。

    4. [デフォルトの結果] で、[中止] を選択します。フックがユーザーデータスクリプトからのコールバックを受け取ることなくタイムアウトすると、Auto Scaling グループは新しいインスタンスを終了します。

    5. (オプション) [Notification metadata] (通知メタデータ) を空のままにしておきます。

  5. [Create] を選択します。

ステップ 5: 機能をテストして検証する

機能をテストするには、Auto Scaling グループの希望容量を 1 つ増やすことによって Auto Scaling グループを更新します。インスタンスの起動直後にユーザーデータスクリプトが実行され、インスタンスのターゲットライフサイクル状態のチェックが開始されます。スクリプトは、ターゲットライフサイクル状態が InService になるとホスト名を変更し、コールバックアクションを送信します。これには通常、完了まで数秒しかかかりません。

Auto Scaling グループのサイズを増やすには
  1. Amazon EC2 コンソールの Auto Scaling グループページを開きます。

  2. Auto Scaling グループの横にあるチェックボックスを選択します。上部ペインの最上部の行が見えている状態で、下部ペインの詳細を確認します。

  3. 下部のペインの [詳細] タブで、[グループの詳細] 、[編集] を順に選択します。

  4. [Desired capacity (希望するキャパシティー)] の場合は、現在の値を 1 ずつ増やします。

  5. [Update] (更新) を選択します。インスタンスの起動中は、上部ペインの [Status (ステータス)] 列に [Updating capacity (キャパシティーの更新)] というステータスが表示されます。

希望容量を増やした後で、スケーリングアクティビティの説明からインスタンスが正常に起動され、終了されていないことを確認できます。

スケーリングを表示するには
  1. [Auto Scaling グループ] ページに戻り、グループを選択します。

  2. [アクティビティ] タブの [アクティビティ履歴] では、[ステータス] 列に、Auto Scaling グループがインスタンスを正常に起動したかどうかが表示されます。

  3. ユーザーデータスクリプトが失敗した場合は、タイムアウト期間が過ぎたときに、ステータスが Canceled のスケーリングアクティビティと、Instance failed to complete user's Lifecycle Action: Lifecycle Action with token e85eb647-4fe0-4909-b341-a6c42EXAMPLE was abandoned: Lifecycle Action Completed with ABANDON Result のステータスメッセージが表示されます。

ステップ 6: クリーンアップする

このチュートリアルのために作成したリソースでの作業が完了したら、次の手順を実行してそれらを削除してください。

ライフサイクルフックを削除するには
  1. Amazon EC2 コンソールの Auto Scaling グループページを開きます。

  2. Auto Scaling グループの横にあるチェックボックスを選択します。

  3. [Instance management (インスタンス管理)] タブの [Lifecycle hooks (ライフサイクルフック)] で、[lifecycle hook (ライフサイクルフック)] を選択します。(TestAutoScalingEvent-hook)

  4. [Actions] (アクション) で、[Delete] (削除) を選択します。

  5. 確認のために、もう一度 [削除] を選択します。

起動テンプレートを削除するには
  1. Amazon EC2 コンソールの [Launch templates] (起動テンプレート) ページを開きます。

  2. 起動テンプレート (TestAutoScalingEvent-template) を選択してから、[Actions] (アクション)、[Delete template] (テンプレートを削除) の順に選択します。

  3. 確認を求められたら、Delete を入力して指定した起動テンプレートの削除を確認し、[Delete] (削除) を選択します。

サンプル Auto Scaling グループでの作業が完了したら、グループを削除してください。作成した IAM ロールと許可ポリシーも削除できます。

Auto Scaling グループを削除するには
  1. Amazon EC2 コンソールの Auto Scaling グループページを開きます。

  2. Auto Scaling グループ (TestAutoScalingEvent-group) の横にあるチェックボックスをオンにして、[Delete] (削除) を選択します。

  3. 確認を求められたら、delete を入力して指定された Auto Scaling グループの削除を確認し、[Delete] (削除) を選択します。

    [Name (名前)] 列のロードアイコンに、Auto Scaling グループが削除されたことが示されます。インスタンスを終了してグループを削除するには数分かかります。

IAM ロールを削除するには
  1. IAM コンソールの [Roles (ロール)] ページを開きます。

  2. 関数のロール (TestAutoScalingEvent-role) を選択します。

  3. [削除] を選択します。

  4. 確認を求められたら、ロールの名前を入力し、[Delete] (削除) を選択します。

IAM ポリシーを削除するには
  1. IAM コンソールの [Policies (ポリシー)] ページを開きます。

  2. 作成したポリシーを選択します。(TestAutoScalingEvent-policy)

  3. [Actions] (アクション) で、[Delete] (削除) を選択します。

  4. 確認を求められたら、ポリシーの名前を入力し、[Delete] (削除) を選択します。