このページでは、Cloud Build プライベート プールを使用して、プライベート Virtual Private Cloud ネットワークからリソースにアクセスする方法について説明します。
このチュートリアルでは、プライベート VPC ネットワークでホストされている Compute Engine に JFrog Artifactory を作成し、プライベート プールで実行されるビルドを構成して、その Artifactory からデータにアクセスします。Jfrog Artifactory はオープンソースのバイナリ リポジトリ マネージャーです。
目標
- Compute Engine で Jfrog Artifactory を設定する
- Artifactory にファイルをアップロードする
- プライベート プールの作成
- プライベート プールをホストするサービス プロデューサー ネットワークを Artifactory の Virtual Private Cloud ネットワークにピアリングする
- ビルド構成ファイルを作成し、Artifactory のデータにアクセスする
費用
このドキュメントでは、課金対象である次の Google Cloud コンポーネントを使用します。
- Compute Engine
- Cloud Build
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Compute Engine, Cloud Build, Service Networking API を有効にします。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Compute Engine, Cloud Build, Service Networking API を有効にします。
オプション A: Cloud Shell を使用する
このチュートリアルで使用する、Google Cloud CLI とともにプリインストールされる Cloud Shell を使用して、このチュートリアルを進めることができます。Cloud Shell を使用する場合は、これらのコマンドライン ツールをワークステーションにインストールする必要はありません。
Cloud Shell を使用するには:
Google Cloud コンソールに移動します。
Google Cloud コンソール ウィンドウの上部にある「Cloud Shell をアクティブにする」ボタン
をクリックします。
Google Cloud コンソールの一番下にある新しいフレームの中で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。
オプション B: ローカルのコマンドライン ツールを使用する
このチュートリアルをワークステーションで行う場合は、次の手順で必要なツールをインストールします。
非公開の Artifactory を作成する
コンテナから Compute Engine インスタンスを作成します。
gcloud compute instances create-with-container jfrog \ --container-image docker.bintray.io/jfrog/artifactory-jcr:latest \ --zone us-central1-a
インスタンスに SSH 接続する。コンテナの初期化には数分かかる場合があります。
gcloud compute ssh --zone us-central1-a jfrog
次のコマンドを実行して接続をテストします。コンテナの準備が整うと、
200
HTTP コードが返され、その後に HTML ページが表示されます。curl -i http://localhost:8081
Artifactory でリポジトリを作成するには、JFrog EULA(エンドユーザー使用許諾契約)に署名する必要があります。
curl -XPOST -vu admin:password http://localhost:8081/artifactory/ui/jcr/eula/accept
出力は次のようになります。
* Trying 127.0.0.1:8081... * Connected to localhost (127.0.0.1) port 8081 (#0) * Server auth using Basic with user 'admin' > POST /artifactory/ui/jcr/eula/accept HTTP/1.1 > Host: localhost:8081 > Authorization: Basic …. > User-Agent: curl/7.74.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < X-JFrog-Version: Artifactory/7.19.9 71909900 < X-Artifactory-Id: …. < X-Artifactory-Node-Id: jfrog2 < SessionValid: false < Content-Length: 0 < Date: Fri, 25 Jun 2021 19:08:10 GMT * Connection #0 to host localhost left intact
Artifactory にファイルをアップロードする
Artifactory にアップロードする txt ファイルを作成します。
echo "Hello world" >> helloworld.txt
JFrog にはデフォルトのサンプル リポジトリが用意されています。デフォルトの認証情報を使用してリポジトリにアップロードします。
curl -u admin:password -X PUT \ "http://localhost:8081/artifactory/example-repo-local/helloworld.txt" \ -T helloworld.txt
次のような出力が返されます
{ "repo" : "example-repo-local", "path" : "/helloworld.txt", "created" : "2021-06-25T19:08:24.176Z", "createdBy" : "admin", "downloadUri" : "http://localhost:8081/artifactory/example-repo-local/helloworld.txt", "mimeType" : "text/plain", "size" : "12", "checksums" : { "sha1" : "...", "md5" : "...", "sha256" : "..." }, "originalChecksums" : { "sha256" : "..." }, "uri" : "http://localhost:8081/artifactory/example-repo-local/helloworld.txt" }
「
exit
」と入力して、SSH セッションを終了します。Artifactory には非公開の内部ソースからのみアクセスできるように、外部 IP アドレスを削除します。
gcloud compute instances delete-access-config --zone us-central1-a jfrog
Artifactory のデータへのアクセスを試す
プロジェクト ID とプロジェクト番号を格納する環境変数を設定します。
PROJECT_ID=$(gcloud config list --format='value(core.project)') PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
JFrog インスタンスの内部 IP アドレスを表示できるように、Cloud Compute サービス アカウントに Compute Engine 閲覧者のロールを付与します。
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \ --role=roles/compute.viewer
次のコードを含む、Artifactory から読み取る
cloudbuild.yaml
という名前のファイルを作成します。これはビルド構成ファイルです。最初のステップで、作成した Artifactory から内部 IP アドレスを取得します。次に、作成した .txt ファイルを読み取るためのリクエストを、そのアドレスに送信します。権限とネットワーク エラーをより簡単に分離できるように、ステップが分離されます。最初のステップが失敗した場合、これは権限エラーが原因です。上のように、Cloud Build サービス アカウントが Compute Engine リソースにアクセスできることを確認する必要があります。2 番目のステップが失敗した場合は、ネットワーク エラーが原因です。このチュートリアルの残りの部分では、ネットワーク構成について説明します。
ビルド構成ファイルを使用してビルドを開始します。
デフォルトでは、Cloud Build でビルドを実行すると、ビルドは公共のインターネットにアクセスできる安全なホスト環境で実行されます。各ビルドは独自のワーカー上で実行され、他のワークロードから分離されます。デフォルトのプールには、環境(特にプライベート ネットワーク アクセス)をカスタマイズできる範囲に制限があります。この例では、パブリック ワーカーからプライベート ネットワークにアクセスしようとしています。
次のコマンドで
cloudbuild.yaml
を実行します。これは失敗するはずです。gcloud builds submit --no-source
出力は、以下のようになります。
BUILD Starting Step #0 - "Get Private Artifactory Address" Step #0 - "Get Private Artifactory Address": Already have image (with digest): gcr.io/cloud-builders/gcloud Finished Step #0 - "Get Private Artifactory Address" Starting Step #1 - "Pull from Private Artifactory" Step #1 - "Pull from Private Artifactory": Already have image (with digest): gcr.io/cloud-builders/curl Step #1 - "Pull from Private Artifactory": % Total % Received % Xferd Average Speed Time Time Time Current Step #1 - "Pull from Private Artifactory": Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0curl: (7) Failed to connect to 10.128.0.2 port 8081: Connection timed out Finished Step #1 - "Pull from Private Artifactory" ERROR ERROR: build step 1 "gcr.io/cloud-builders/curl" failed: step exited with non-zero status: 7
Cloud Build が内部 IP アドレスに到達できない接続タイムアウトを確認できます。このプライベート リソースにアクセスするには、Cloud Build プライベート プールを使用する必要があります。
Artifactory の VPC ネットワークとサービス プロデューサー ネットワークの間のプライベート接続を作成する
まず、VPC ネットワークで上り(内向き)が許可されていることを確認します。
jfrog
インスタンスを使用してネットワークへの受信内部トラフィックを許可するファイアウォール ルールを作成します。範囲10.0.0.0/16
はプライベート アドレス空間にあります。これは、次のステップで Cloud Build のプライベート プールに使用します。gcloud compute firewall-rules create allow-private-pools --direction=INGRESS \ --priority=1000 --network=default --action=ALLOW --rules=all --source-ranges=10.0.0.0/16
ワーカーが使用する Cloud Build のプライベート プール用に予約済みの範囲を作成します。予約済みの範囲は、Artifactory が配置されているネットワーク内に存在する必要があります。この場合、これは
default
コンピューティング ネットワークです。予約済みの範囲を設定する方法は 2 つあります。
--addresses
と--prefix-length
で範囲を明示的に指定することも、指定されたprefix-length
に基づいて使用可能な範囲を Google Cloud にプロビジョニングさせることもできます。以下の例では、作成したファイアウォール ルールに一致するようにアドレスを明示的に設定しています。プライベート プールではこのアドレス空間を使用し、受信トラフィックはブロックされません。
gcloud compute addresses create jfrog-ranges --global --purpose=VPC_PEERING \ --addresses=10.0.0.0 --prefix-length=16 --network=default
Service Networking API と VPC ネットワークをピアリングします。
Cloud Build のプライベート プールは、Service Networking API を使用してワーカーを実行します。これにより、内部 IP アドレスでマネージド サービスを提供できます。これは、Cloud Build のプライベート プール ワーカーを実行している Google 管理 VPC を、独自の VPC とピアリングすることで実現されます。(完了するまで数分ほどかかる場合があります)
gcloud services vpc-peerings connect --service=servicenetworking.googleapis.com \ --ranges=jfrog-ranges --network=default
プライベート プールを作成する
これで、
default
VPC ネットワークを Cloud VPC プライベート プールで使用できるようになりました。プライベート プールを作成し、VPC ネットワークとピアリングします。gcloud builds worker-pools create jfrog-pool --region us-central1 \ --peered-network=projects/${PROJECT_ID}/global/networks/default
新しいプライベート プールでビルドを実行するには、
gcloud
コマンドで--worker-pool
フラグを渡すか、プライベート プールを常に使用するようにcloudbuild.yaml
構成を更新します。このチュートリアルでは、次のオプションを追加してcloudbuild.yaml
を更新します。完全なファイルは次のようになります。
ビルドを開始する
gcloud builds submit --no-source
ビルドで VPC ネットワークとピアリングされた新しいプライベート プールを使用すると、Artifactory の内部 IP アドレスにアクセスできるようになります。出力が成功し、
Step #1
によって「Hello world」と出力されます。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
チュートリアル リソースを削除する
このチュートリアルでデプロイした Compute Engine サービスを削除します。
gcloud compute instances delete jfrog
ファイアウォール ルールを削除します。
gcloud compute firewall-rules delete allow-private-pools --network=default
予約済みの範囲を削除します。
gcloud compute addresses delete jfrog-ranges --global
Cloud Build プライベート プールを削除します。
gcloud builds worker-pools delete jfrog-pool
次のステップ
- プライベート プールでよく使用されるプライベート ネットワーク設定を構成する方法を学習する。
- プライベート プールで VPC Service Controls を使用する方法を確認する。