[Github]Github ActionsでDockerイメージをAWSのECRリポジトリにプッシュする方法

普段ソースコードはGithubで管理しているんですが、AWSCodePipelineを使用した開発でAWSECRGithubのソースコードをdocker buildしてイメージをプッシュしてたんですが、毎回手作業は面倒臭いんで、Github Actionsを使って自動化してみました。

Github Actionsについてはこちらを見てもらえればと思います。

https://github.co.jp/features/actions

AWS ECRはコンテナソフトウェアをどこにでも簡単に保存、共有、デプロイできるAWSのサービスです。

https://aws.amazon.com/jp/ecr/

前提条件

今回は既にDockerfileは作成済みとします。

Dockerfileの作成方法が分からない方は以下の記事を参考にしてもらえればと思います。

http://43.206.46.12/golang-echo-dockerfile/

http://43.206.46.12/nuxtjs-dockerfile/

AWS側の作業

AWS ECRにプッシュすることができる権限を持つユーザを作成する

AWS ECRにプッシュすることができる権限を持つユーザを作成します。

AWS IAMのユーザーページにアクセスし、ユーザーを追加をクリックしします。

ユーザ名を入力し、AWS 認証情報タイプを選択アクセスキー - プログラムによるアクセスを選択し、次のステップ:アクセス権限をクリックします。

アクセス許可の設定既存のポリシーを直接アタッチを選択し、AmazonEC2ContainerRegistryFullAccessにチェックを入れて次のステップ:タグをクリックします。

今回はとりあえず、AWS ECRに対して全権限を持っているAmazonEC2ContainerRegistryFullAccessを選択しましたが、ここは必要に応じて権限を弱くしても良いです。最低限AWS ECRにプッシュできればどんな権限設定でも良いと思います。

タグの追加画面では特に入力することはないので、そのまま次のステップ:確認をクリックします。

確認画面で設定内容を確認し、問題なければユーザーの作成をクリックします。

ユーザー追加できました。

この画面で表示されているアクセスキーIDシークレットアクセスキーは後で使うので忘れずにメモしておきましょう。

AWS ECRにリポジトリを作成する

Github Actionsでプッシュしたイメージを保存するリポジトリを作成します。

Amazon ECRのリポジトリ画面から今回はプライベートリポジトリを作成します。

リポジトリを作成をクリックしてリポジトリ作成画面を開きます。

リポジトリ名を入力し、リポジトリを作成をクリックし、リポジトリを作成します。

いろいろ設定はありますが、基本デフォルトのままで良いと思います。

Github側の作業

Github Actions作成

Github Actionsを作成します。

Githubのリポジトリの画面からActionsをクリックするといろんな雛形が表示されますが、今回は雛形を使用しないので、set up a workflow yourselfのリンクをクリックし、自分で最初からファイルを作成します。

push-ecr.yml作成

name: Push ECR

on:
  push:
    branches: [ main ]

jobs:

  build-and-push:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          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: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPO_NAME }}
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:latest .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest

下記のsecretsの値は別途設定が必要です。

  • AWS_ACCESS_KEY_ID:IAMで配布されたアクセスキーID
  • AWS_SECRET_ACCESS_KEY:IAMで配布されたシークレットアクセスキー
  • AWS_ECR_REPO_NAME:ECRで登録したリポジトリ名

secretsを設定する

GithubのリポジトリのSettingsをクリックし、左側のメニューのSecretsActionsをクリックします。

Actions secrets画面が開くのでNew repository secretボタンをクリックします。

NameValueに下記のものを追加します。

AWS_ACCESS_KEY_ID

  • Name:AWS_ACCESS_KEY_ID
  • Value:IAMで配布されたアクセスキーID

AWS_SECRET_ACCESS_KEY

  • Name:AWS_SECRET_ACCESS_KEY
  • Value:IAMで配布されたシークレットアクセスキー

AWS_ECR_REPO_NAME

  • Name:AWS_ECR_REPO_NAME
  • Value:ECRで登録したリポジトリ名

Dockerイメージをプッシュする

GithubリポジトリのActionsPush ECRをクリックします。

このリポジトリのmainブランチに対してプッシュすると自動でworkflowが実行されます。

成功すると下記の画像のようになります。

AWS ECR確認

AWS ECRのリポジトリにイメージがプッシュされていれば成功です。

最後に

Github ActionsAWS ECRにイメージをプッシュすることができました。今回はmainブランチがプッシュされると自動起動するようにしていますが、手動実行に切り替えたり、リリースタグを作成したときに自動実行するように変更することもできます。

なので、検証環境用にはmainブランチにプッシュされるたびに最新のイメージをプッシュし、本番環境用にはリリースタグ作成時に最新イメージをプッシュするという運用ができると思います。

設定にAWSを操作したり、Githubを操作したり切り替えが大変ですが、一度設定できてしまえばあとは微調整で対応できると思います。

この記事が皆さんのシステム運用を楽にするために役に立てばと思います。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です