🐙

Github ActionsのサービスコンテナにECRのプライベートイメージを利用する

2021/10/26に公開

Github Actionsのサービスコンテナとは

GithubActionsのワークフロー実行時に同時に実行するDockerコンテナのこと。
テストでデータベースやRedisにアクセスが必要な場合に利用します。
https://docs.github.com/ja/actions/using-containerized-services/about-service-containers

サービスコンテナの認証として、2021-10-26時点でdocker loginで使うusernamepasswordを渡す方法しかないため、
ECRのプライベートイメージを使う場合は工夫が必要になります。

services:
  service1:
    image: xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/private-repos:latest
    credentials:
      username: ${{ secrets.DOCKER_USER }}
      password: ${{ secrets.DOCKER_PASSWORD }}

対応方法

以下の対応が必要になります。

  1. ECRにログインをし、パスワードを取得する
  2. サービスコンテナのパスワードとして設定する

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