使用 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 小時後,工作階段會中斷連線,您必須重新連線。
  • 如果 SSH 工作階段閒置一小時,IAP 就會中斷連線。詳情請參閱「IAP TCP 轉送已知限制」。
  • SSH 僅適用於在 Cloud Run 第二代環境和 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:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run。

  2. 按一下服務,開啟「Service details」(服務詳細資料) 頁面。

  3. 選取「SSH」SSH。Cloud Shell 隨即開啟,並顯示 gcloud SSH 指令。

  4. 按下 Enter 鍵。

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

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

    Project: PROJECT_ID
    Region: REGION
    Service: SERVICE
    Revision: REVISION
    Instance: INSTANCE_ID
    Container: CONTAINER
    Image: IMAGE
    
  7. 如要結束 SSH 工作階段,請輸入 exit。只要容器保持運作,您對容器所做的任何變更都會保留。退出工作階段不會重新啟動或終止容器。

gcloud

如要使用 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。

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run。

  2. 按一下您感興趣的服務,開啟「Service details」(服務詳細資料) 頁面。

  3. 選取「記錄」。

  4. 按一下服務執行個體的記錄項目,展開該項目。

  5. 選取「透過 SSH 連線至這個執行個體」。Cloud Shell 隨即開啟,並顯示 gcloud SSH 指令。

  6. 按下 Enter 鍵。

gcloud

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

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

更改下列內容:

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

指定修訂版本

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

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run。

  2. 按一下您感興趣的服務,開啟「Service details」(服務詳細資料) 頁面。

  3. 選取「修訂版本記錄」。

  4. 找出要透過 SSH 存取的修訂版本,然後按一下右側的三點圖示。

  5. 選取「透過 SSH 連線至修訂版本」。Cloud Shell 隨即開啟,並顯示 gcloud SSH 指令。

  6. 按下 Enter 鍵。

gcloud

如要使用 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 存取記錄

如要擷取安全殼層金鑰管理的稽核記錄,您必須啟用 Cloud OS Login 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 偵錯存取權。

後續步驟