例: AMI 作成インデックス値 - Amazon Elastic Compute Cloud

例: AMI 作成インデックス値

この例は、ユーザーデータおよびインスタンスメタデータの両方を使用してインスタンスを設定する方法を示しています、

注記

このセクションの例では、IMDS の IPv4 アドレス 169.254.169.254 を使用します。IPv6 アドレスを使用して EC2 インスタンスのインスタンスメタデータを取得する場合は、IPv6 アドレスを有効にして使用してください。[fd00:ec2::254]。IMDS の IPv6 アドレスは、IMDSv2 コマンドと互換性があります。IPv6 アドレスは、AWS Nitro System 上に構築されたインスタンスでのみアクセス可能です。

この例で、Alice はお気に入りのデータベース AMI の 4 つのインスタンスを起動します。最初のインスタンスを元のインスタンスとし、残りの 3 つをレプリカとします。これらのインスタンスの起動時に、レプリケーション戦略に関するユーザーデータを各レプリカに追加します。このデータはすべての 4 つのインスタンスで使用可能となるので、どの部分が各インスタンスに該当するかをそれぞれが認識できるように、ユーザーデータを構築する必要があります。この構築は、各インスタンスに対して一意となる ami-launch-index インスタンスメタデータ値を使用して行うことができます。同時に複数のインスタンスを起動する場合、ami-launch-index はインスタンスが起動された順序を示します。最初に起動されたインスタンスの値は 0 で示されます。

Alice が構築したユーザーデータを次に示します。

replicate-every=1min | replicate-every=5min | replicate-every=10min

replicate-every=1min データは最初のレプリカの設定を定義し、replicate-every=5min は 2 番目のレプリカの設定を定義します。以下、同様に設定を定義します。Alice は、個別のインスタンスのデータをパイプシンボル (|) で区切って、このデータを ASCII 文字列として指定することにしました。

Alice は、run-instancesコマンドを使用して 4 つのインスタンスを起動します。このとき、次のユーザーデータを指定します。

aws ec2 run-instances \ --image-id ami-0abcdef1234567890 \ --count 4 \ --instance-type t2.micro \ --user-data "replicate-every=1min | replicate-every=5min | replicate-every=10min"

起動したすべてのインスタンスに、ユーザーデータのコピーと次に示す一般的なメタデータが含まれています。

  • AMI ID: ami-0abcdef1234567890

  • 予約 ID: r-1234567890abcabc0

  • パブリックキー: none

  • セキュリティグループ名: default

  • インスタンスタイプ: t2.micro

ただし、各インスタンスには所定の一意のメタデータが含まれます。

インスタンス 1
メタデータ
instance-id i-1234567890abcdef0
ami-launch-index 0
public-hostname ec2-203-0-113-25.compute-1.amazonaws.com
public-ipv4 67.202.51.223
local-hostname ip-10-251-50-12.ec2.internal
local-ipv4 10.251.50.35
インスタンス 2
メタデータ
instance-id i-0598c7d356eba48d7
ami-launch-index 1
public-hostname ec2-67-202-51-224.compute-1.amazonaws.com
public-ipv4 67.202.51.224
local-hostname ip-10-251-50-36.ec2.internal
local-ipv4 10.251.50.36
インスタンス 3
メタデータ
instance-id i-0ee992212549ce0e7
ami-launch-index 2
public-hostname ec2-67-202-51-225.compute-1.amazonaws.com
public-ipv4 67.202.51.225
local-hostname ip-10-251-50-37.ec2.internal
local-ipv4 10.251.50.37
インスタンス 4
メタデータ
instance-id i-1234567890abcdef0
ami-launch-index 3
public-hostname ec2-67-202-51-226.compute-1.amazonaws.com
public-ipv4 67.202.51.226
local-hostname ip-10-251-50-38.ec2.internal
local-ipv4 10.251.50.38

Alice は ami-launch-index 値を使用して、ユーザーデータのどの部分が特定のインスタンスに該当するかを判断できます。

  1. いずれかのインスタンスに接続し、そのインスタンスの ami-launch-index を取得して、それがレプリカの 1 つであることを確認します。

    IMDSv2
    [ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/meta-data/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-launch-index 2

    次のステップでは、IMDSv2が前のIMDSv2コマンドからの保管済みトークン (期限内であると仮定) を使用するようリクエストします。

    IMDSv1
    [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-launch-index 2
  2. 変数としてami-launch-indexを保存します。

    IMDSv2
    [ec2-user ~]$ ami_launch_index=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-launch-index`
    IMDSv1
    [ec2-user ~]$ ami_launch_index=`curl http://169.254.169.254/latest/meta-data/ami-launch-index`
  3. ユーザーデータを変数として保存します。

    IMDSv2
    [ec2-user ~]$ user_data=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data`
    IMDSv1
    [ec2-user ~]$ user_data=`curl http://169.254.169.254/latest/user-data`
  4. 最後に、Alice はcutコマンドを使用して、そのインスタンスに該当するユーザーデータの部分を抽出します。

    IMDSv2
    [ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index" replicate-every=5min
    IMDSv1
    [ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index" replicate-every=5min