使用 SSH 排解 Cloud Run 問題

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

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

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

限制

SSH 有以下限制:

  • SSH 僅適用於在 Cloud Run 的第 2 代環境和 Cloud Run 執行個體上執行的服務。
  • 使用 SSH 時,映像檔中的主機金鑰會遭到覆寫。 SSH 工作階段結束後,金鑰仍會遭到覆寫,直到服務執行個體重新啟動為止。
  • Windows:不支援 PuTTY。使用 OpenSSH 用戶端。
  • 使用 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 \
          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 網路輸出位元組的費用。
  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: my-project
    Region: REGION
    Service: busybox
    Revision: busybox-REVISION
    Instance:
    INSTANCE-ID
    Container: busybox-1
    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: my-project
  Region: REGION
  Instance: INSTANCE
  Revision: REVISION
  Container: CONTAINER
  Image: IMAGE

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

使用 OpenSSH 用戶端連線

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

  1. 在目標服務上執行 gcloud beta run services ssh 指令。
  2. 啟動 SSH 通道並產生憑證。
  3. 在 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 alpha 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 安裝在其他資料夾,您可能需要更新最後一行中的位置。

  4. 執行下列指令:

    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 偵錯存取權。

後續步驟