🐙

Bitbucket Pipelines OpenID Connectを使用してECRにpushする

2022/01/25に公開

概要

2021/11 に GitHub Actions の OpenID Connect (OIDC) サポートが正式にアナウンスされた。

会社ではGithubではなく、Bitbucketを利用している。
Bitbucketでも同じことが出来ないか?と調べた所、2021/3には既にサポートされていた。

https://bitbucket.org/blog/bitbucket-pipelines-and-openid-connect-no-more-secret-management

長時間有効なクラウドプロバイダのシークレットを利用するのはセキュリティのリスクが高くなるので、Bitbucket Pipelines OpenID Connectを利用して、ECRにpushしてみる。

OIDC identity providerの情報を確認する

Bitbucket > Pipelines > OpenID Connect
からOIDC identity providerの情報を確認する。
この情報を元に、クラウドプロバイダを設定する。

OpenID Connect画面

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が用意されているので活用する。

https://bitbucket.org/product/features/pipelines/integrations?p=atlassian/aws-ecr-push-image

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