SSH を使用して Cloud Run のトラブルシューティングを行う

SSH を使用すると、実行中のコンテナ インスタンスへの安全なインタラクティブ シェル接続を確立できます。これにより、コンテナのファイル システムとランタイム環境に直接アクセスして、システム リソースの検査、構成の検証、トラブルシューティングを行うことができます。

Cloud Run の SSH は、必要な sshd バイナリをコンテナのファイル システムに自動的に追加します。これらのバイナリは SSH セッションの期間中のみアクセス可能で、セッションが終了すると削除されます。/etc/passwd エントリを含む既存の SSH 構成は、Google マネージド構成を優先して Cloud Run SSH によって無視されます。

Google マネージド SSH 依存関係のサードパーティ オープンソースの著作権表示は、SSH セッションが確立されると、コンテナ内の次のパス(/usr/share/licenses/google_ssh/THIRD_PARTY_NOTICES)にマウントされます。

制限事項

SSH には次の制限が適用されます。

  • SSH は、Cloud Run の第 2 世代環境と Cloud Run インスタンスで実行されるサービスでのみ使用できます。
  • SSH を使用すると、イメージ内のホストキーが上書きされます。SSH セッションが終了した後も、サービス インスタンスが再起動されるまで、鍵は上書きされたままになります。
  • Windows: PuTTY はサポートされていません。OpenSSH クライアントを使用します。
  • SSH を使用する場合は、コンテナの保護に特に注意する必要があります。アプリケーション コードを root 以外のユーザーとして実行するなど、セキュリティに関するベスト プラクティスを検討します。

始める前に

  1. Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $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 Login API を有効にします。
      gcloud services enable run.googleapis.com \
          iap.googleapis.com \
          oslogin.googleapis.com
      
  7. gcloud CLI をインストールして初期化します。
  8. コンポーネントを更新します。
    gcloud components update
  9. Windows: OpenSSH クライアントがインストールされていることを確認します。

    通常、OpenSSH クライアントは Windows 10 以降にデフォルトでインストールされています。インストールされていない場合は、PowerShell で管理者として次のコマンドを実行してインストールできます。

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

    詳細については、OpenSSH をインストールするをご覧ください。

  10. Cloud Run の料金ページを確認します。料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。SSH はネットワーク下り(外向き)バイト数に対して課金します。
  11. プロジェクトで VPC Service Controls(VPC-SC)を使用している場合、トンネリング プロセスでは run.googleapis.com ではなく iaptunnel.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: アクセス権を付与する ID。

特定のインスタンスの場合

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: アクセス権を付与する ID。

プロジェクト レベルとリージョン レベルで roles/iap.tunnelResourceAccessor を付与するには、IAP アクセス ポリシーを構成するをご覧ください。

Cloud Run サービスで SSH を使用する

サービスレベルの 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 がすでに作成されている必要があります。URL は 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 がすでに作成されている必要があります。URL は 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 セッションで同じパスフレーズを使用してください。

    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: リビジョンの名前。

Cloud Run インスタンスで SSH を使用する

インスタンス レベルの SSH アクセスを構成し、SSH を使用してインスタンスに接続します。

インスタンス レベルの SSH アクセスを構成する

インスタンスでは、SSH がデフォルトで有効になっています。

インスタンスごとに SSH アクセスを無効にするには、gcloud CLI または YAML を使用します。

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 セッションで同じパスフレーズを使用してください。

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 証明書の有効期限は 5 分です。5 分後にサービスとの SSH 接続を確立しようとすると、gcloud beta run services ssh を再実行して証明書を再生成する必要があります。

SSH アクセスログ

SSH 認証鍵管理の監査ログをキャプチャするには、Cloud OS Login API の監査ログを有効にする必要があります。OS Login の監査ログを表示するをご覧ください。Cloud Run リソースの SSH ログにアクセスするには、そのプロジェクトの Cloud Audit Logs へのアクセス権が必要です。

次の例では、過去 1 日間のすべての 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 を無効にする組織のポリシーを設定するには、Cloud Run サービスで SSH デバッグ アクセスを有効にすることを制限するカスタム制約を使用します。

次のステップ