なんでもノート

なんでも書くノートみたいなブログ

GitHub ActionsからGoogle Cloudに認証する

GitHub Pagesにはてなブログの最新記事を表示する - なんでもノートGitHub ActionsからGCSへの認証に困ったと書いた。詳細をこの記事に書く。

前回の記事ではGCSにアップロードしたJSONを取得し、そのJSONに入っているブログの最新記事を表示した。JSON取得にCloud StorageのNode.js Clientライブラリを利用した。

サービスアカウントを利用した認証

Cloud Storage client libraries  |  Google Cloudの順に沿ってセットアップを進めた。

  1. サービスアカウントを作成
  2. サービスアカウントにGCSの読み取りロールを付与
  3. サービスアカウントキーを作成し、JSONファイルをダウンロード
  4. 環境変数 GOOGLE_APPLICATION_CREDENTIALS に3でダウンロードしたクレデンシャルファイルのパスを設定

これでライブラリが環境変数に設定したパスからクレデンシャルファイルを読み込み、よしなにGoogle Cloudと認証を行ってくれるようになった。ローカルで認証できるようになったが、GitHub Actions上で認証するにはどうしたらよいか。Next.jsのgetStaticPropsでStatic Site Generationをしているので、GitHub Actionsでのビルド時にJSON取得、認証が行われる。GitHubGOOGLE_APPLICATION_CREDENTIALS で検索したら、以下のコードがあった(一部省略)。

https://github.com/Gradder-Official/gradder_main/blob/a00b4030e20119ab91dc73df33361f030e21708f/.github/workflows/deploy.yml#L23-L30

      env: 
        GOOGLE_APPLICATION_CREDENTIALS: key.json
      run: |
        echo -n '${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}' > key.json

GitHub Actionsのシークレットにクレデンシャルファイルを保存しておいて、ジョブの実行時にファイルに書き出すというものだった。自分も考えはしたが、間違えてファイルの中身がログに出力されないか不安があったのでもう少し調べた。

Workload Identity 連携

調べたところ以下のブログを見つけた。

cloud.google.com

  • サービスアカウントキーより認証情報の有効期限を短くでき、不正利用時間が短くなる
  • サービスアカウントキーより管理コストが小さい
  • サービスアカウントより詳細な権限管理ができる

というものだった。また、authというGitHub Actionで簡単に認証ができそうだった。Workload Identity連携の方がサービスアカウントより総合的に良さそうだったので利用することにした。

Configuring workload identity federation  |  IAM Documentation  |  Google CloudObtaining short-lived credentials with identity federation  |  IAM Documentation  |  Google Cloudに沿って、以下の設定をした。

また、GitHub Actionsのワークフローにauth GitHub Actionのstepを追加した。必須パラメーターの workload_identity_providerservice_account を設定した。create_credentials_file パラメーターがデフォルト true で設定されていて、Clientライブラリで利用するクレデンシャルファイルを生成してくれる。また、cleanup_credentials パラメーターがデフォルト true で設定されていて、ジョブ終了時にクレデンシャルファイルを削除してくれる。

これでGitHub ActionsからGoogle Cloudに認証することができるようになった。

感想

どうするのが良いかわからなかったので困ったが、無事に解決できてよかった。Workload Identity連携はまだ理解がふわふわしているので醸成したい。