こんにちわ、AWSエンジニアチームの山口です。
ビルドパイプラインにGitHub Actionsを利用することが増えていますが、社内共有用のメモを整理したのでブログ化します。
1. IAM IDプロバイダを作成
AWSマネージメントコンソールから、IAM へ移動します。「ID プロバイダ」を選択し、「プロバイダを追加」 をクリックします。
下記の通りに入力し、「サムプリントを取得」をクリックします。
- プロバイダのタイプ:
OpenID Connect
- プロバイダの URL :
https://token.actions.githubusercontent.com
- 対象者:
sts.amazonaws.com
「サムプリントを確認」が表示されたことを確認し、「プロバイダを追加」をクリックします。
IDプロバイダが追加されたことを確認します。
2. GitHub Actionsと連携するIAMロールを作成する
IAM から 「ロール」を選択し、「ロールを作成」をクリックします。
信頼されたエンティティタイプは、「カスタム信頼ポリシー」を選択します。 カスタム信頼ポリシーに下記のJSONをご自身の環境に合わせて修正し、入力します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/<GitHubリポジトリ名>:ref:refs/heads/<ブランチ名>" } } } ] }
今回は、developブランチに push もしくは merge された時に GitHub Actions で Orca Security Shift Left をビルドパイプラインに組み込むため、下記のような JSON を入力しました。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:masanoriyamaguchi/orca-shiftleft-sample:ref:refs/heads/develop" } } } ] }
入力後、画面下部にある「次へ」をクリックします。次の画面で「ポリシーを作成」をクリックします。
ポリシーエディタにてECRリポジトリにアクセスするためのIAMポリシーを設定します。下記のような JSON を入力します。実際に利用する際は、運用するビルドパイプラインにおいてGithub ActionとAWSの連携に必要な権限を設定してください。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ListImagesInRepository", "Effect": "Allow", "Action": [ "ecr:ListImages" ], "Resource": [ "arn:aws:ecr:<AWSリージョンID>:<AWSアカウントID>:repository/<ECRリポジトリ名>" ] }, { "Sid": "GetAuthorizationToken", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": "*" }, { "Sid": "ManageRepositoryContents", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:ListImages", "ecr:DescribeImages", "ecr:BatchGetImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:PutImage" ], "Resource": [ "arn:aws:ecr:<AWSリージョンID>:<AWSアカウントID>:repository/<ECRリポジトリ名>" ] } ] }
入力後、画面下部にある「次へ」をクリックします。次の画面で「ポリシー名」を入力し、「ポリシーの作成」クリックします。
以上でIAMの設定は完了です。
3. [おまけ]GitHub ActionsでAWSへの認証(OIDC)を行う
AWS IAMの設定は完了しましたが、実際に GitHub Actions で利用するには、ワークフローを作成する必要があります。 参考までにdockerイメージをビルドして、ECRリポジトリにpushするためのワークフローを記載します。
name: ecr push image on: push: branches: - develop jobs: push: runs-on: ubuntu-latest permissions: id-token: write contents: read steps: - uses: actions/checkout@v3 # AWS認証(OIDC)をするためのステップ - uses: aws-actions/configure-aws-credentials@v1 with: aws-region: "ap-northeast-1" # 作成したIAMロールのARNを記載 role-to-assume: "arn:aws:iam::123456789012:role/yamaguchi-test-guthub-role" - uses: aws-actions/amazon-ecr-login@v1 id: login-ecr # outputs で参照するために id を設定 - name: build and push docker image to ecr env: REGISTRY: ${{ steps.login-ecr.outputs.registry }} REPOSITORY: "yamaguchi-orca-shiftleft-ecr" IMAGE_TAG: ${{ github.sha }} run: | docker build . --tag ${{ env.REGISTRY }}/${{ env.REPOSITORY }}:${{ env.IMAGE_TAG }} docker push ${{ env.REGISTRY }}/${{ env.REPOSITORY }}:${{ env.IMAGE_TAG }}