😆

CloudShellのDockerでもAWS CLIしたい

2024/01/22に公開

https://aws.amazon.com/jp/about-aws/whats-new/2024/01/aws-cloudshell-docker-13-regions/

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"

参考

https://qiita.com/moritalous/items/8a548ce1743b0b4f8b6d
https://repost.aws/ja/knowledge-center/codebuild-temporary-credentials-docker
https://docs.aws.amazon.com/cloudshell/latest/userguide/tutorial-presigned-url.html
https://docs.docker.jp/machine/drivers/aws.html

Discussion