EC2 Linux インスタンスのインスタンスメタデータの問題をトラブルシューティングする方法を教えてください。

所要時間2分
0

Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスからインスタンスメタデータを取得できません。

簡単な説明

インスタンスメタデータは、インスタンス ID、パブリック IP アドレスとプライベート IP アドレス、セキュリティグループ、AWS Identity and Access Management (IAM) ロールなどの EC2 インスタンスに関する情報です。インスタンスメタデータは、169.254.169.254 への HTTP リクエストを通じてインスタンスに公開されます。

インスタンスメタデータサービス (IMDS) からインスタンスメタデータを取得するときに、次の問題が発生する可能性があります。

  • HTTP リクエストエラー
  • プロキシ設定
  • ローカルファイアウォールルール
  • リクエストスロットリング

解決方法

HTTP リクエストエラー

インスタンスメタデータを取得するための HTTP リクエストを行うと、次の HTTP エラーコードが返されることがあります。

HTTP 404 - Not Found

HTTP 404 エラーは IMDS v1 にも適用されます。このエラーは、要求されたリソースが使用できない場合に発生します。正しい URL を使用していることを確認してください。

400 - Bad Request

400 - Bad Request エラーは IMDS v2 に適用されます。このエラーは、PUT リクエストが無効な場合に発生します。

401 - Unauthorized

**401-Unauthorized ** エラーは、GET リクエストで無効なトークンが使用された場合に発生します。その場合は、新しいトークンを生成してください。

403 - Forbidden

403-Forbidden エラーは、リクエストが許可されていないか、IMDS がオフになっている場合に発生します。次のコマンドを実行して、IMDS のステータスを確認してください。次のコマンド例では、your_instance_ID をユースケースに適した値に置き換えてください。

$ aws ec2 describe-instances -instance-ids  -query 'Reservations[].Instances[].MetadataOptions'

以下は、前述のコマンドの出力例です。

[
  {
    "State": "applied",
    "HttpTokens": "optional",
    "HttpPutResponseHopLimit": 1,
    "HttpEndpoint": "disabled",
    "HttpProtocolIpv6": "disabled",
    "InstanceMetadataTags": "disabled"
  }
]

コマンドオプションで HttpEndpoint がオフになっていることが示されたら、次のコマンドを実行します。

aws ec2 modify-instance-metadata-options \
    --instance-id  \
    --http-endpoint enabled

プロキシ設定

プロキシを使用してインターネットにアクセスする場合は、IMDS IP アドレス (169.254.169.254) を除外する必要があります。IMDS IP アドレスが除外されていない場合、インスタンスのメタデータを取得できない可能性があります。

IMDS IP アドレスをプロキシ使用から除外するには、NO_PROXY 環境変数に次のアドレスを設定します。

export NO_PROXY=169.254.169.254

ローカルファイアウォールルール

インスタンス内のファイアウォールにより、一部またはすべてのプロセスが IMDS にアクセスできない場合があります。

インスタンスのオペレーティングシステムのファイアウォールが、インスタンスのメタデータ IP アドレスへの送信トラフィックをブロックしていないことを確認してください。ファイアウォールには、iptables、UFW (単純なファイアウォール) などがあります。

iptables のファイアウォールルールを確認するには、次のコマンドを使用します。

sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
REJECT     tcp  --  anywhere             169.254.169.254      owner UID match 1000-10000 reject-with icmp-port-unreachable

iptables リストの結果にメタデータの取得が拒否された場合は、次のエラーが表示されることがあります。

$ curl http://169.254.169.254/latest/meta-data/
curl: (7) Failed to connect to 169.254.169.254 port 80 after 0 ms: Connection refused

このエラーを解決するには、次のコマンドを実行してルールを削除します。

$ sudo iptables -D OUTPUT -proto tcp -destination 169.254.169.254 -match owner -uid-owner 1000-10000 -jump REJECT

リクエストスロットリング

IMDS へのトラフィックは、1 秒あたりのパケット数に基づいて調整されます。また、インスタンスにアタッチされる Elastic Network Interface 1 つにつき 1024 PPS という制限があります。IMDS サービスへの PPS レートが 1024 PPS を超える場合、リクエストはスロットリングされます。

スロットリングが発生した場合は、指数関数的バックオフ戦略を使用してリクエストを再試行してください。

EC2 インスタンスがスロットリング制限に達する頻度を確認するには、Elastic Network Interface ドライバーの linklocal_allowance_exceeded メトリックを確認してください。このメトリックは、ローカルプロキシサービスへのトラフィックによってシェーピングされたパケットの数が、ネットワークインターフェイスの最大数を超えていることを示します。

以下のコマンドを実行すると、linklocal_allowance_exceeded メトリックが表示されます。

$ ethtool -S <Network-Interface>
eg: $ ethtool -S eth0

関連情報

Amazon EC2 インスタンスでプロキシを使用する

インスタンスメタデータの取得例

IMDS アクセスを制限する

クエリのスロットリング

ENA ドライバーのメトリック

AWS公式
AWS公式更新しました 10ヶ月前
コメントはありません

関連するコンテンツ