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 ドライバーのメトリック