🐙
Bitbucket Pipelines OpenID Connectを使用してECRにpushする
概要
2021/11 に GitHub Actions の OpenID Connect (OIDC) サポートが正式にアナウンスされた。
会社ではGithubではなく、Bitbucketを利用している。
Bitbucketでも同じことが出来ないか?と調べた所、2021/3には既にサポートされていた。
長時間有効なクラウドプロバイダのシークレットを利用するのはセキュリティのリスクが高くなるので、Bitbucket Pipelines OpenID Connectを利用して、ECRにpushしてみる。
OIDC identity providerの情報を確認する
Bitbucket > Pipelines > OpenID Connect
からOIDC identity providerの情報を確認する。
この情報を元に、クラウドプロバイダを設定する。
AWS設定
IDプロバイダの設定
IAM > IDプロバイダ
から以下を設定する。
設定項目 | 設定値 |
---|---|
プロバイダのタイプ | OpenID Connect |
プロバイダのURL | Bitbucketで表示されたIdentity provider URL |
対象者 | Bitbucketで表示されたAudience |
IAMポリシーの作成
認証トークンの取得と ECR レジストリへのアクセスを許可するポリシーを作成する。
iam-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetAuthorizationToken",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken"
],
"Resource": "*"
},
{
"Sid": "AllowPushImage",
"Effect": "Allow",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
"Resource": "arn:aws:ecr:ap-northeast-1:<AWSアカウントID>:repository/*"
}
]
}
IAMロールの作成
信頼されたエンティティの種類はウェブIDを選択し、先程追加したウェブIDプロバイダを選択する。
定義したIAMポリシーを選択し、ロールを作成する。
Bitbucket Pipelinesの作成
ECRにpushを簡単にできるようにBitbucket Pipeが用意されているので活用する。
bitbucket-pipelines.yml
image: atlassian/default-image:4
definitions:
script: &ecrScript
- cd $BITBUCKET_CLONE_DIR
- docker build -t ${IMAGE_NAME} -t ${IMAGE_NAME}:build-${BITBUCKET_BUILD_NUMBER} .
- |
if [ -n "$BITBUCKET_TAG" ]; then
docker build -t ${IMAGE_NAME}:${BITBUCKET_TAG} .
fi
- pipe: atlassian/aws-ecr-push-image:2.3.0
variables:
AWS_OIDC_ROLE_ARN: "<作成したIAM RoleのARN>"
IMAGE_NAME: <IMAGE NAME>
TAGS: "${BITBUCKET_TAG} build-$BITBUCKET_BUILD_NUMBER latest"
pipelines:
custom:
build-custom:
- step:
name: Deploy to ECR
services:
- docker
oidc: true
script: *ecrScript
作成したBitbucket Piplinesを実行して、正常にPush出来る事を確認。
まとめ
Bitbucketでも、OIDCは、手軽に使える。
シークレット管理の悩みを軽減できるので、積極的に利用していきたい。
参考URL
2024/03/22追記
atlassian/aws-ecr-push-image
の仕様が2.0.0から変更になった。
major: Breaking change: Refactored the logic of how pipe push images. Now you have to build images with all tags you want to push to ecr before pipe call.
今までは、TAGSに指定していたTAGを自動で作成してくれていたが、予めTAGを作成しておく必要がある。
Discussion