2023/10/14

Workflow Identity Providerよくわからん

Workflow Identity Providerを使ってGitHub ActionsからTerraformでデプロイかけようと思ったけど認証がうまくいかなかった。
ここを元にちゃんと設定できてるかをチェックしたらうまくいった。

設定を間違えていたのは2点。

  1. 利用したいリポジトリに借用するサービスアカウントのアクセス権の付与がTerraformの変数の設定誤りでうまくいってなかった
  2. GitHub Actionsのステップでログインのステップが抜けていた。
    gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"
    これよりcreate_credentials_file: trueにすれば認証情報がファイルに出力されてloginする必要もない。

なんも考えずに設定しようとしたのが問題なので簡単にまとめる。

google-github-actions/auth at v1は、サービスアカウントのキー認証Workload Identyty Providerによる認証の2種類用意されている。
前者はキー認証。後者はGitHub ActionsのOIDCトークンを使ってGoogle Cloudのアクセストークンを発行する方式。アクセストークンを発行するためにどのGitHubのリポジトリからの認証を許可するのか、どのサービスアカウントを割り当てるのかをWorkflow Identity Providerで設定している。

認証に成功するとgoogle-github-actions/auth at v1に記載の内容が返却される。
step実行時にcreate_credentials_file: trueを渡すと認証情報がファイル出力され、必要な環境変数がセットされる。ファイルはワークフローが終了するときに削除される。

特定のファイル変更があったときだけコンテナイメージを作成

tj-actions/changed-filesを使うと変更されたファイルの一覧がとれるのでそれで特定できるっぽい。

files_yamlを指定することで対象に変更があったかをチェックできる。

      - name: Get changed files
        id: changed-files
        uses: tj-actions/changed-files@v39
        with:
          files_yaml: |
            go:
              - go.mod
              - go.sum
              - '**/*.go'            

      - uses: actions/setup-go@v4
      - name: 'Build and publish Go apps'
        if: steps.changed-files.outputs.go_any_changed == 'true'
        env:
          KO_DOCKER_REPO: ${{ vars.DOCKER_REPOSITORY }}
        run: ko build --base-import-paths --sbom none ./cmd/api