GitHub Actions と GCP の連携方法でググったときの情報が何か古い気がしたので、2022 年 2 月版を書いておく。
setup-gcloud
action には Google が公式で出している setup-gcloud を使う。
master ブランチを使わない
ドキュメントにも
Do not pin this action to @master, use @v0 instead. We are going to rename the branch to main in 2022 and this will break existing workflows. See Versioning for more information.
と書かれている通り、@master
は使わないようにしよう。
jobs:
job_id:
# Add "id-token" with the intended permissions.
permissions:
contents: "read"
id-token: "write"
steps:
- id: "auth"
uses: "google-github-actions/auth@v0"
with:
workload_identity_provider: "projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider"
service_account: "my-service-account@my-project.iam.gserviceaccount.com"
- name: "Set up Cloud SDK"
uses: "google-github-actions/setup-gcloud@v0"
- name: "Use gcloud CLI"
run: "gcloud info"
のようにして使う。
(https://github.com/google-github-actions/setup-gcloud#usage)
service_account 周りのフィールドは deprecated
これまでは、
- service_account_key
- service_account_email
- export_default_credentials
- credentials_file_path
- cleanup_credentials
を認証に使えていましたが、今のバージョンでは全て使えない。
代わりに
job:
job_id:
steps:
- id: "auth"
uses: "google-github-actions/auth@v0"
with:
credentials_json: "${{ secrets.GCP_CREDENTIALS }}"
- name: "Set up Cloud SDK"
uses: "google-github-actions/setup-gcloud@v0"
- name: "Use gcloud CLI"
run: "gcloud info"
のように credentials_json を使う。
credentials_json は service account の 鍵 json ファイルを base64 したもので、それを GitHub の secret に設定すれば良い。 Mac であればこのようなコマンドで取得できる。
cat your-service-key.json | base64 | pbcopy
なお、公式ドキュメントには preferred way として
jobs:
job_id:
# Add "id-token" with the intended permissions.
permissions:
contents: "read"
id-token: "write"
steps:
- id: "auth"
uses: "google-github-actions/auth@v0"
with:
workload_identity_provider: "projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider"
service_account: "my-service-account@my-project.iam.gserviceaccount.com"
- name: "Set up Cloud SDK"
uses: "google-github-actions/setup-gcloud@v0"
- name: "Use gcloud CLI"
run: "gcloud info"
といった例が説明されているが、これは Workload Identity Federation と呼ばれているやり方だ。
これまでは service account の認証情報を secret として GitHub に持たせていたが、それなりの権限をもつトークンをずっと GitHub に持たせるのはよくないという問題意識で作られたのが Workload Identity Federation である。
ただまだ一般的なものではなく、GCP 側での設定がめんどくさかったので今回は使っていない。 興味がある人は使うと良いと思う。