今回の記事では、Github ActionsからAWSのECRへイメージをプッシュする方法を解説します。
Github Actionsの基礎を学びたい方はまずこちらの記事を参照ください
前提
- ECRにリポジトリが存在すること
- Dockerを使用するプロジェクトが存在すること
この記事でやること
- ECRにプッシュできるIAMユーザを作成する
- Githubのシークレットに1のIAMユーザのトークンをセットする
- Github ActionsのWorkflowを作る
1. ECRにプッシュできるIAMユーザを作成する
まずはECRにイメージをプッシュできるIAMユーザを作ります。
ここではTerraformを使ってIAMユーザと必要なポリシーを作っていきます。
以下のTerraformをApplyします。
# ECR へのイメージプッシュ権限を持つポリシー
resource "aws_iam_policy" "ecr_push_policy" {
name = "ecr-push-policy"
description = "Policy for pushing images to ECR"
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:CompleteLayerUpload",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
],
Resource = "*"
},
]
})
}
# GitHub Actions が ECR にイメージをプッシュするための IAM ユーザー
resource "aws_iam_user" "github_actions_user" {
name = "github-actions-user"
}
# IAM ユーザーにポリシーをアタッチ
resource "aws_iam_user_policy_attachment" "ecr_push" {
user = aws_iam_user.github_actions_user.name
policy_arn = aws_iam_policy.ecr_push_policy.arn
}
2. Githubのシークレットに1のIAMユーザのトークンをセットする
1で作ったユーザにAWSのコンソール上でアクセストークンとシークレットアクセストークンを作成します。
画像のIAMユーザのページのアクセスキーを作成からアクセストークンを作ることができます。
上記2つのトークンをGithubのリポジトリの Settings > Secrets and variables > Actions からシークレット情報をセットすることができます。
これでGithub ActionsからAWSのECRにアクセスできるようになりました。
ではGithub ActionsのWorkflowを作っていきましょう!
3. Github ActionsのWorkflowを作る
まずはプロジェクトに .github > workflows ディレクトリを作成します。
workflowsディレクトリ配下にymlファイルを作ります。ファイル名は任意です。ここでは deploy.yml というファイルを作っていきます。
deploy.ymlに以下を記述します。
name: Test Github Actions
on:
push:
branches:
- github-actions-test
env:
AWS_REGION: ap-northeast-1
AWS_ACCOUNT_ID: xxxxxxxxxxx
IMAGE_NAME: image_name
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ECR_PUSH_USER_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_ECR_PUSH_USER_SECRET_ACCESS_KEY }}
IMAGE_TAG: ${{ github.sha }}
jobs:
build_and_push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: build image
run: docker build -t ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} --platform linux/x86_64 .
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: tag
run: docker tag ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
- name: push
run: docker push ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
AWS_ACCOUNT_IDにはお使いのAWSアカウントのIDをセットしてください。
どういう動作をするか説明します。
- github-actions-testというブランチがプッシュされた時に実行します
- 環境変数をセットします
- github-actions-testブランチの内容をcheckoutします
- Dockerビルドを実行します
- AWSのECRにログインします
- 4で作成したイメージにタグ付けします
- ECRにイメージをプッシュします
環境変数のセット
Github Actionsのシークレット情報は以下で取得できます
${{ secrets.シークレット名 }}
Github Actions内でセットした環境変数は以下で取得できます
${{ env.環境変数名 }}