GitHub Pagesにはてなブログの最新記事を表示する - なんでもノートにGitHub ActionsからGCSへの認証に困ったと書いた。詳細をこの記事に書く。
前回の記事ではGCSにアップロードしたJSONを取得し、そのJSONに入っているブログの最新記事を表示した。JSON取得にCloud StorageのNode.js Clientライブラリを利用した。
サービスアカウントを利用した認証
Cloud Storage client libraries | Google Cloudの順に沿ってセットアップを進めた。
- サービスアカウントを作成
- サービスアカウントにGCSの読み取りロールを付与
- サービスアカウントキーを作成し、JSONファイルをダウンロード
- 環境変数
GOOGLE_APPLICATION_CREDENTIALS
に3でダウンロードしたクレデンシャルファイルのパスを設定
これでライブラリが環境変数に設定したパスからクレデンシャルファイルを読み込み、よしなにGoogle Cloudと認証を行ってくれるようになった。ローカルで認証できるようになったが、GitHub Actions上で認証するにはどうしたらよいか。Next.jsのgetStaticPropsでStatic Site Generationをしているので、GitHub Actionsでのビルド時にJSON取得、認証が行われる。GitHubで GOOGLE_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連携の方がサービスアカウントより総合的に良さそうだったので利用することにした。
Configure workload identity federation with AWS or Azure | IAM Documentation | Google Cloudと
Configure workload identity federation with AWS or Azure | IAM Documentation | Google Cloudに沿って、以下の設定をした。
- IDプールを作成
- プールにプロバイダを追加
- 属性マッピングを追加
- google.subject=assertion.repository
- 外部 IDにサービスアカウントの権限借用を許可
また、GitHub Actionsのワークフローにauth GitHub Actionのstepを追加した。必須パラメーターの workload_identity_provider
と service_account
を設定した。create_credentials_file
パラメーターがデフォルト true
で設定されていて、Clientライブラリで利用するクレデンシャルファイルを生成してくれる。また、cleanup_credentials
パラメーターがデフォルト true
で設定されていて、ジョブ終了時にクレデンシャルファイルを削除してくれる。
これでGitHub ActionsからGoogle Cloudに認証することができるようになった。
感想
どうするのが良いかわからなかったので困ったが、無事に解決できてよかった。Workload Identity連携はまだ理解がふわふわしているので醸成したい。