Breaking News

Default Placeholder Default Placeholder

今回の記事では、Github ActionsからAWSのECRへイメージをプッシュする方法を解説します。

Github Actionsの基礎を学びたい方はまずこちらの記事を参照ください

前提

  • ECRにリポジトリが存在すること
  • Dockerを使用するプロジェクトが存在すること

この記事でやること

  1. ECRにプッシュできるIAMユーザを作成する
  2. Githubのシークレットに1のIAMユーザのトークンをセットする
  3. 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をセットしてください。

どういう動作をするか説明します。

  1. github-actions-testというブランチがプッシュされた時に実行します
  2. 環境変数をセットします
  3. github-actions-testブランチの内容をcheckoutします
  4. Dockerビルドを実行します
  5. AWSのECRにログインします
  6. 4で作成したイメージにタグ付けします
  7. ECRにイメージをプッシュします

環境変数のセット

Github Actionsのシークレット情報は以下で取得できます

${{ secrets.シークレット名 }}

Github Actions内でセットした環境変数は以下で取得できます

${{ env.環境変数名 }}