Apigee とサウスバウンド PSC ターゲットの接続に関する問題

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
このトピックに対応する Apigee Edge のドキュメントはありません。

症状

Apigee と、Private Service Connect(PSC)によって接続されたサウスバウンド ターゲット サービスの間のネットワーク接続に関する問題。

エラー メッセージ

Apigee とターゲット サービスの間のネットワーク接続に関する問題や TCP タイムアウトは、503 エラー レスポンスとして表示されます。デバッグ セッションを作成すると、次のようなエラーが表示されます。

{"fault":{"faultstring":"The Service is temporarily unavailable","detail":{"errorcode":"messaging.adaptors.http.flow.ServiceUnavailable","reason":"TARGET_CONNECT_TIMEOUT"}}}

考えられる原因

原因 説明
サービス アタッチメントと Apigee インスタンスの間のリージョンが異なる Apigee インスタンス リージョンとサービス アタッチメント リージョンが異なります。
ターゲット プロジェクトで PSC サブネットの上り(内向き)ファイアウォール ルールが設定されていない ターゲット プロジェクトに、PSC サブネット範囲の IP アドレスとポートを許可する上り(内向き)ファイアウォール ルールが設定されていることを確認します。
ターゲット プロジェクトのサービス アタッチメントの構成が正しくない ターゲット プロジェクトのサービス アタッチメントを確認します。
Apigee のエンドポイント アタッチメントの状態が正しくない Apigee でエンドポイント アタッチメントを確認します。
TargetEndpoint と ILB に設定されたポートが一致しない API プロキシの TargetEndpoint が、ターゲット プロジェクトの内部ロードバランサ(ILB)で公開されているのと同じポートを使用していることを確認します。

原因: サービス アタッチメントと Apigee インスタンスのリージョンが異なる

診断

  1. 次のいずれかの方法で Apigee インスタンスのリージョンを確認します。

    1. 従来の Apigee UI を使用する場合:
      1. Apigee UI にログインします。
      2. [Admin] > [Instances] をクリックします。
      3. インスタンスをクリックします。
      4. [Instance details] ペインでランタイム ホスティングのロケーションを確認します。
    2. Google Cloud コンソールで Apigee UI を使用する場合:
      1. Google Cloud コンソールで、[Apigee インスタンス] ページに移動します。

        [Apigee インスタンス] に移動

      2. インスタンスをクリックします。
      3. [インスタンスの詳細] ペインでランタイム ホスティングのロケーションを確認します。
    3. API 呼び出しを使用する場合:
      curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME/instances"
      

      ここで ORG_NAME は組織の名前です。例: example-apigee-support

      次のような内容が返されます。ランタイム ホスティングのロケーションの値は、以下の location に示されています。例: asia-northeast1

      "instances": [
        {
          "name": "asia-northeast1",
          "location": "asia-northeast1",
          "host": "10.117.0.2",
          "port": "443",
          "createdAt": "1628150049760",
          "lastModifiedAt": "1682139265367",
          "diskEncryptionKeyName": "projects/apigee-x-support-apac-05/locations/asia-northeast1/keyRings/phanim-disk-key-1/cryptoKeys/phanim-disk-key-ring-1",
          "state": "ACTIVE",
          "peeringCidrRange": "SLASH_20",
          "runtimeVersion": "1-9-0-apigee-25",
          "consumerAcceptList": [
            "example-apigee-support",
            "example-neg-project"
          ],
          "serviceAttachment": "projects/xb363132eb41cb643p-tp/regions/asia-northeast1/serviceAttachments/apigee-asia-northeast1-yp9o"
        }
  2. API 呼び出しを使用して、エンドポイント アタッチメントのリージョンを確認します。
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME/endpointAttachments/ENDPOINT_ATTACHMENT_NAME"
    

    ここで

    • ORG_NAME は組織の名前です。例: example-apigee-support
    • ENDPOINT_ATTACHMENT_NAME は、エンドポイント アタッチメントの名前です。例: example-ea

    次のような内容が返されます。エンドポイント アタッチメントのリージョンは、以下の location に示されている値です。例: asia-northeast1

    {
      "name": "organizations/example-apigee-support/endpointAttachments/example-ea",
      "location": "asia-northeast1",
      "host": "7.0.4.2",
      "state": "ACTIVE",
      "connectionState": "ACCEPTED",
      "serviceAttachment": "projects/target-project/regions/asia-northeast1/serviceAttachments/gkebackend"
    }
    
  3. Cloud コンソールを使用して、サービス アタッチメント リージョンを確認します。
    1. Google Cloud コンソールで、[Private Service Connect] ページに移動します。

      [Private Service Connect] に移動

    2. [リージョン] 列でロケーションを確認します。

解決策

Apigee インスタンスエンドポイント アタッチメントサービス アタッチメントのリージョンが同じであることを確認します。例: asia-northeast1

制限事項で説明されているように、グローバル アクセスはサポートされていません。つまり、サービス アタッチメントとエンドポイント アタッチメントは同じリージョン内に存在している必要があります。たとえば、Apigee インスタンスがリージョン us-west1 にある場合、us-east2 や他のリージョンにあるサービスを接続することはできません。

リージョンが異なると、Apigee とターゲット サービスの間の接続に関する問題が発生します。

原因: ターゲット プロジェクトで PSC サブネットの上り(内向き)ファイアウォール ルールが設定されていない

診断

PSC サブネット範囲の IP アドレスからターゲット サービスへの接続を許可するファイアウォール ルールがターゲット プロジェクトで設定されていることを確認します。

  1. Google Cloud コンソールで [ファイアウォール] ページに移動します。

    [ファイアウォール] に移動

  2. [VPC ファイアウォール ルール] ペインで、次の例のようなルールが存在することを確認します。
    • 方向: 上り(内向き)
    • 一致したときのアクション: 許可
    • ソースフィルタ: IPv4 / IPv6 範囲
    • IP 範囲: PSC サブネットの IP アドレス範囲(ipCidrRange)。次の gcloud コマンドで PSC サブネットの説明を取得できます。
      gcloud compute networks subnets describe PSC_SUBNET_NAME --region=REGION

      ここで

      • PSC_SUBNET_NAME は PCS サブネット名です。例: pscsub
      • REGION はロケーションです。例: asia-northeast1

      次のような内容が返されます。

      creationTimestamp: '2023-04-19T03:33:29.371-07:00'
      fingerprint: 1JPKY66teTg=
      gatewayAddress: 10.10.0.1
      id: '5645967773396008342'
      ipCidrRange: 10.10.0.0/24
      kind: compute#subnetwork
      name: pscsub
      network: https://www.googleapis.com/compute/v1/projects/target-project/global/networks/default
      privateIpGoogleAccess: false
      privateIpv6GoogleAccess: DISABLE_GOOGLE_ACCESS
      purpose: PRIVATE_SERVICE_CONNECT
      ....
    • プロトコルとポート: ターゲット サービスの構成に従って一覧に表示されるはずです。
  3. 次に例を示します。

解決策

ファイアウォール ルールが設定されていない場合は、サービス アタッチメントを作成するの手順 2 で説明されているとおりに PSC サブネットを作成します。

原因: ターゲット プロジェクトのサービス アタッチメントの構成が正しくない

診断

次のいずれかの方法でサービス アタッチメントのリージョンを確認します。

  1. Cloud コンソールを使用する場合:
    1. Google Cloud コンソールで、[Private Service Connect] ページに移動します。

      [Private Service Connect] に移動

    2. [公開サービス] をクリックします。
    3. サービスをクリックします。
    4. [リージョン] 行でロケーションを確認します。

  2. gcloud command を使用する場合:
      gcloud compute service-attachments describe SERVICE_ATTACHMENT --region=REGION

    ここで

    • SERVICE_ATTACHMENT は、サービス アタッチメント名です。例: gkebackend
    • REGION はロケーションです。例: asia-northeast1

    次のような内容が返されます。

    connectedEndpoints:
    - endpoint: https://www.googleapis.com/compute/v1/projects/xb363132eb41cb643p-tp/regions/asia-northeast1/forwardingRules/example-ea
      pscConnectionId: '6816512648152066'
      status: ACCEPTED
    connectionPreference: ACCEPT_AUTOMATIC
    creationTimestamp: '2023-04-19T05:09:09.941-07:00'
    description: ''
    enableProxyProtocol: false
    fingerprint: 0BZDAZ3zDCs=
    id: '4503680255626733322'
    kind: compute#serviceAttachment
    name: gkebackend
    natSubnets:
    - https://www.googleapis.com/compute/v1/projects/target-project/regions/asia-northeast1/subnetworks/pscsub
    pscServiceAttachmentId:
      high: '21570167574103266'
      low: '4503680255626733322'
    region: https://www.googleapis.com/compute/v1/projects/target-project/regions/asia-northeast1
    selfLink: https://www.googleapis.com/compute/v1/projects/target-project/regions/asia-northeast1/serviceAttachments/gkebackend
    targetService: https://www.googleapis.com/compute/v1/projects/target-project/regions/asia-northeast1/forwardingRules/k8s2-tcp-b65prv8v-default-ilb-svc-tv2s6klz

解決策

  1. connectedEndpoints.endpoint の値が Apigee のテナント プロジェクトを参照していて、ステータスが ACCEPTED であることを確認します。テナント プロジェクトは、Apigee 組織 API で検索できます。
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME"

    ここで ORG_NAME は組織の名前です。例: example-apigee-support

    次のような内容が返されます。ID は apigeeProjectId という名前のフィールドにあります。例: xb363132eb41cb643p-tp

    {
      "name": "example-apigee-support",
      "createdAt": "1628148440954",
      "lastModifiedAt": "1650563608527",
      "environments": [
      "dev"
      ],
      "properties": {
        "property": [
          {
            "name": "features.mart.connect.enabled",
            "value": "true"
          },
          {
            "name": "features.hybrid.enabled",
            "value": "true"
          }
        ]
      },
        "analyticsRegion": "asia-northeast1",
        "authorizedNetwork": "default",
        "runtimeType": "CLOUD",
        "subscriptionType": "PAID",
        "caCertificate": "CERTIFICATE_NUMBER",
        "runtimeDatabaseEncryptionKeyName": "projects/example-apigee-support/locations/asia-northeast1/keyRings/phanim-key-ring-1/cryptoKeys/phanim-app-key-1",
        "projectId": "example-apigee-support",
        "state": "ACTIVE",
        "billingType": "SUBSCRIPTION",
        "addonsConfig": {
        "advancedApiOpsConfig": {},
        "integrationConfig": {},
        "monetizationConfig": {}
        },
    "apigeeProjectId": "xb363132eb41cb643p-tp"
    }
    
  2. サウスバウンド ネットワーキング パターンのアタッチメント接続の確認と管理で説明されているとおりに、サービス アタッチメントエンドポイント アタッチメントと接続していることを確認します。手順 1 の UI で次のことを確認します。
    1. [サブネット] 行が PSC サブネットを参照している。例: pscsub
    2. [ターゲット] 行がターゲット バックエンドの正しい内部ロードバランサを参照している。

原因: Apigee のエンドポイント アタッチメントの状態が正しくない

診断

API 呼び出しを使用して、Apigee のエンドポイント アタッチメントを表示します。

  curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME/endpointAttachments/ENDPOINT_ATTACHMENT_NAME"

ここで

  • ORG_NAME は組織の名前です。例: example-apigee-support
  • ENDPOINT_ATTACHMENT_NAME は、エンドポイント アタッチメントの名前です。例: example-ea

次のような内容が返されます。

  {
    "name": "organizations/example-apigee-support/endpointAttachments/example-ea",
    "location": "asia-northeast1",
    "host": "7.0.4.2",
    "state": "ACTIVE",
    "connectionState": "ACCEPTED",
    "serviceAttachment": "projects/target-project/regions/asia-northeast1/serviceAttachments/gkebackend"
  }

解決策

次のことを確認します。

  • stateACTIVE である
  • connectionStateACCEPTED である
  • serviceAttachment は、正しいターゲット プロジェクトとサービス アタッチメント名を参照している

原因: TargetEndpoint と ILB に設定されたポートが一致しない

診断

  1. ターゲット プロジェクトで、Cloud コンソールを使用して転送ルールが公開しているポートを検索します。
    1. Google Cloud コンソールで、[Private Service Connect] ページに移動します。

      [Private Service Connect] に移動

    2. [公開サービス] をクリックします。
    3. サービスをクリックします。次の例に示すように、ポート 80 が公開されています。

解決策

同じポート 80 が API プロキシの TargetEndpoint のポートであることを確認します。

これを確認するには、API プロキシに移動して TargetEndpoint の URL を確認します。

  1. 従来の Apigee UI を使用する場合:
    1. Apigee UI にログインします。
    2. [Develop] > [API Proxies] をクリックします。
    3. プロキシをクリックします。
    4. [Develop] をクリックします。
    5. [XML] ペインで次の内容を確認します。
      <HTTPTargetConnection>
        <URL>http://7.0.4.2:80</URL>
      </HTTPTargetConnection>
  2. Google Cloud コンソールで Apigee UI を使用する場合:
    1. Google Cloud コンソールで、[Apigee] ページに移動します。

      Apigee に移動

    2. [プロキシ開発] エリアで、[API プロキシ] をクリックします。
    3. プロキシをクリックします。
    4. [開発] をクリックします。
    5. [XML] ペインで次の内容を確認します。
        <HTTPTargetConnection>
          <URL>http://7.0.4.2:80</URL>
        </HTTPTargetConnection>

診断情報の収集が必要な場合

上記の手順でも問題が解決しない場合は、次の診断情報を収集して Google Cloud カスタマーケアに連絡してください。

  • Apigee 組織
  • 問題が生じている環境と API プロキシ
  • ダウンロードしたデバッグ セッション(ここで上記のすべての情報が提供されます)
  • 使用しているエンドポイント アタッチメント
  • ターゲット プロジェクトとサービス アタッチメント