CodeBuildで扱うIAMユーザの環境変数を使う時には注意が必要
Ko Yamaura
概要
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