普段ソースコードは Github
で管理しているんですが、 AWS
の CodePipeline
を使用した開発で AWS
の ECR
に Github
のソースコードを docker build
してイメージをプッシュしてたんですが、毎回手作業は面倒臭いんで、 Github Actions を使って自動化してみました。
Github Actions
についてはこちらを見てもらえればと思います。
AWS ECR
はコンテナソフトウェアをどこにでも簡単に保存、共有、デプロイできる AWS
のサービスです。
前提条件
今回は既に Dockerfile
は作成済みとします。
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をクリックし、左側のメニューの Secrets
→ Actions
をクリックします。
Actions secrets
画面が開くので New repository secret
ボタンをクリックします。
Name
と Value
に下記のものを追加します。
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
リポジトリの Actions
→ Push ECR
をクリックします。
このリポジトリの main
ブランチに対してプッシュすると自動で workflow
が実行されます。
成功すると下記の画像のようになります。
AWS ECR 確認
AWS ECR
のリポジトリにイメージがプッシュされていれば成功です。
最後に
Github Actions
で AWS ECR
にイメージをプッシュすることができました。今回は main
ブランチがプッシュされると自動起動するようにしていますが、手動実行に切り替えたり、リリースタグを作成したときに自動実行するように変更することもできます。
なので、検証環境用には main
ブランチにプッシュされるたびに最新のイメージをプッシュし、本番環境用にはリリースタグ作成時に最新イメージをプッシュするという運用ができると思います。
設定に AWS
を操作したり、 Github
を操作したり切り替えが大変ですが、一度設定できてしまえばあとは微調整で対応できると思います。
この記事が皆さんのシステム運用を楽にするために役に立てばと思います。
コメント