プライベート プールを使用してプライベート 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. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  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. 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
    
  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. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

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

  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
    

次のステップ