EC2のインスタンスメタデータサービスについて設定方法をまとめてみた

2023.01.13

こんにちは、コンサル部@大阪オフィスのTodaです。

先日久々にEC2のインスタンスメタデータサービス(IMDS)について案件で操作する機会があり 複数ページをみて問題解決をしたので復習も兼ねてまとめてみました。

EC2インスタンスメタデータサービス(IMDS)とは?

IMDSはEC2内から実行中のインスタンスの設定情報を取得できる仕組みになります。
上記を利用する事でスクリプト内でインスタンスIDなどを取得して利用することができます。
取得可能な情報は下記リストを参照ください。

■ インスタンスメタデータのカテゴリ
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-data-categories.html#dynamic-data-categories

バージョン1と2について

IMDSにはバージョン1と2があり取得方法が変わります。
バージョン1は「169.254.169.254」のリンクローカルIPで動作していて仕組みに curlコマンド等を利用してアクセスする事でインスタンス情報を照会する事が可能です。

# 取得可能なリスト出力
$ curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
~~ 以下略 ~~
services/

# インスタンスIDを出力
$ curl http://169.254.169.254/latest/meta-data/instance-id
i-xxxxxxxxxxxxxx

バージョン2は上記照会をURLだけでなくトークンを合わせて利用する事でセキュリティ強化をした仕組みになります。
なぜバージョン2が用意されたかのわかりやすい記事が別途ございますので参照頂けたらと思います。

バージョン2でインスタンス情報を照会する場合は、事前にトークンの取得をおこないに「X-aws-ec2-metadata-token」ヘッダーにトークンを付与して照会をおこないます。
※トークンの有効期限は仮で6時間(21,600秒)にしています。

# 照会用のトークン取得
TOKEN=`curl -X PUT "http://169.254.169.254/latest/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-id
ami-launch-index
~~ 以下略 ~~
services/

# インスタンスIDを出力
$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id
i-xxxxxxxxxxxxxx

IMDSの設定について

IMDSの利用有無 または 利用バージョンの設定はインスタンスを新規作成する場合と、既存インスタンスの設定を変更する場合でかわります。

インスタンスを新規作成する場合

EC2のインスタンスを新規作成する際に設定項目の高度な詳細から [アクセス可能なメタデータ]と[メタデータのバージョン]の値を変更頂く事で設定可能です。

■ 入力項目の値

  • アクセス可能なメタデータ
    • 有効
    • 無効
  • メタデータのバージョン
    • V1およびV2 (トークンはオプション)
    • V2のみ (トークンは必須)

デフォルトの設定の場合は
IMDSの利用は「有効」で「バージョン1と2」が利用可能にて設定が行われます。
設定をいただきインスタンスの新規作成を頂く事で設定が完了します。

インスタンスを新規作成する場合

既存インスタンスの設定を変更する場合

作成済みのインスタンスのIMDSを変更する場合は、マネージメントコンソールでの設定ができずAWSコマンドラインインターフェイス(CLI)を利用して対応する必要がございます。
まず、既存の設定確認をおこない変更操作をおこなうと思いますので各コマンドをご紹介いたします。

対象インスタンスの設定確認

下記コマンドにてインスタンス情報を参照する事でIMDSの設定が把握できます。

$ aws ec2 describe-instances \
	--instance-id (インスタンスID) \
	--query "Reservations[*].Instances[*].MetadataOptions"
[
    [
        {
            "State": "applied",
            "HttpTokens": "optional",
            "HttpPutResponseHopLimit": 1,
            "HttpEndpoint": "enabled",
            "HttpProtocolIpv6": "disabled",
            "InstanceMetadataTags": "disabled"
        }
    ]
]
  • IMDSが有効でバージョン1,2が利用できる場合
    • HttpTokens: optional
    • HttpEndpoint: enabled
  • IMDSが有効でバージョン2のみ利用できる場合
    • HttpTokens: required
    • HttpEndpoint: enabled
  • IMDSが無効の場合
    • HttpTokens: optional または required
    • HttpEndpoint: disabled

対象インスタンスをバージョン2のみに制限する場合 (IMDSの有効化も含む)

IMDSの取得をトークンが必要なバージョン2に制限する場合は、下記コマンドを実行します。
実行をした時点でサーバの再起動等は必要なく設定が反映されます。

$ aws ec2 modify-instance-metadata-options \
  --instance-id (インスタンスID) \
  --http-tokens required \
  --http-endpoint enabled

対象インスタンスをバージョン1.2両方を利用する場合 (IMDSの有効化も含む)

IMDSの取得をバージョン1,2両方でできるようにする場合、下記コマンドを実行します。
実行をした時点でサーバの再起動等は必要なく設定が反映されます。

$ aws ec2 modify-instance-metadata-options \
  --instance-id (インスタンスID) \
  --http-tokens optional \
  --http-endpoint enabled

IMDSを無効化する場合

IMDSの取得を無効化する場合は、下記コマンドを実行します。
実行をした時点でサーバの再起動等は必要なく設定が反映されます。

$ aws ec2 modify-instance-metadata-options \
  --instance-id (インスタンスID) \
  --http-endpoint disabled

IMDSを変更頂く際の注意点

IMDSはサーバ内に導入されているソフトウェアで利用されている場合があり、
「バージョン1から2」、「バージョン1から無効」にした場合に制限が掛かる場合がございます。

例で、「IMDSを無効化」頂いた場合、EC2に設定されているIAMロールの認証情報が受け渡しできず SystemsManagerやS3、CloudWatchなどのAWSリソースへの接続ができなくなります。 上記は、IAMロールがIMDSを利用して認証情報を渡しているためです。

■ Amazon EC2 の IAM ロール
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html

インスタンスのアプリケーションは、インスタンスメタデータアイテム iam/security-credentials/role-name のロールから提供されたセキュリティ認証情報を取得します。 アプリケーションには、ロールに関連付けられたセキュリティ認証情報によって、ロールに対して定義したアクションおよびリソースのアクセス許可が付与されます。これらのセキュリティ認証情報は一時的なものであり、私たちが自動的に循環させます。 新しい認証情報は、古い認証情報が失効する少なくとも 5 分前から有効になるようにします。

または他社開発のシステム(例:TREND MICRO Deep Security)などでもIMDSを無効にした場合、 一部タスクの失敗や機能制限がございます。

■ Deep Security AgentはAmazonインスタンスメタデータサービスをどのように使用しますか
https://help.deepsecurity.trendmicro.com/20_0/on-premise/ja-jp/instance-metadata-support.html

そのため、「IMDSをバージョン2のみ」または「IMDSを無効」に設定頂く場合は、導入されているソフトで 影響がないかをご確認いたうえで設定いただくのが必要でございます。

また、IMDSのバージョン1の利用はCloudWatchのEC2メトリック「MetadataNoToken」にて
参照している量を把握する事が出来ますのでIMDS設定変更前の確認に活用できそうです。

IMDSが参照できない時の確認について

curl等を利用してインスタンス情報を照会をした場合に、エラーで取得ができない場合がございます。
表示されるエラーからいくつか確認した方が良い箇所をご案内いたします。

401 - Unauthorizedが表示される場合

401エラーはIMDSのバージョンが2に制限されている状態でバージョン1の呼び出しをする事で表示されるケースがございます。
呼び出し元の仕組みがトークンを利用するようになっているか または 設定でバージョン1が呼び出し可能になっているかをご確認ください。

403 - Forbiddeが表示される場合

403エラーはインスタンスメタデータのエンドポイントへの接続ができない場合に表示されるケースがございます。
IMDSの設定が無効になっていないかのご確認ください。

Connection timed out

タイムアウトをする場合はインスタンスに導入されているウィルス対策のファイアウォールにて遮断されている可能性がございます。
また、AMIからWindows Server 2016をリストアした場合で一部ルーティング情報が古いままになり、Connection timed outするケースもございます。 ルーティング情報が古い場合は下記記事を参照いただき対策を試しください。

さいごに

今回は EC2のインスタンスメタデータサービスについてまとめてみたした。
久々のIMDS操作だったため、色々ハマる点がありまとめさせていただきました。
少しでもお客様の参考になればと考えております。