使用 SSH 排解 Cloud Run 問題

透過 SSH,您可以與執行中的容器執行個體建立安全互動式殼層連線。這項功能可直接存取容器的檔案系統和執行階段環境,方便您檢查系統資源、驗證設定及排解問題。

Cloud Run 的 SSH 會使用下列服務確保連線安全:

  • Identity-Aware Proxy TCP 轉送會代理 SSH 連線,因此要求必須通過驗證和授權檢查,才能傳送至容器。您可以透過情境感知存取權擴充 IAP 存取政策,根據 IP 位址和使用者裝置等屬性限制存取權。
  • OS 登入 使用 SSH 憑證驗證來驗證使用者。連線時,gcloud CLI 會為您建立效期僅五分鐘的短期 SSH 憑證。容器內會驗證憑證。Google 會在每次登入嘗試時檢查 IAM 權限。

Cloud Run 的 SSH 會自動將必要的 Google 管理二進位檔 (包括 sshd 和驗證憑證的二進位檔) 新增至容器的檔案系統。這些二進位檔只能在 SSH 工作階段期間存取,工作階段結束後就會移除。Cloud Run SSH 會忽略現有的 SSH 設定 (包括 /etc/passwd 項目),改用 Google 管理的設定。

在下列路徑建立 SSH 工作階段時,系統會在容器內掛接 Google 管理的 SSH 依附元件第三方開放原始碼著作權聲明:/usr/share/licenses/google_ssh/THIRD_PARTY_NOTICES。

SSH 工作階段和服務執行個體

使用 SSH 連線至服務時,請注意下列事項:

  • 如果服務沒有任何執行個體,Cloud Run 會為 SSH 工作階段啟動新的執行個體。
  • Cloud Run 的目標是在 SSH 工作階段期間,讓服務執行個體保持運作。執行個體處於啟用狀態時,系統會照常向您收取費用。

限制

SSH 有以下限制:

  • SSH 工作階段最長可持續 24 小時。24 小時後,工作階段會中斷連線,你必須重新連線。
  • IAP 會在閒置一小時後中斷 SSH 工作階段。 詳情請參閱「IAP TCP 轉送已知限制」。
  • SSH 僅適用於在 Cloud Run 的第 2 代環境和 Cloud Run 執行個體上執行的服務。
  • 使用 SSH 時,映像檔中的主機金鑰會遭到覆寫。 SSH 工作階段結束後,金鑰仍會遭到覆寫,直到服務執行個體重新啟動為止。
  • Windows:不支援 PuTTY。使用 OpenSSH 用戶端。
  • 使用 SSH 時,請務必格外小心,確保容器安全無虞。請考慮採用安全性最佳做法,例如以非根使用者身分執行應用程式程式碼。
  • 如果 SSH 連線冷啟動具有容器啟動順序 (container-dependencies) 的多容器服務,要求會在容器環境準備就緒前轉送。Cloud Run 會傳回 HTTP 500 錯誤,並立即停止新的執行個體。如果您使用 Google Cloud CLI 連線,指令會失敗。如要解決這個問題,請僅在執行個體已在執行時,使用 SSH 連線。舉例來說,請先傳送要求給服務來啟動執行個體,或是設定執行個體數量下限。

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,能用於執行、測試及部署工作負載。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. 啟用 Cloud Run Admin API、Cloud Resource Manager API、Identity-Aware Proxy API 和 Cloud OS 登入 API:
      gcloud services enable run.googleapis.com \
          cloudresourcemanager.googleapis.com \
          iap.googleapis.com \
          oslogin.googleapis.com
      
  7. 安裝並初始化 gcloud CLI。
  8. 更新元件:
    gcloud components update
  9. Windows:確認已安裝 OpenSSH 用戶端。

    Windows 10 以上版本通常會預先安裝 OpenSSH 用戶端。如未安裝,請在 PowerShell 中以管理員身分執行下列指令來安裝:

    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

    詳情請參閱「安裝 OpenSSH」。

  10. 查看 Cloud Run 定價頁面。如要根據預測用量估算費用,請使用 Pricing Calculator。SSH 會針對網路輸出位元組數計費。此外,在 SSH 工作階段保持啟用狀態時,系統也會照常向您收取執行個體的費用。
  11. 如果專案使用 VPC Service Controls (VPC-SC),請注意,通道程序會檢查 iaptunnel.googleapis.com 這個服務名稱,而不是 run.googleapis.com。

必要的角色

如要取得完成這些步驟所需的權限,請要求管理員授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

如果您不是專案所屬機構的成員,Cloud Run 會封鎖 SSH 存取權。如要取得 SSH 存取權,請新增 roles/compute.osLoginExternalUser 角色,或使用具備 compute.oslogin.updateExternalUser 權限的自訂角色。

您可以在專案層級授予「受 IAP 保護的通道使用者」角色,如要限制特定 Cloud Run 服務或執行個體的角色,請執行下列指令:

特定服務

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --service=SERVICE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

更改下列內容:

  • SERVICE:服務名稱。
  • REGION:服務部署所在的區域。
  • MEMBER:要授予存取權的身分。

針對特定執行個體

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --instance=INSTANCE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

更改下列內容:

  • INSTANCE:執行個體的名稱。
  • REGION:服務部署所在的區域。
  • MEMBER:要授予存取權的身分。

如要在專案和區域層級授予 roles/iap.tunnelResourceAccessor,請參閱「設定 IAP 存取權政策」。

搭配使用 SSH 與 Cloud Run 服務

設定服務層級的 SSH 存取權,並使用 SSH 連線至服務。

設定服務層級的 SSH 存取權

您可以使用 gcloud CLI 或 YAML,允許特定服務的檢查存取權:

gcloud

如要為現有服務啟用存取權,請使用下列指令:

gcloud beta run services update SERVICE --ssh

您也可以在部署服務時使用 --ssh 旗標,允許檢查服務的存取權。

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定:

    gcloud run services describe SERVICE --format export > service.yaml
  2. 以下範例包含 YAML 設定:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

    更改下列內容:

    • SERVICE:Cloud Run 服務名稱。
    • REGION: Google Cloud 區域,例如 us-central1。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

    gcloud run services replace 指令預設會使用 service.yaml 檔案 (如有)。

您可以使用 gcloud CLI 或 YAML,依服務停用 SSH 存取權:

gcloud

如要停用服務的存取權,請使用下列指令:

gcloud beta run services update SERVICE --no-ssh

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定:

    gcloud run services describe SERVICE --format export > service.yaml
  2. 以下範例包含 YAML 設定:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

    更改下列內容:

    • SERVICE:Cloud Run 服務名稱。
    • REGION: Google Cloud 區域,例如 us-central1。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

    gcloud run services replace 指令預設會使用 service.yaml 檔案 (如有)。

使用 SSH 連線至服務

如要使用 SSH 連線至服務,請使用 gcloud CLI:

如要使用 SSH 連線至服務,請使用下列 Google Cloud CLI 指令:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID

更改下列內容:

  • SERVICE:服務名稱。
  • REGION:服務部署所在的區域。
  • PROJECT_ID: Google Cloud 專案 ID。

    如果系統提示您輸入安全殼層金鑰的通關密語,可以留空。不過,如果您輸入密碼片語,請務必在同一個工作區的後續 SSH 工作階段中使用相同的密碼片語。

    SSH 工作階段成功完成後,Cloud Run 會顯示以下訊息:

    Project: PROJECT_ID
    Region: REGION
    Service: SERVICE
    Revision: REVISION
    Instance: INSTANCE_ID
    Container: CONTAINER
    Image: IMAGE
    

    如要結束 SSH 工作階段,請輸入 exit。只要容器保持運作,您對容器所做的任何變更都會保留。結束工作階段不會重新啟動或終止容器。

指定服務執行個體

如要使用 SSH 連線至特定服務執行個體,請使用 Google Cloud CLI。

如要使用 SSH 連線至 Cloud Run 服務執行個體,請使用下列 Google Cloud CLI 指令:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --instance=INSTANCE_ID

更改下列內容:

  • SERVICE:服務名稱。
  • REGION:服務部署所在的區域。
  • PROJECT_ID: Google Cloud 專案 ID。
  • INSTANCE_ID:執行個體 ID。如要找出服務執行個體 ID,請前往「可觀測性」部分的「記錄」頁面。執行個體 ID 位於記錄項目的 labels 欄位中。如果您在連線前終止特定執行個體,就找不到執行個體 ID。

指定修訂版本

如要使用 SSH 連線至特定修訂版本,請使用 Google Cloud CLI。

如要使用 SSH 連線至 Cloud Run 服務修訂版本,請使用下列 Google Cloud CLI 指令:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --revision=REVISION

更改下列內容:

  • SERVICE:服務名稱。
  • REGION:服務部署所在的區域。
  • PROJECT_ID: Google Cloud 專案 ID。
  • REVISION:修訂版本名稱。

透過 SSH 連入 Cloud Run 執行個體

設定執行個體層級的 SSH 存取權,並使用 SSH 連線至執行個體。

設定執行個體層級的 SSH 存取權

執行個體預設會啟用 SSH。

您可以使用 gcloud CLI 或 YAML,依執行個體停用 SSH 存取權:

gcloud

如要在執行個體上停用存取權,請使用下列指令:

gcloud beta run instances update INSTANCE --no-ssh

YAML

  1. 如果您要建立新的執行個體,請跳過這個步驟。 如要更新現有執行個體,請下載其 YAML 設定:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. 以下範例包含 YAML 設定:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

    更改下列內容:

    • INSTANCE:Cloud Run 執行個體的名稱。
    • REGION: Google Cloud 區域,例如 us-central1。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。
  3. 使用下列指令建立或更新執行個體:

    gcloud beta run instances replace instance.yaml

您可以使用 gcloud CLI 或 YAML,允許檢查特定執行個體。

gcloud

如要在現有執行個體上啟用存取權,請使用下列指令:

gcloud beta run instances update INSTANCE --ssh

您也可以在部署執行個體時使用 --ssh 標記,允許檢查執行個體。

YAML

  1. 如果您要建立新的執行個體,請跳過這個步驟。 如要更新現有執行個體,請下載其 YAML 設定:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. 以下範例包含 YAML 設定:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

    更改下列內容:

    • INSTANCE:Cloud Run 執行個體的名稱。
    • REGION: Google Cloud 區域,例如 us-central1。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。
  3. 使用下列指令建立或更新執行個體:

    gcloud beta run instances replace instance.yaml

透過 SSH 連線至執行個體

如要使用 SSH 連線至執行個體,請使用下列 Google Cloud CLI 指令:

  gcloud beta run instances ssh INSTANCE --region=REGION --project=PROJECT_ID

更改下列內容:

  • INSTANCE:執行個體的名稱。
  • REGION:服務部署所在的區域。
  • PROJECT_ID: Google Cloud 專案 ID。

如果系統提示您輸入安全殼層金鑰的通關密語,可以留空。不過,如果您輸入密碼片語,請務必在同一個工作區的後續 SSH 工作階段中使用相同的密碼片語。

SSH 工作階段成功完成後,Cloud Run 會顯示以下訊息:

  Project: PROJECT_ID
  Region: REGION
  Instance: INSTANCE
  Revision: REVISION
  Container: CONTAINER
  Image: IMAGE

如要結束 SSH 工作階段,請輸入 exit。

使用 OpenSSH 用戶端連線

如要使用 OpenSSH 用戶端連線,請按照下列步驟操作:

  1. 在目標服務上執行 gcloud beta run services ssh 指令。這會啟動 SSH 通道並產生憑證。
  2. 在 SSH 設定中新增下列內容:

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile /Users/USER/.ssh/google_compute_engine
        CertificateFile /Users/USER/.ssh/google_compute_engine_cert/PROJECT_ID_REGION_SERVICE-cert.pub
        CheckHostIP no
        HashKnownHosts no
        HostKeyAlias cloud-run-default
        IdentitiesOnly yes
        StrictHostKeyChecking no
        UserKnownHostsFile /dev/null
        ProxyUseFdpass no
        ProxyCommand /usr/local/bin/python3 -S /Users/USER/google-cloud-sdk/lib/gcloud.py beta run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE --region=REGION
    

    更改下列內容:

    • USER:本機的使用者名稱。
    • PROJECT_ID: Google Cloud 專案 ID。
    • PROJECT_NUMBER: Google Cloud 專案編號。
    • REGION:服務部署所在的區域。
    • SERVICE:服務名稱。

    如果 gcloud CLI 安裝在其他資料夾,您可能需要更新最後一行中的位置。

  3. 執行下列指令:

    ssh cloud-run-ssh
    

SSH 憑證會在五分鐘後失效。如果五分鐘後嘗試與服務建立 SSH 連線,請務必重新執行 gcloud beta run services ssh,重新產生憑證。

SSH 存取記錄

如要擷取 SSH 金鑰管理作業的稽核記錄,請為 Cloud OS 登入 API 啟用稽核記錄。請參閱「查看 OS 登入稽核記錄」。 如要存取 Cloud Run 資源的 SSH 記錄,您必須有該專案的 Cloud 稽核記錄存取權。

以下範例會查詢過去一天的所有 Cloud Run 服務:

gcloud logging read '
  logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" AND
  protoPayload.serviceName="oslogin.googleapis.com" AND
  protoPayload.request.instance:"run.googleapis.com"
' --project=PROJECT_ID \
  --freshness=1d \
  --format="table(timestamp, protoPayload.authenticationInfo.principalSubject:label=USER, protoPayload.request.instance:label=CLOUD_RUN_SERVICE)"

保護及控管 SSH 存取權

您可以控管哪些人可以使用 SSH,以及在環境中如何限制 SSH。

使用機構政策停用 SSH 存取權

如要設定組織政策來停用 SSH,請使用自訂限制,禁止在 Cloud Run 服務上啟用 SSH 偵錯存取權。

後續步驟