🐙
Github ActionsのサービスコンテナにECRのプライベートイメージを利用する
Github Actionsのサービスコンテナとは
GithubActionsのワークフロー実行時に同時に実行するDockerコンテナのこと。
テストでデータベースやRedisにアクセスが必要な場合に利用します。
サービスコンテナの認証として、2021-10-26時点でdocker login
で使うusername
とpassword
を渡す方法しかないため、
ECRのプライベートイメージを使う場合は工夫が必要になります。
services:
service1:
image: xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/private-repos:latest
credentials:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASSWORD }}
対応方法
以下の対応が必要になります。
- ECRにログインをし、パスワードを取得する
- サービスコンテナのパスワードとして設定する
ECRにログインをし、パスワードを取得する
パスワードを取得する方法はいくつかあるのですが、aws-actions/amazon-ecr-loginを使った方法を記載します。
aws-actions/amazon-ecr-loginを使うと、認証後に以下のフォーマットでユーザ名とパスワードを取得できるようになります。
- ユーザ名:docker_username_{aws_account_id}_dkr_ecr_{region}_amazonaws_com
- パスワード:docker_password_{aws_account_id}_dkr_ecr_{region}_amazonaws_com
これでパスワードに取得することができるので、あとはcredentialsに渡すだけになります。
Github Actionsの例
以下が設定例になります
jobs:
login:
runs-on: ubuntu-latest
outputs:
# ECRのユーザ名とパスワードを取得し、後続のジョブに渡す
ecr_username: ${{ steps.login-ecr.outputs.docker_username_xxxxxx_dkr_ecr_ap_northeast_1_amazonaws_com }}
ecr_password: ${{ steps.login-ecr.outputs.docker_password_xxxxxx_dkr_ecr_ap_northeast_1_amazonaws_com }}
steps:
- 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
# 2021-10-26時点でusername・passwordをアウトプットする対応がリリースされていないので、コミットハッシュで指定
uses: aws-actions/amazon-ecr-login@1535f931114514b75dc193a5544120ea22adf60c
test:
name: 'test'
needs: login
runs-on: ubuntu-latest
services:
mysql:
image: xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/private-repos:latest
# loginで取得したユーザ名・パスワードを使う
credentials:
username: ${{ needs.login.outputs.ecr_username }}
password: ${{ needs.login.outputs.ecr_password }}
steps:
- name: Echo
run: echo 'OK'
まとめ
もっといい方法があるかもしれないですが、今回はaws-actions/amazon-ecr-login
を使ってみました。
CircleCIのaws_authのようなものがあれば、複雑なことをせずに済むのですが、、
Discussion