はじめに
AWSのリソースに対する認証は、OpenID Connect (OIDC)を使用し、GitHub ActionsでDockerをビルドしてECRにPushした時のメモ。
前提
- ECRのリポジトリは作成済であること
- GitHubのルートリポジトリにDockerfileを登録してあること
ざっくりした流れ
以下の順に作業を行った。
- IAMからIDプロバイダを作成
- IAMロールを作成する
- IAMポリシーを作成してIAMロールにアタッチ
- GitHub Actionsのワークフローを作成
IAMからIDプロバイダを作成
プロバイダのタイプで、OpenID Connectを選択し、
- プロバイダのURLには、 https://token.actions.githubusercontent.com を指定する
- 対象者には sts.amazonaws.com を指定する
作成したIDプロバイダのARNはメモしておく。
IAMロールを作成する
カスタム信頼ポリシーにJsonを張り付ける。
作成したロールのARNはメモしておく。
{
"Version": "2012-10-17",
"Statement":
{
"Effect": "Allow",
"Principal": {
"Federated": "<作成したIDプロバイダのARN>"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/*"
}
}
}
]
}
IAMポリシーを作成してIAMロールにアタッチ
IAMポリシーのアクセス許可をJsonで指定
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
"Resource": "<ECRのリポジトリのARN>"
}
]
}
GitHub Actionsのワークフローを作成
mainブランチへpushしたときに実行。
Build and Push Docker Image to ECR
on:
push:
branches:
- main
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: <IAMロールのarn>
aws-region: ap-northeast-1
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
env:
ECR_REGISTRY: <AWSアカウント>.dkr.ecr.ap-northeast-1.amazonaws.com
ECR_REPOSITORY: <ECRのリポジトリ名>
IMAGE_TAG: latest
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG