hero_picture
Cover Image for GitHub Actionsを利用してECRのリポジトリにpushしてみる

GitHub Actionsを利用してECRのリポジトリにpushしてみる

2021/01/28

Webサイト構築事業部の西村です

GitHub Actionsって便利ですよね

今回はそんな便利なGitHub Actionsを利用してECR(Elastic Container Registry) のリポジトリにコンテナイメージをpushしてみたいと思います

AWS側の準備

まずはAWSの準備をします

以下のものを作成します

  • pushできるようにするためのポリシー
  • イメージをpushするためのGitHub Actions用ユーザーの作成
  • イメージのリポジトリ

ポリシーの作成

まずはポリシーの作成をします

許可するものは以下の通りです

  • ecr:CompleteLayerUpload
  • ecr:UploadLayerPart
  • ecr:InitiateLayerUpload
  • ecr:BatchCheckLayerAvailability
  • ecr:PutImage
  • ecr:GetAuthorizationToken

当記事ではビジュアルエディタで説明を行います

IAM > ポリシー で画面を開き “ポリシーの作成” をクリックします

すると画像のような画面になります

サービス

Elastic Container Registry を選択します

アクション

下記を選択します

  • 読み込み
    • BatchCheckLayerAvailability
    • GetAuthorizationToken
  • 書き込み
    • CompleteLayerUpload
    • InitiateLayerUpload
    • PutImage
    • UploadLayerPart

リソース

  1. ARNの追加 をクリックします
  2. Regionは現在利用しているリージョンもしくはすべてのチェックボックスにチェック
  3. Accountはデフォルトで入力されているはずなのでそのままにしておきます
  4. Repository nameはpushする予定のリポジトリ名の指定もしくはすべてのチェックボックスにチェック

ここまでできましたらポリシーの確認をクリックします

名前 / 説明

名前にはわかりやすい名前を指定します(当記事では github-actions-ecr-push とします)

説明にはこれが何かという説明を入力しておきます

入力が完了したらポリシーの作成をクリックします

ユーザーの作成

続いてユーザーを作成します

IAM > ユーザー で画面を開き “ユーザーを追加” をクリックします

詳細

ユーザー名はわかりやすい名前を付けておきます(当記事では github-actions-user とします)

アクセスの種類は “プログラムによるアクセス” にのみチェックを入れます

アクセス権限

既存のポリシーを直接アタッチを選択し、先ほど作成したポリシーを選択します

タグ

必要なタグがあれば追加しておきます

確認

問題がなければ “ユーザーの作成” をクリックしユーザーを作成します

作成が完了後アクセスキーIDとシークレットアクセスキーが表示されるのでメモをしておくか、”.csvのダウンロード” でダウンロードしておきます

リポジトリの作成

最後にリポジトリの作成をします

Elastic Container Registry > Repositories で画面を開き、 “リポジトリを作成” をクリックします

可視性設定

公開する範囲に合わせて指定します

リポジトリ名

任意のものを指定します(当記事では github-actions-test とします)

タグのイミュータビリティ/プッシュ時にスキャン/KMS 暗号化

これらは必要に応じて有効にします(当記事ではすべて無効のままにしています)

  • タグのイミュータビリティ
    • 同じタグでの上書きを防止できるオプション
  • プッシュ時にスキャン
    • イメージがプッシュされた際に脆弱性のスキャンを行うオプション
  • KMS 暗号化
    • デフォルトの暗号化ではなく、KMSを利用して暗号化してくれるオプション

設定が完了したら “リポジトリを作成” をクリックします

これでAWS側の準備は完了です

各種ファイルの準備

ECRにpushするためのDockerImageとGitHub Actions用のファイルを作成します

1/
2┣ .github
3┃┗ workflows
4┃ ┗ ecr_push.yml
5┗ Dockerfile

Dockerfile

Dockerfileの中身は必ずしも同じである必要はありません

※このDockerfileには特に意味はありません

1FROM php:8.0.1-cli
2RUN apt-get update
3RUN apt-get install -qq --no-install-recommends git
4RUN rm -rf /var/lib/apt/lists/*

.github/workflows/ecr_push.yml

1name: ECR Push
2
3on:
4  workflow_dispatch:
5
6jobs:
7  ecr-push:
8    runs-on: ubuntu-latest
9    name: ECR Push
10    steps:
11    - name: Checkout
12      uses: actions/checkout@v2
13
14    - name: Configure AWS credentials
15      uses: aws-actions/configure-aws-credentials@v1
16      with:
17        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
18        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
19        aws-region: "ap-northeast-1"
20
21    - name: Login to Amazon ECR
22      id: login-ecr
23      uses: aws-actions/amazon-ecr-login@v1
24
25    - name: Build, tag, and push image to Amazon ECR
26      env:
27        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
28        ECR_REPOSITORY: github-actions-test
29        IMAGE_TAG: latest
30      run: |
31        docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
32        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG

28行目の ECR_REPOSITORY はあらかじめ作成したリポジトリ名を指定します

29行目の IMAGE_TAG は任意のタグを指定してください

この2つのファイルをGitHubのリポジトリにpushします

リポジトリでの設定

続いてリポジトリの設定をします

具体的にはアクセスキーの設定をします

アクセスキーをファイルに含めてしまうと誰でもアクセスできてしまいますので絶対に含めてはいけません

リポジトリの設定画面を開き、Secretsを開きます

その後 “New repository secret” をクリックします

Name に AWS_ACCESS_KEY_ID

Value に 先ほど作ったユーザのアクセスキーIDを入力します

入力後 “Add secret” をクリックします

もう一度 “New repository secret” をクリックし今度は、

Name に AWS_SECRET_ACCESS_KEY

Value に 先ほど作ったユーザのシークレットアクセスキーを入力します

ここまででpushの準備がすべて完了です

コンテナイメージをPushする

Actions > ECR Push で画面を開きます

開いたら、 “Run workflow” プルダウンをクリックしその中の “Run workflow” をクリックし実行します

ページを更新すると実行したワークフローが出てきますので確認のため開きます

実行に成功すると画像のようになります

ECRのリポジトリ画面を確認するとpushされたことが確認できるかと思います

最後に

GitHub Actions を利用してコンテナイメージをpushしてみました

今回は手動実行でpushするような仕組みにしましたが、タグ付けを行った際に自動的に実行することも可能ですので、バージョンアップ時に自動で更新する使い方もできるかと思います

この記事が少しでも参考になればうれしいです

最後までお読みいただきありがとうございました