- はじまり
- 設定作業その1:Google Cloud PlatformでAPIを有効化する
- 設定作業その2:Google Cloud Platformで認証情報を設定する
- 設定作業その2改:Cloud SDKで認証情報を設定する
- 設定作業(Cloud-SDK側)
- 1. Dockerコンテナをrunさせます。
- 1-1. Cloud-SDKが入っているどうかを確認。
- 1-2. Cloud-SDKをinitialize
- 2-1. 環境変数を宣言(その1)
- 2-2. GitHub Actions上で利用するサービスアカウントを作成
- 2-3. サービスアカウントに権限を付与する
- 2-4. IAM Service Account Credentials APIを有効化する。
- 3-1. 環境変数を宣言(その2)
- 3-2. Workload Identityプールを作成する
- 3-3. Workload IdentityプールのIDを取得して、環境変数に代入する
- 4-1. 環境変数を宣言(その3)
- 4-2. Workload Identityプロバイダを作成する
- 5-1. 環境変数を宣言(その4)
- 5-2. 環境変数のREPOにGitHub Actionsを動かすリポジトリを設定し、IAMポリシーバインディングを作成する
- とりあえず設定できているかどうかを確認
- 5-3. Workload Identityプロバイダの名前を取得する。
- 5-4. プロパイダの名前をメモする。
- 6-1. Cloud-SDKからログアウトする。
- 設定作業(GitHub Actions側)
- 余談:Terraformを使えばさらに楽になる?
- おしまい
はじまり
あー、もう、どうなってんだぁ〜!?
どうしたどうした?
GitHub ActionsからGoogle Cloud Platformに接続するための認証が面倒でね・・・
どこで躓いたが分からなくなってしまったのだよ・・・!
じゃあ、今回は、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を利用した方法でやってみました。
このサイトを参考に行ってみました。
ちなみに、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というワードが引っかかりました。気が向いたら調べてみます。
おしまい
ふい〜、何とか設定できたなあ〜〜
今まで行った設定作業の中で、かなり長い方だったな・・・
まあ、CUIで行った方法だから、再現性は高いと思います。
以上になります!
コメント