

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# チュートリアル: データスクリプトとインスタンスメタデータを使用してライフサイクル状態を取得する
<a name="tutorial-lifecycle-hook-instance-metadata"></a>

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

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

次の図は、ユーザーデータスクリプトを使用してカスタムアクションを実行する際のスケールアウトイベントのフローをまとめたものです。インスタンスが起動した後、タイムアウトまたは Amazon EC2 Auto Scaling が続行のシグナルを受信することによってライフサイクルフックが完了するまで、インスタンスのライフサイクルは一時停止されます。

![\[ユーザーデータスクリプトを使用してカスタムアクションを実行する場合のスケールアウトイベントのフロー。\]](http://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/images/lifecycle-hook-user-data-script.png)


**Topics**
+ [

## ステップ 1: ライフサイクルアクションを完了するための許可を持つ IAM ロールを作成する
](#instance-metadata-create-iam-role)
+ [

## ステップ 2: 起動テンプレートを作成して IAM ロールとユーザーデータスクリプトを含める
](#instance-metadata-create-hello-world-function)
+ [

## ステップ 3: Auto Scaling グループを作成する
](#instance-metadata-create-auto-scaling-group)
+ [

## ステップ 4: ライフサイクルフックを追加する
](#instance-metadata-add-lifecycle-hook)
+ [

## ステップ 5: 機能をテストして検証する
](#instance-metadata-testing-hook)
+ [

## ステップ 6: クリーンアップする
](#instance-metadata-lifecycle-hooks-tutorial-cleanup)
+ [

## 関連リソース
](#instance-metadata-lifecycle-hooks-tutorial-related-resources)

## ステップ 1: ライフサイクルアクションを完了するための許可を持つ IAM ロールを作成する
<a name="instance-metadata-create-iam-role"></a>

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

**ポリシーを作成するには**

1. IAM コンソールの [[ポリシーページ](https://console.aws.amazon.com/iam/home?#/policies)] を開き、[**ポリシーの作成**] を選択します。

1. **JSON** タブを選択します。

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

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "autoscaling:CompleteLifecycleAction"
         ],
         "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/TestAutoScalingEvent-group"
       }
     ]
   }
   ```

------

1. [**次へ**] を選択します。

1. [**ポリシー名**] に「**TestAutoScalingEvent-policy**」と入力します。[**ポリシーの作成**] を選択します。

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

**ロールを作成するには**

1. 左側のナビゲーションペインで、[**Roles**] を選択します。

1. [**ロールの作成**] を選択してください。

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

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

1. **[Add permissions]** (許可を追加) で、作成したポリシー (**[TestAutoScalingEvent-policy]**) を選択します。その後、**[Next]** を選択します。

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

## ステップ 2: 起動テンプレートを作成して IAM ロールとユーザーデータスクリプトを含める
<a name="instance-metadata-create-hello-world-function"></a>

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

**起動テンプレートを作成するには**

1. Amazon EC2 コンソールの[起動テンプレートページ](https://console.aws.amazon.com/ec2/v2/#LaunchTemplates)を開きます。

1. [**起動テンプレートの作成**] を選択してください。

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

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

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

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

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

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

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

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

   ```
   #!/bin/bash
   
   function token {
       echo "X-aws-ec2-metadata-token: $(curl -X PUT 'http://169.254.169.254/latest/api/token' -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600')"
   }
   
   function get_target_state {
       echo $(curl -H "$(token)" -s http://169.254.169.254/latest/meta-data/autoscaling/target-lifecycle-state)
   }
   
   function get_instance_id {
       echo $(curl -H "$(token)" -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 に通知する

1. [**起動テンプレートの作成**] を選択してください。

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

**注記**  
ユーザーデータスクリプトを開発する際の参考として使用できるその他の例については、Amazon EC2 Auto Scaling の [GitHub リポジトリ](https://github.com/aws-samples/amazon-ec2-auto-scaling-group-examples)を参照してください。

## ステップ 3: Auto Scaling グループを作成する
<a name="instance-metadata-create-auto-scaling-group"></a>

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

**Auto Scaling グループを作成する**

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

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

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

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

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

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

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

## ステップ 4: ライフサイクルフックを追加する
<a name="instance-metadata-add-lifecycle-hook"></a>

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

**ライフサイクルフックを追加するには**

1. Amazon EC2 コンソールで [Auto Scaling グループのページ](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)を開きます。

1. Auto Scaling グループの横にあるチェックボックスを選択します。ページの下部にスプリットペインが開きます。

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

1. スケールアウト (インスタンスが起動) のライフサイクルフックを定義するには、以下を実行してください。

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

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

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

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

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

1. **[作成]** を選択します。

## ステップ 5: 機能をテストして検証する
<a name="instance-metadata-testing-hook"></a>

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

**Auto Scaling グループのサイズを増やすには**

1. Amazon EC2 コンソールで [Auto Scaling グループのページ](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)を開きます。

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

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

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

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

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

**スケーリングを表示するには**

1. [**Auto Scaling グループ**] ページに戻り、グループを選択します。

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

1. ユーザーデータスクリプトが失敗した場合は、タイムアウト期間が過ぎたときに、ステータスが `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: クリーンアップする
<a name="instance-metadata-lifecycle-hooks-tutorial-cleanup"></a>

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

**ライフサイクルフックを削除するには**

1. Amazon EC2 コンソールで [Auto Scaling グループのページ](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)を開きます。

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

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

1. **[アクション]**、**[削除]** の順に選択します。

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

**起動テンプレートを削除するには**

1. Amazon EC2 コンソールの[起動テンプレートページ](https://console.aws.amazon.com/ec2/v2/#LaunchTemplates)を開きます。

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

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

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

**Auto Scaling グループを削除するには**

1. Amazon EC2 コンソールで [Auto Scaling グループのページ](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)を開きます。

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

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

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

**IAM ロールを削除するには**

1. IAM コンソールの [[Roles (ロール)] ページ](https://console.aws.amazon.com/iam/home?#/roles)を開きます。

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

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

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

**IAM ポリシーを削除するには**

1. IAM コンソールの[ポリシー](https://console.aws.amazon.com/iam/home?#/policies)ページを開きます。

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

1. **[アクション]**、**[削除]** の順に選択します。

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

## 関連リソース
<a name="instance-metadata-lifecycle-hooks-tutorial-related-resources"></a>

以下の関連トピックは、インスタンスメタデータで利用可能なデータに基づいてインスタンスに対してアクションを呼び出すコードを開発する際に役立ちます。
+ [インスタンスメタデータを使用してターゲットライフサイクル状態を取得する](retrieving-target-lifecycle-state-through-imds.md). このセクションでは、インスタンスの終了など、他のユースケースのライフサイクルステータスについて説明します。
+ [ライフサイクルフックを追加する (コンソール)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-console). この手順では、スケールアウト (インスタンスの起動) とスケールイン (インスタンスの終了またはウォームプールへの復帰) の両方にライフサイクルフックを追加する方法を示します。
+ 「*Amazon EC2 ユーザーガイド*」の「[インスタンスメタデータのカテゴリ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-categories)」 このトピックでは、EC2 インスタンスでアクションを呼び出すために使用できるインスタンスメタデータのすべてのカテゴリを一覧表示します。

Amazon EventBridge を使用して Auto Scaling グループのインスタンスで発生するイベントに基づいて Lambda 関数を呼び出すルールを作成する方法を示すチュートリアルについては、「[チュートリアル:Lambda 関数を呼び出すライフサイクルフックの設定](tutorial-lifecycle-hook-lambda.md)」を参照してください。