このチュートリアルでは、Cloud Build で Secret Manager を使用して、ビルドから限定公開 GitHub リポジトリにアクセスする方法について説明します。Secret Manager は、API キー、パスワード、その他の機密データを安全に保存する Google Cloud サービスです。
目標
- GitHub SSH 認証鍵を設定する。
- 公開 SSH 認証鍵を限定公開リポジトリのデプロイキーに追加します。
- シークレット マネージャーに秘密 SSH 認証鍵を保存します。
- シークレット マネージャーからキーにアクセスし、それを使用して非公開リポジトリにアクセスするビルドを送信します。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- Secret Manager
- Cloud Build
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Secret Manager APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Secret Manager APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 省略可。シークレット マネージャー クイックスタートを完了して、このサービスに習熟してください。
SSH 認証鍵を作成する
ターミナル ウィンドウを開きます。
workingdir
という名前で新しいディレクトリを作成し、そのディレクトリに移動します。mkdir workingdir cd workingdir
新しい GitHub SSH キーを作成します。github-email は GitHub のメールアドレスです。
ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
このコマンドは、パスフレーズなしで新しい SSH 認証鍵
workingdir/id_github
を作成します。SSH 認証鍵がパスフレーズで保護されている場合、Cloud Build はその鍵を使用できません。
シークレット マネージャーに秘密 SSH 認証鍵を保存する
SSH 認証鍵を作成すると、環境内に id_github
ファイルが作成されます。誰でもこのファイルでアカウントを認証できるため、ビルドで使用する前にファイルをシークレット マネージャーに保存する必要があります。
シークレット マネージャーに SSH 認証鍵を保存するには:
Google Cloud コンソールの [Secret Manager] ページに移動します。
[シークレット マネージャー] ページで、[シークレットを作成] をクリックします。
[Secret の作成] ページの [名前] に、Secret の名前を入力します。
[シークレット値] フィールドで [アップロード] をクリックし、
workingdir/id_github
ファイルをアップロードします。[リージョン] セクションは変更しません。
[シークレットを作成] ボタンをクリックします。
これにより、id_github
ファイルがシークレット マネージャーにアップロードされます。
公開 SSH 認証鍵を非公開リポジトリのデプロイキーに追加する
GitHub にログインします。
右上にあるプロフィール写真をクリックし、[プロフィール] をクリックします。
プロフィールページで [リポジトリ] をクリックし、リポジトリの名前をクリックします。
リポジトリで [設定] をクリックします。
サイドバーで [Deploy Keys] をクリックし、[Add deploy key] をクリックします。
タイトルを入力し、
workingdir/id_github.pub
の公開 SSH 認証鍵を貼り付けます。このキーにリポジトリへの書き込みアクセス権を付与する場合は、[Allow write access] を選択します。書き込みアクセス権を持つデプロイ鍵を使用すると、デプロイからリポジトリに push できます。
[キーを追加] をクリックします。
ディスクから SSH 認証鍵を削除します。
rm id_github*
権限を付与する
ビルドに使用するサービス アカウントに Secret Manager にアクセスするための権限を付与する必要があります。
Cloud Build 設定ページを開きます。
プルダウン リストから、ロールを変更するサービス アカウントを選択します。
Secret Manager Secret Accessor
ロールのステータスを [有効] に設定します。
公開 SSH 認証鍵を既知のホストに追加する
ほとんどのマシンには、リモートホスト用の既知のキーを含む known_hosts
という名前のファイルがあります。多くの場合、このキーは初めてリモートホストに接続するときに回収されますが、手動で追加することもできます。このファイルのキーは、リモートホストの ID を確認し、なりすましから保護するために使用されます。
Cloud Build が GitHub に接続するには、Cloud Build のビルド環境の known_hosts
ファイルに公開 SSH 認証鍵を追加する必要があります。これを行うには、キーを一時的な known_hosts.github
ファイルに追加し、known_hosts.github
の内容を Cloud Build のビルド環境の known_hosts
ファイルにコピーします。
workingdir
ディレクトリに known_hosts.github
という名前のファイルを作成し、このファイルに公開 SSH 認証鍵を追加します。
ssh-keyscan -t rsa github.com > known_hosts.github
ビルドを構成する次のセクションで、known_hosts.github
の内容を Cloud Build のビルド環境の known_hosts
ファイルにコピーする手順を Cloud Build 構成ファイルに追加します。
ビルドを構成する
ビルドを構成するには:
cloudbuild.yaml
という名前のビルド構成ファイルを 2 つのステップで作成します。最初のgcloud
ステップで、Secret Manager の SSH 認証鍵にアクセスし、ssh
というボリュームにid_rsa
としてknown_hosts.github
のコピーとともに保存します。ボリュームは、ビルドステップ全体でファイルを永続化するために使用されます。2 番目のgit
ステップでは、id_rsa
の鍵を使用してgit@github.com:git-username/git-repository
のリポジトリに接続します。# Access the id_github file from Secret Manager, and setup SSH steps: - name: 'gcr.io/cloud-builders/git' secretEnv: ['SSH_KEY'] entrypoint: 'bash' args: - -c - | echo "$$SSH_KEY" >> /root/.ssh/id_rsa chmod 400 /root/.ssh/id_rsa cp known_hosts.github /root/.ssh/known_hosts volumes: - name: 'ssh' path: /root/.ssh # Clone the repository - name: 'gcr.io/cloud-builders/git' args: - clone - --recurse-submodules - git@github.com:GIT_USERNAME/GIT_REPOSITORY volumes: - name: 'ssh' path: /root/.ssh availableSecrets: secretManager: - versionName: projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest env: 'SSH_KEY'
上記のコマンドのプレースホルダ値を次のように置き換えます。
GIT_USERNAME
: リポジトリ オーナーの GitHub ユーザー名。GIT_REPOSITORY
: アクセスしたい GitHub リポジトリの名前。PROJECT_ID
: シークレットを保存している Google Cloud プロジェクトの ID。SECRET_NAME
: Secret Manager で作成したシークレットの名前。
上記のスニペットで使用されている YAML の複数行文字列については、YAML の複数行をご覧ください。
ビルドの送信
ビルドを送信するには、次のコマンドを実行します。
gcloud builds submit --config=cloudbuild.yaml .
出力は次のようになります。
Creating temporary tarball archive of 3 file(s) totalling 4.1 KiB before compression.
Uploading tarball of [.] to [gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/[PROJECT-ID]/builds/871b68bc---].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/871b68bc---?project=[PROJECT-ID]].
----------------------------- REMOTE BUILD OUTPUT ------------------------------
starting build "871b68bc-cefc-4411-856c-2a2b7c7d2487"
FETCHSOURCE
Fetching storage object: gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178
Copying gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178...
/ [1 files][ 3.9 KiB/ 3.9 KiB]
Operation completed over 1 objects/3.9 KiB.
BUILD
Step #0: Already have image (with digest): gcr.io/cloud-builders/gcloud
Starting Step #0
Finished Step #0
Step #1: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #1
Step #1: # github.com SSH-2.0-libssh_0.7.0
Finished Step #1
Step #2: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2
Step #2: Cloning into '[REPOSITORY-NAME]'...
Step #2: Warning: Permanently added the RSA host key for IP address 'XXX.XXX.XXX.XXX' to the list of known hosts.
Finished Step #2
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
871b68bc-cefc-4411-856c-2a2b7c7d2487 XXXX-XX-XXT17:57:21+00:00 13S gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz - SUCCESS
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
リポジトリからデプロイ鍵を削除する
GitHub で、リポジトリのメインページに移動します。
リポジトリ名の下にある [設定] をクリックします。
左側のサイドバーで [キーをデプロイ] をクリックします。
[キーをデプロイ] ページで、リポジトリに関連付けられているデプロイキーを探し、[削除] をクリックします。
次のステップ
- GitHub トリガーの作成方法を学習する。
- Cloud Build での暗号化されたリソースの使用について詳細を確認する。
- シークレット マネージャーの詳細を確認する。