😆
CloudShellのDockerでもAWS CLIしたい
CloudShellがDockerをサポートしました。
これでコンテナアプリの実行もヨシ!と思ったら
どうして動かないんですか?
$ docker run -it public.ecr.aws/aws-cli/aws-cli s3 ls
Unable to locate credentials. You can configure credentials by running "aws configure".
よくわからんが、こうすれば動いて ヨシ!
嘘です。解説は後で
一時的な認証情報を取得して
eval $(curl -s -H "X-aws-ec2-metadata-token: $AWS_CONTAINER_AUTHORIZATION_TOKEN" $AWS_CONTAINER_CREDENTIALS_FULL_URI \
| jq -r "[\"export AWS_ACCESS_KEY_ID=\" + .AccessKeyId, \"export AWS_SECRET_ACCESS_KEY=\" + .SecretAccessKey,\"export AWS_SESSION_TOKEN=\" + .Token] | .[]")
コンテナに環境変数として渡して実行する
docker run \
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \
public.ecr.aws/aws-cli/aws-cli s3 ls
と動きました
後片付け
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
どうして、動くんですか?
CloudShellは環境変数(トークン)をもとに、メタデータから一時的な認証情報を取得して権限を得ているようです
CloudShellでこんなコマンド叩くと認証情報が取得できる
curl -H "X-aws-ec2-metadata-token: $AWS_CONTAINER_AUTHORIZATION_TOKEN" \
-v $AWS_CONTAINER_CREDENTIALS_FULL_URI
コンテナ内からはこの認証情報を取得する仕組みが使えないので、代わりにコンテナの外で取得したものを環境変数としてコンテナに渡しています。
ちなみにトークン自体を渡すことも可能ですが、メタデータのエンドポイントと通信できなかったので諦めました
トークンを渡してもダメ
$ docker run \
> -e AWS_CONTAINER_AUTHORIZATION_TOKEN=$AWS_CONTAINER_AUTHORIZATION_TOKEN \
> -e AWS_CONTAINER_CREDENTIALS_FULL_URI=$AWS_CONTAINER_CREDENTIALS_FULL_URI \
> public.ecr.aws/aws-cli/aws-cli s3 ls
Error when retrieving credentials from container-role: Error retrieving metadata: Received error when attempting to retrieve container metadata: Could not connect to the endpoint URL: "http://localhost:1338/latest/meta-data/container/security-credentials"
参考
Discussion