【GCP】GitHub Actionsからキーなしで認証するための設定
はじまり



設定作業その1:Google Cloud PlatformでAPIを有効化する
まず、Google Cloud Platformでプロジェクトを作成します。(作成の過程は割愛します。)
そして、GCPのコンソール画面のサイドバーから以下の「ライブラリ」をクリックします。

以下の画面から、今回必要なAPIを有効化します。今回は2種類のAPIを有効化します。

そして、「Google Drive API」と「Google Sheets API」を有効化します。


APIが追加できたかどうかを確認します。
今度は、「APIとサービス」の「ダッシュボード」をクリックして以下のような画面で確認します。

設定作業その2:Google Cloud Platformで認証情報を設定する
外部アプリケーションからスプレッドシートにリクエストするためにクレデンシャル情報を設定します。
「認証情報を作成」をクリックして、「サービスアカウント」を選びます。

サービスアカウントの設定画面になります。

編集者を選択します。

ここは省略します。

そして、作成したサービスアカウントを確認して、キーの出力を行います・・・
と、思ったのですが、警告文に「代わりにWorkload Identity 連携を使用することをおすすめします。」と書いてありました。
確かに、キーはJSON形式で色々な情報が含まれています。
そんな大変な情報をいちいち出力するのはあまりよろしくない気がするので、予定変更で、Workload Identity 連携をしてみたいと思います。

設定作業その2改:Cloud SDKで認証情報を設定する
上述のとおり、JSONキーを取得する方法ではなく、Workload Identity連携で認証の設定をしたいと思います。
そして、その設定が結構込み入ったものになっていたので、後に設定変更しやすくするために、GCPのGUI上ではなく、Cloud SDK+GitHub Actionsを利用した方法でやってみました。
このサイトを参考に行ってみました。

ちなみに、GUI上でWorkload Identity 連携を行う場合はこんな画面で行うみたいです。

Cloud SDKを使う用にDocker Buildする
DockerコンテナをBuildします。
Dockerfile:
FROM ubuntu:latest
RUN apt update
WORKDIR /usr/src/appCOPY ./ /usr/src/app
# prepare setting up Cloud-SDKRUN apt install apt-transport-https ca-certificates gnupg -yRUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.listRUN apt install -y curlRUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -RUN apt updateRUN apt install -y python3 python3-pip
# setup Cloud-SDKRUN apt update && apt install google-cloud-sdk -yBashとかコマンドプロンプト:
docker build -t my-cloudsdk-container .設定作業(Cloud-SDK側)
Buildした後は、こちらにも掲載していますが、結構長い作業が待っています・・・。
1. Dockerコンテナをrunさせます。
Bashとかコマンドプロンプト:
docker run -it --rm --name my-running-container my-cloudsdk-container1-1. Cloud-SDKが入っているどうかを確認。
gcloud -v1-2. Cloud-SDKをinitialize
gcloud init2-1. 環境変数を宣言(その1)
export PROJECT_ID="AAAAAAAAAAAAAA"export SERVICE_ACCOUNT_NAME="BBBBBBBBBBBBB"export DISPLAY_NAME="CCCCCCCCCCCC"export DESCRIPTION="DDDDDDDDDDDDDDDDDD"2-2. GitHub Actions上で利用するサービスアカウントを作成
gcloud iam service-accounts create "${SERVICE_ACCOUNT_NAME}" --project "${PROJECT_ID}" --display-name "${DISPLAY_NAME}" --description "${DESCRIPTION}"2-3. サービスアカウントに権限を付与する
gcloud projects add-iam-policy-binding "${PROJECT_ID}" --role="roles/editor" --member="serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"2-4. IAM Service Account Credentials APIを有効化する。
サービスアカウントの一時的な認証情報を作成できるようにするために、IAM Service Account Credentials APIを有効化する。
gcloud services enable iamcredentials.googleapis.com --project "${PROJECT_ID}"3-1. 環境変数を宣言(その2)
export POOL_NAME="EEEEEEEEEEEEE"export DISPLAY_POOL_NAME="FFFFFFFFFFFFFF"export POOL_DESCRIPTION="GGGGGGGGGGGGGGGGGGGGG"3-2. Workload Identityプールを作成する
Workload Identityプールは外部IDとGoogle Cloudとの紐付けを設定したWorkload Identityプロバイダをグループ化し管理するために、Workload Identityプールを作成する。
gcloud -vgcloud iam workload-identity-pools create "${POOL_NAME}" --project="${PROJECT_ID}" --location="global" --display-name="${DISPLAY_POOL_NAME}" --description="${POOL_DESCRIPTION}"3-3. Workload IdentityプールのIDを取得して、環境変数に代入する
gcloud -vexport WORKLOAD_IDENTITY_POOL_ID=`gcloud iam workload-identity-pools describe "${POOL_NAME}" --project="${PROJECT_ID}" --location="global" --format="value(name)"`4-1. 環境変数を宣言(その3)
export PROVIDER_NAME="HHHHHHHHHHHHHHHHHH"export DISPLAY_PROVIDER_NAME="IIIIIIIIIIIIIIIII"4-2. Workload Identityプロバイダを作成する
export PROVIDER_NAME="HHHHHHHHHHHHHHHHHH"export DISPLAY_PROVIDER_NAME="IIIIIIIIIIIIIIIII"5-1. 環境変数を宣言(その4)
export REPO="JJJJJJJ/KKKKKKKKKKK"5-2. 環境変数のREPOにGitHub Actionsを動かすリポジトリを設定し、IAMポリシーバインディングを作成する
gcloud iam service-accounts add-iam-policy-binding "${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" --project="${PROJECT_ID}" --role="roles/iam.workloadIdentityUser" --member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository/${REPO}"とりあえず設定できているかどうかを確認
ちなみに、GCPのGUIコンソールで確認すると、サービスアカウントの画面でこんな感じになっているかと思います。
この時点では、キーIDはまだ無いかと思います。今回は設定しません。

Workload Identity連携の画面では、こんな感じになっているかと思います。

5-3. Workload Identityプロバイダの名前を取得する。
export FULL_PROVIDER_NAME=`gcloud iam workload-identity-pools providers describe "${PROVIDER_NAME}" --project="${PROJECT_ID}" --location="global" --workload-identity-pool="${POOL_NAME}" --format="value(name)"`5-4. プロパイダの名前をメモする。
export FULL_PROVIDER_NAME=`gcloud iam workload-identity-pools providers describe "${PROVIDER_NAME}" --project="${PROJECT_ID}" --location="global" --workload-identity-pool="${POOL_NAME}" --format="value(name)"`6-1. Cloud-SDKからログアウトする。
一応、コンテナから接続しているアカウントをログアウトさせます。
gcloud auth revoke設定作業(GitHub Actions側)
Workflowファイルの中身
中身はこんなふうになっています。
一応、yamlファイルの中の環境変数と、先程Cloud-SDKで宣言した環境変数の名前は同じですので、途中でこんがらがったら確認してみてください。
.github/workflows/gcloudAuth.yaml:
name: Auth GCP and Describe service account
on: workflow_dispatch
env: PROJECT_ID: 'プロジェクトID' SERVICE_ACCOUNT_NAME: 'サービスアカウントの名前' FULL_PROVIDER_NAME: 'projectsから始まるプロパイダの名前'
jobs: updateFeed: runs-on: ubuntu-latest permissions: contents: 'read' id-token: 'write' steps: - name: Checkout uses: actions/checkout@v2
- name: Auth GCP id: 'google-cloud-auth' uses: google-github-actions/auth@v0.4.1 with: create_credentials_file: true workload_identity_provider: ${{ env.FULL_PROVIDER_NAME }} service_account: ${{ env.SERVICE_ACCOUNT_NAME }}@${{ env.PROJECT_ID }}.iam.gserviceaccount.com
- name: Set up Cloud-SDK uses: google-github-actions/setup-gcloud@v0
- name: Describe my-service-account run: gcloud iam service-accounts describe ${{ env.SERVICE_ACCOUNT_NAME }}@${{ env.PROJECT_ID }}.iam.gserviceaccount.com動作確認
実際に、GitHub Actionsを実行してみてちゃんと出来ているかどうかを確認します。

おしまい


以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!