Apigee 與南向 PSC 目標的連線問題

您目前查看的是 ApigeeApigee Hybrid 說明文件。
這個主題沒有對應的 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. 依序點選「管理」 >「執行個體」
      3. 按一下執行個體。
      4. 查看「執行階段代管位置」,位於「執行個體詳細資料」窗格中。
    2. 在 Google Cloud 控制台中使用 Apigee UI:
      1. 前往 Google Cloud 控制台的「Apigee Instances」(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 控制台的「Firewall」(防火牆) 頁面。

    前往「Firewall」(防火牆) 頁面

  2. 在「虛擬私有雲防火牆規則」窗格中,確認有類似下列範例的規則:
    • 方向:輸入
    • 相符時執行的動作:允許
    • 來源篩選器: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 Console:
    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 Organizations 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"
  }

解析度

請確認以下事項:

  • state」這個價格ACTIVE
  • connectionState」這個價格ACCEPTED
  • serviceAttachment 是指正確的目標專案和服務連結名稱

原因:TargetEndpoint 中設定的通訊埠與 ILB 不符

診斷

  1. 在目標專案中,使用 Cloud 控制台找出轉送規則公開的連接埠:
    1. 前往 Google Cloud 控制台的「Private Service Connect」 頁面。

      前往 Private Service Connect

    2. 按一下「已發布的服務」
    3. 按一下所需服務。如下列範例所示,通訊埠 80 會公開。

解析度

確認 API Proxy 中的通訊埠也是通訊埠 80。TargetEndpoint

如要檢查這點,請前往 API Proxy 並驗證 TargetEndpoint URL:

  1. 使用傳統版 Apigee UI:
    1. 登入 Apigee UI
    2. 依序點選「開發」>「API Proxy」
    3. 按一下 Proxy。
    4. 按一下「開發」
    5. 檢查 XML 窗格是否出現下列情況:
      <HTTPTargetConnection>
        <URL>http://7.0.4.2:80</URL>
      </HTTPTargetConnection>
  2. 在 Google Cloud 控制台中使用 Apigee UI:
    1. 前往 Google Cloud 控制台的「Apigee」頁面。

      前往 Apigee

    2. 在「Proxy 開發」區域中,按一下「API Proxy」
    3. 按一下 Proxy。
    4. 按一下「開發」
    5. 檢查 XML 窗格是否有下列項目:
        <HTTPTargetConnection>
          <URL>http://7.0.4.2:80</URL>
        </HTTPTargetConnection>

必須收集診斷資訊

如果按照上述操作說明後問題仍未解決,請收集下列診斷資訊,然後與 Google Cloud Customer Care 團隊聯絡:

  • Apigee 組織
  • 發生問題的環境和 API Proxy
  • 下載的偵錯工作階段 (這會提供上述所有資訊)
  • 使用的端點連結
  • 目標專案和服務連結