こんにちわ、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 }}