CodeBuildで扱うIAMユーザの環境変数を使う時には注意が必要

By Ko Yamaura at

概要

CodeBuild で IAM ユーザを環境変数から追加していたがそれが docker コマンドの実行ユーザとして検知されてしまったときの対応を紹介します。

CodeBuild 内で ECR のリポジトリに対して Docker コマンドの pull/push を実行すると認証周りでエラーになります。

$ docker pull XXXXXX // XXXXXX is ECR repository URL
....
....
no basic auth credentials

調査

まず、CodeBuild に紐づく IAMRole がありますが、それで ECR への push/pull の許可を行なっているかを確認します。 ここの時点で以下の Policy での許可がありましたので特に問題なさそうでした。

  - ecr:GetAuthorizationToken
  - ecr:GetDownloadUrlForLayer
  - ecr:BatchGetImage
  - ecr:BatchCheckLayerAvailability
  - ecr:PutImage
  - ecr:InitiateLayerUpload
  - ecr:UploadLayerPart
  - ecr:CompleteLayerUpload

pull/push 先の ECR への CodeBuild からのアクセスは許可されているので、あとは docker ユーザがどのようなユーザを使っているかを確認します。すると docker push コマンド実行時にエラーにユーザ名が表示されていました。

docker login denied: User: arn:aws:iam:XXXX:user/yyyy is not authorized to perform: ecr BatchGetImage on resource: arn:aws:ecr:xxxxx

この yyyy ユーザについて調査したところ、別の目的で利用している IAM ユーザで、このユーザを docker コマンド実行時に誤ってユーザとして認知されているみたいです。

このユーザは CodeBuild で環境変数に

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY

の二つの環境変数を追加することで IAM ユーザとして動作するようにしていました。 こちらを一時的に別の名前に変更して再度ビルドするとこの yyyy ユーザは利用されず、無事に docker push コマンドで ECR への push が成功しました。

結論

CodeBuild で

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY

を環境変数にセットする場合、docker コマンドのユーザとして検知されてしまうので、別の名前で利用するなど工夫が必要

参考

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker.html