logo

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

概要

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

Copyright © Ko Yamaura. All rights reserved.