Workload Identity 認証を使って Github Actions を実行する
はじめに
社内で Google Cloud リソース作成の自動化に取り組んでおり、Terraform のコードを Github で管理・Github Actions を使って Google Cloud リソースの作成を行っております。
Github Actions や Terraform が Google Cloud に連携する際サービスアカウントのアカウントキーを使っていたのですが、それを Workload Identity に置き換えたので、その設定方法などをまとめます。
手順
Workload Identity 専用のプロジェクトを作成する
Google Cloud のベストプラクティスによると、Workload Identity を専用のプロジェクトで作成・管理することが推奨されています。
なので専用プロジェクトを新規で作成しました。後述のサービスアカウントや tfstate ファイルを管理する Cloud Storage バケットとは別プロジェクトです。
Workload Identity のプールとプロバイダを作成する
公式ドキュメントの「Github Actions」に沿って作成していきます。
Workload Identity のページの「+プールを作成」より作成していきます。
任意の名前(必要であればプールIDも)を入力して「続行」をクリックします。
②でプロバイダを追加します。
公式ドキュメントの通り、使うパイプラインによって設定値が異なりますが、Github Actions の場合は、
- プロバイダの選択 : OpenID Connect(OIDC)
- プロバイダ名 : 任意の値
- 発行元(URL) :
https://token.actions.githubusercontent.com/
- JWK ファイル(JSON) : 指定なし
- オーディエンス : デフォルトのオーディエンス
③でプロバイダの属性を記載します。
以下の属性を指定しました。
- google.subject : assertion.sub
- attribute.aud : assertion.aud
- attribute.actor : assertion.actor
- attribute.repository : assertion.repository
属性条件には assertion.repository_owner=='<Github の Organization 名>'
を指定し、この Workload Identity を使うことができる Github Organization を限定しました。
Github の OIDCトークン は公式ドキュメントから確認できます。
Workload Identity のプールとサービスアカウントを紐づける
上記で作成した Workload Identity のプールと Google Cloud リソース作成を実行するサービスアカウントを紐づけます。
前述の通り、このサービスアカウントは Worklord Identity プールが存在するプロジェクトとは異なるプロジェクトで作成されたものなので、Cloud Shell から設定します。
Worklord Identity プールが存在するプロジェクトから Cloud Shell を開き、以下コマンドを実行します。
gcloud iam service-accounts add-iam-policy-binding "<サービスアカウント>" \
--project="<サービスアカウントのプロジェクトID>" \
--role="roles/iam.workloadIdentityUser" \
--member="principalSet://iam.googleapis.com/projects/<Worklord Identity のプロジェクト番号>/locations/global/workloadIdentityPools/<Worklord Identity プールID>/attribute.repository/<Github の Organization名>/<Github のリポジトリ名>"
Worklord Identity プールの詳細ページで IAM プリンシパルが記載されていますが、コマンドの --member=
で指定する値は以下の点が異なります。
- 文字列の先頭は
principal
ではなくprincipalSet
- 文字列の最後につける属性は
subject
ではなくattribute.repository
Workload Identity のプールが Cloud Storage バケットに接続できるようにする
Workload Identity プールが tfstate ファイルを管理する Cloud Storage バケットに書き込みできるようにアクセス権限を追加します。
コンソール画面から Cloud Storage バケットを開き、権限タブから Workload Identity の IAM プリンシパルを追加します。
このときに使う IAM プリンシパルの Subject
属性には Github の Organization名、リポジトリ名、ブランチ名を使います。
principal://iam.googleapis.com/projects/<Worklord Identity のプロジェクト番号>/locations/global/workloadIdentityPools/<Worklord Identity プールID>/subject/repo:<Github の Organization名>/<Github のリポジトリ名>:ref:refs/heads/<ブランチ名>
Workload Identity を使うように Terraform コードを修正
設定した Workload Identity 情報を Github Actions のワークフローファイルに追記します。一番最初のジョブに追記する必要があります。
jobs:
jobid:
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v3
- uses: 'google-github-actions/auth@v2'
with:
workload_identity_provider: 'projects/<Worklord Identity のプロジェクト番号>/locations/global/workloadIdentityPools/<Worklord Identity プールID>/providers/<Worklord Identity プロバイダID>'
service_account: '<サービスアカウント>'
設定は以上です!
今まで使っていたサービスアカウントのアカウントキーファイルやそれを参照しているコードを削除すれば、Workload Identity への置き換え完了です。
参考