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

Code

はじまり

リサちゃん
リサちゃん

あー、もう、どうなってんだぁ〜!?

135ml
135ml

どうしたどうした?

リサちゃん
リサちゃん

GitHub ActionsからGoogle Cloud Platformに接続するための認証が面倒でね・・・

どこで躓いたが分からなくなってしまったのだよ・・・!

135ml
135ml

じゃあ、今回は、GitHub ActionsでGCPを使うために行う初期設定を書いてみるかあ。

リサちゃん
リサちゃん

ヨロシク!

設定作業その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を利用した方法でやってみました。

このサイトを参考に行ってみました。

gcloud alpha functions  |  Google Cloud CLI Documentation
サービスアカウントキーを用いずにGitHub ActionsからGoogle Cloudと認証する | DevelopersIO
Workload Identity連携を使って認証し、サービスアカウント情報をgcloudで取得するというワークフローを試してみます。

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

Cloud SDKを使う用にDocker Buildする

DockerコンテナをBuildします。

Dockerfile

FROM ubuntu:latest

RUN apt update

WORKDIR /usr/src/app
COPY ./ /usr/src/app

# prepare setting up Cloud-SDK
RUN apt install apt-transport-https ca-certificates gnupg -y
RUN 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.list
RUN apt install -y curl
RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
RUN apt update
RUN apt install -y python3 python3-pip

# setup Cloud-SDK
RUN apt update && apt install google-cloud-sdk -y

Bashとかコマンドプロンプト

docker build -t my-cloudsdk-container .

設定作業(Cloud-SDK側)

Buildした後は、こちらにも掲載していますが、結構長い作業が待っています・・・。

1. Dockerコンテナをrunさせます。

Bashとかコマンドプロンプト

docker run -it --rm --name my-running-container my-cloudsdk-container

1-1. Cloud-SDKが入っているどうかを確認。

gcloud -v

1-2. Cloud-SDKをinitialize

gcloud init

2-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を実行してみてちゃんと出来ているかどうかを確認します。

余談:Terraformを使えばさらに楽になる?

今回の設定を調べているときに、Terraformというワードが引っかかりました。気が向いたら調べてみます。

おしまい

リサちゃん
リサちゃん

ふい〜、何とか設定できたなあ〜〜

135ml
135ml

今まで行った設定作業の中で、かなり長い方だったな・・・

まあ、CUIで行った方法だから、再現性は高いと思います。

以上になります!

コメント

タイトルとURLをコピーしました