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

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

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

困っていた内容

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サイトをご覧ください。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.