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

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

はじまり#

リサちゃん avatar
リサちゃん
GitHub ActionsからGoogle Cloud Platformに接続するための認証が面倒で、どこで躓いたが分からなくなってしまったのだよ・・・!
135ml avatar
135ml
じゃあ、今回は、GitHub ActionsでGCPを使うために行う初期設定を書いてみるかぁ。
リサちゃん avatar
リサちゃん
押忍!

設定作業その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とかコマンドプロンプト:

Terminal window
docker build -t my-cloudsdk-container .

設定作業(Cloud-SDK側)#

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

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

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

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

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

Terminal window
gcloud -v

1-2. Cloud-SDKをinitialize#

Terminal window
gcloud init

2-1. 環境変数を宣言(その1)#

Terminal window
export PROJECT_ID="AAAAAAAAAAAAAA"
export SERVICE_ACCOUNT_NAME="BBBBBBBBBBBBB"
export DISPLAY_NAME="CCCCCCCCCCCC"
export DESCRIPTION="DDDDDDDDDDDDDDDDDD"

2-2. GitHub Actions上で利用するサービスアカウントを作成#

Terminal window
gcloud iam service-accounts create "${SERVICE_ACCOUNT_NAME}" --project "${PROJECT_ID}" --display-name "${DISPLAY_NAME}" --description "${DESCRIPTION}"

2-3. サービスアカウントに権限を付与する#

Terminal window
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を有効化する。

Terminal window
gcloud services enable iamcredentials.googleapis.com --project "${PROJECT_ID}"

3-1. 環境変数を宣言(その2)#

Terminal window
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プールを作成する。

Terminal window
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を取得して、環境変数に代入する#

Terminal window
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)#

Terminal window
export PROVIDER_NAME="HHHHHHHHHHHHHHHHHH"
export DISPLAY_PROVIDER_NAME="IIIIIIIIIIIIIIIII"

4-2. Workload Identityプロバイダを作成する#

Terminal window
export PROVIDER_NAME="HHHHHHHHHHHHHHHHHH"
export DISPLAY_PROVIDER_NAME="IIIIIIIIIIIIIIIII"

5-1. 環境変数を宣言(その4)#

Terminal window
export REPO="JJJJJJJ/KKKKKKKKKKK"

5-2. 環境変数のREPOにGitHub Actionsを動かすリポジトリを設定し、IAMポリシーバインディングを作成する#

Terminal window
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プロバイダの名前を取得する。#

Terminal window
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. プロパイダの名前をメモする。#

Terminal window
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からログアウトする。#

一応、コンテナから接続しているアカウントをログアウトさせます。

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

おしまい#

リサちゃん avatar
リサちゃん
ふい〜、何とか設定できたなあ〜〜
135ml avatar
135ml
今まで行った設定作業の中で、かなり長い方だったな・・・まあ、再現性は高いと思うけど。

以上になります!

記事を共有

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

【GCP】GitHub Actionsからキーなしで認証するための設定
https://endorphinbath.com/posts/gcp-github-actions-auth-nokeys/
著者
kinkinbeer135ml
公開日
2022-01-11
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
1
【Google Cloud】GitHub Actionsで認証するためのシェル関数を作る
Code Google Cloud上のリソースを使ってGitHub ActionsでCI/CDするためにシェル関数を構築します。その関数ではサービスアカウントにWorkload Identity連携をして処理の途中に通知を行ったりもします。
2
【Cloud Scheduler】コンテナを動かすために必要なgcloudコマンドをシェル関数化する
Code Google Cloud上でデプロイされたコンテナを操作するためにシェル関数を構築します。その関数には処理が完了した時やエラー発生時に通知を行ったりヘルプ機能も実装します。
3
【Cloud Run】コンテナを稼働させるまでに必要なgcloudコマンドをシェル関数化する
Code Google Cloud上でコンテナをデプロイするためにシェル関数を構築します。その関数には処理が完了した時やエラー発生時に通知を行ったりヘルプ機能も実装します。
4
【GitHub】Pythonでリポジトリの情報を取得するCloud Functionsを作る
Code Pythonを使用してGitHubリポジトリの情報を取得し、Cloud Functionsで処理する方法に関する記事です。PyGithubとThreadingで実装および処理を効率的にしました。
5
【GitHub】Goでリポジトリの情報を取得するCloud Functionsを作って、Pythonと比較する
Code Go言語でGitHubのリポジトリ情報を取得するCloud Functionsを開発し、Pythonで作成した同様の機能と比較した記事です。使ったツールや、並行処理の比較も行っています。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次