このページでは、Cloud Build プライベート プールを使用して、プライベート Virtual Private Cloud ネットワークからリソースにアクセスする方法について説明します。
このチュートリアルでは、プライベート VPC ネットワークでホストされている Compute Engine に JFrog Artifactory を作成し、プライベート プールで実行されるビルドを構成して、その Artifactory からデータにアクセスします。Jfrog Artifactory はオープンソースのバイナリ リポジトリ マネージャーです。
非公開の 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次のコマンドを実行して接続をテストします。コンテナの準備が整うと、
200HTTP コードが返され、その後に HTML ページが表示されます。curl -i http://localhost:8081Artifactory でリポジトリを作成するには、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.txtJFrog にはデフォルトのサンプル リポジトリが用意されています。デフォルトの認証情報を使用してリポジトリにアップロードします。
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 アドレスを表示できるように、ビルドに使用しているサービス アカウントに Compute Engine 閲覧者のロールを付与します。
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT \ --role=roles/compute.viewerここで、SERVICE_ACCOUNT はサービス アカウントのメールアドレスです。
次のコードを含む、Artifactory から読み取る
cloudbuild.yamlという名前のファイルを作成します。これはビルド構成ファイルです。最初のステップで、作成した Artifactory から内部 IP アドレスを取得します。 次のステップでは、作成した
helloworld.txtファイルを読み取るためのリクエストを、そのアドレスに送信します。権限とネットワーク エラーをより簡単に分離できるように、ステップが分離されます。 最初のステップが失敗した場合、これは権限エラーが原因です。前のステップで説明したように、ビルドサービス アカウントが 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: 7Cloud 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=defaultService 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
プライベート プールを作成する
これで、
defaultVPC ネットワークを 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」と出力されます。