プライベート プールを使用してプライベート JFrog Artifactory のリソースにアクセスする


このページでは、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 ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. 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.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Compute Engine, Cloud Build, Service Networking API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Compute Engine, Cloud Build, Service Networking API を有効にします。

    API を有効にする

オプション A: Cloud Shell を使用する

このチュートリアルで使用する、Google Cloud CLI とともにプリインストールされる Cloud Shell を使用して、このチュートリアルを進めることができます。Cloud Shell を使用する場合は、これらのコマンドライン ツールをワークステーションにインストールする必要はありません。

Cloud Shell を使用するには:

  1. Google Cloud コンソールに移動します。

    Google Cloud コンソール

  2. Google Cloud コンソール ウィンドウの上部にある「Cloud Shell をアクティブにする」ボタン [Shell をアクティブにする] ボタン をクリックします。

    Google Cloud コンソールの一番下にある新しいフレームの中で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。

    Cloud Shell セッション

オプション B: ローカルのコマンドライン ツールを使用する

このチュートリアルをワークステーションで行う場合は、次の手順で必要なツールをインストールします。

  1. Google Cloud CLI をインストールする

非公開の Artifactory を作成する

  1. コンテナから Compute Engine インスタンスを作成します。

    gcloud compute instances create-with-container jfrog \
    --container-image docker.bintray.io/jfrog/artifactory-jcr:latest \
    --zone us-central1-a
    
  2. インスタンスに SSH 接続する。コンテナの初期化には数分かかる場合があります。

    gcloud compute ssh --zone us-central1-a jfrog
    
  3. 次のコマンドを実行して接続をテストします。コンテナの準備が整うと、200 HTTP コードが返され、その後に HTML ページが表示されます。

    curl -i http://localhost:8081
    
  4. 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 にファイルをアップロードする

  1. Artifactory にアップロードする txt ファイルを作成します。

    echo "Hello world" >> helloworld.txt
    
  2. 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"
        }
    
  3. exit」と入力して、SSH セッションを終了します。

  4. Artifactory には非公開の内部ソースからのみアクセスできるように、外部 IP アドレスを削除します。

    gcloud compute instances delete-access-config --zone us-central1-a jfrog
    

Artifactory のデータへのアクセスを試す

  1. プロジェクト ID とプロジェクト番号を格納する環境変数を設定します。

    PROJECT_ID=$(gcloud config list --format='value(core.project)')
    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
    
  2. ビルドに使用するサービス アカウントに Compute Engine 閲覧者のロールを付与して、JFrog インスタンスの内部 IP アドレスを表示できるようにします。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:SERVICE_ACCOUNT \
        --role=roles/compute.viewer
    

    ここで、SERVICE_ACCOUNT はサービス アカウントのメールアドレスです。

  3. 次のコードを含む、Artifactory から読み取る cloudbuild.yaml という名前のファイルを作成します。これはビルド構成ファイルです。

    最初のステップで、作成した Artifactory から内部 IP アドレスを取得します。次に、作成した .txt ファイルを読み取るためのリクエストを、そのアドレスに送信します。権限とネットワーク エラーをより簡単に分離できるように、ステップが分離されます。最初のステップが失敗した場合、これは権限エラーが原因です。上のように、Cloud Build サービス アカウントが Compute Engine リソースにアクセスできることを確認する必要があります。2 番目のステップが失敗した場合は、ネットワーク エラーが原因です。このチュートリアルの残りの部分では、ネットワーク構成について説明します。

    steps:
      - id: Get Private Artifactory Address
        name: gcr.io/cloud-builders/gcloud
        entrypoint: /bin/bash
        args:
          - -c
          - |
            gcloud compute instances describe jfrog \
            --zone us-central1-a \
            --format="value(networkInterfaces.networkIP)" >> _INTERNAL_IP_ADDRESS
    
      - id: Pull from Private Artifactory
        name: gcr.io/cloud-builders/curl
        entrypoint: /bin/bash
        args:
          - -c
          - |
            curl -u admin:password --connect-timeout 10.00 \
            http://$(cat _INTERNAL_IP_ADDRESS):8081/artifactory/example-repo-local/helloworld.txt
  4. ビルド構成ファイルを使用してビルドを開始します。

    デフォルトでは、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 ネットワークとサービス プロデューサー ネットワークの間のプライベート接続を作成する

  1. まず、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
    
  2. ワーカーが使用する 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
    
  3. 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
    

プライベート プールを作成する

  1. これで、default VPC ネットワークを Cloud VPC プライベート プールで使用できるようになりました。プライベート プールを作成し、VPC ネットワークとピアリングします。

     gcloud builds worker-pools create jfrog-pool --region us-central1 \
     --peered-network=projects/${PROJECT_ID}/global/networks/default
    
  2. 新しいプライベート プールでビルドを実行するには、gcloud コマンドで --worker-pool フラグを渡すか、プライベート プールを常に使用するように cloudbuild.yaml 構成を更新します。このチュートリアルでは、次のオプションを追加して cloudbuild.yaml を更新します。

    options:
      pool:
        name: 'projects/${PROJECT_ID}/locations/us-central1/workerPools/jfrog-pool'
  3. 完全なファイルは次のようになります。

    steps:
      - id: Get Private Artifactory Address
        name: gcr.io/cloud-builders/gcloud
        entrypoint: /bin/bash
        args:
          - -c
          - |
            gcloud compute instances describe jfrog \
            --zone us-central1-a \
            --format="value(networkInterfaces.networkIP)" >> _INTERNAL_IP_ADDRESS
    
      - id: Pull from Private Artifactory
        name: gcr.io/cloud-builders/curl
        entrypoint: /bin/bash
        args:
          - -c
          - |
            curl -u admin:password --connect-timeout 10.00 \
            http://$(cat _INTERNAL_IP_ADDRESS):8081/artifactory/example-repo-local/helloworld.txt
    
    options:
      pool:
        name: 'projects/${PROJECT_ID}/locations/us-central1/workerPools/jfrog-pool'
  4. ビルドを開始する

     gcloud builds submit --no-source
    
  5. ビルドで VPC ネットワークとピアリングされた新しいプライベート プールを使用すると、Artifactory の内部 IP アドレスにアクセスできるようになります。出力が成功し、Step #1 によって「Hello world」と出力されます。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。

プロジェクトを削除する

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

チュートリアル リソースを削除する

  1. このチュートリアルでデプロイした Compute Engine サービスを削除します。

     gcloud compute instances delete jfrog
    
  2. ファイアウォール ルールを削除します。

     gcloud compute firewall-rules delete allow-private-pools --network=default
    
  3. 予約済みの範囲を削除します。

     gcloud compute addresses delete jfrog-ranges --global
    
  4. Cloud Build プライベート プールを削除します。

     gcloud builds worker-pools delete jfrog-pool
    

次のステップ