EC2 内の Docker コンテナで IAM ロール認証情報を利用する方法を教えてください

EC2 にアタッチした IAM ロールの認証情報を、EC2 内の Docker コンテナから利用する方法をご紹介します。
2023.11.01

困っていた内容

EC2 インスタンスに IAM ロールをアタッチし、インスタンスプロファイル認証情報を利用していますが、EC2 内にインストールした Docker 上のコンテナアプリケーションからも IAM ロールの認証情報を利用したい要件があります。実現する方法を教えてください。

どう対応すればいいの?

対象 EC2 インスタンスの HttpPutResponseHopLimit という属性を変更することで、EC2 内の Docker コンテナ上からも IAM ロールの認証情報を取得できるようになります。

まずは対象インスタンスに対して ec2 describe-instances コマンドを実行し、現在の設定を確認します。
初期状態では HttpPutResponseHopLimit が 1 になっているはずです。

コマンド例

$ aws ec2 describe-instances --instance-id [インスタンスID] --region [リージョン名] --query "Reservations[*].Instances[*].MetadataOptions"
[
    [
        {
            "State": "applied", 
            "HttpEndpoint": "enabled", 
            "HttpTokens": "optional", 
            "HttpPutResponseHopLimit": 1
        }
    ]
]

そこで、 ec2 modify-instance-metadata-options コマンドで HttpPutResponseHopLimit の値を 2 に変更します。

コマンド例

$ aws ec2 modify-instance-metadata-options  --instance-id [インスタンスID] --region [リージョン名] --http-put-response-hop-limit 2 --http-endpoint enabled
{
    "InstanceId": "i-xxxxxxxxxx", 
    "InstanceMetadataOptions": {
        "State": "pending", 
        "HttpEndpoint": "enabled", 
        "HttpTokens": "optional", 
        "HttpPutResponseHopLimit": 2
    }
}

以上の設定で、EC2 上の Docker コンテナからも IAM ロールの認証情報を利用できるようになります。

やってみた

実際に検証してみました。実施した内容は以下の通りです。

  • Amazon Linux 2 の EC2 インスタンスを起動し、EC2 の操作権限が付与された IAM ロールをアタッチする。
  • EC2 内で IAM ロールの認証情報が取得できていることを確認し HttpPutResponseHopLimit の設定を変更する。
  • EC2 内にインストールした Docker 上で Amazon Linux 2 のコンテナを起動し、コンテナ内の OS でも IAM ロールの認証情報が取得できていることを確認する。

まずは Amazon Linux 2 の EC2 インスタンスを起動し AmazonEC2FullAcccess のポリシーが付与された IAM ロールをアタッチします。 IAM ロール名は "test-ec2-role" とします。

対象 EC2 インスタンスに SSH 接続し aws sts get-caller-identity コマンドを実行します。 アタッチした IAM ロール が認証情報として使用されているのを確認します。

続いて先述の aws ec2 modify-instance-metadata-options コマンドを EC2 インスタンス自身に対して実行し HttpPutResponseHopLimit の値を 2 に設定します。

$ aws ec2 modify-instance-metadata-options  --instance-id [インスタンスID] --region [リージョン名] --http-put-response-hop-limit 2 --http-endpoint enabled
{
    "InstanceId": "i-xxxxxxxxxx", 
    "InstanceMetadataOptions": {
        "State": "pending", 
        "HttpEndpoint": "enabled", 
        "HttpTokens": "optional", 
        "HttpPutResponseHopLimit": 2
    }
}

ここまでできたら、次は EC2 に Docker をインストールします。
ここでは説明を省略しますが、筆者は文末の参考資料[1]を参考にしました。

Docker をインストールできたら、Amazon Linux 2 のコンテナを起動し、コンテナ内で AWS CLI のインストールを実行します。 (EC2 側の Amazon Linux 2 には AWS CLI が最初から入っていますが、Docker コンテナで起動した Amazon Linux 2 には AWS CLI が入っていないため、インストールが必要になります)

(EC2 内で実行) Docker コンテナ起動

$ docker run -it amazonlinux:2

(Dockerコンテナ内で実行) AWS CLI のインストールとバージョン確認

$ yum install unzip less
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ ./aws/install
$ aws --version

コンテナ内で AWS CLI をインストールできたら、今度はコンテナ内で aws sts get-caller-identity コマンドを実行します。
先ほど EC2 側で確認したのと同じ IAM ロール認証情報が表示されていれば、コンテナ内でも IAM ロールの認証情報が使用できる状態になっています。
aws ec2 describe-instances などの CLI コマンドが実行できることも確認してみましょう。

以上、EC2 内の Docker コンテナ上で IAM ロール認証情報を使用するまでの手順をご紹介しました。
この情報がどなたかのお役に立てば幸いです!

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。