Cloud Run に SSH を使用する

このページでは、SSH を使用して Identity-Aware Proxy(IAP)TCP 転送経由で Cloud Run サービスに接続する方法について説明します。

IAP で SSH 接続を保護することで、安全な環境で個々のコンテナ インスタンスをデバッグできます。

始める前に

  1. Cloud Run サービスが第 2 世代の実行環境で実行されており、接続後にコマンドを実行するために必要なデバッグツールが含まれていることを確認します。詳細については、実行環境をご覧ください。
  2. Google Cloud CLI の最新バージョンを使用していることを確認するには、次のコマンドを実行します。

    gcloud components update
    
  3. プロジェクトで Cloud Run、Cloud Resource Manager API、Cloud OS Login API、Identity-Aware Proxy API を有効にします。

    API を有効にするには、次のコマンドを実行します。

    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        oslogin.googleapis.com \
        iap.googleapis.com \
        run.googleapis.com
    

必要なロール

ポリシーの構成とワークロードへの接続に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

制限事項

Cloud Run の SSH には次の制限があります。

  • Cloud Run サービスとインスタンスのみがサポートされています。
  • サービスでは、第 2 世代の実行環境のみがサポートされています。
  • Cloud Run ジョブはサポートされていません。
  • ワーカープールはサポートされていません。
  • SSH を使用すると、イメージ内のホストキーが上書きされます。サービスが再起動されるまで、SSH セッションが終了しても鍵は上書きされたままになります。
  • Windows: PuTTY はサポートされていません。OpenSSH クライアントを使用します。

IAP 認証ポリシーを構成する

Cloud Run リソースへのアクセスは、gcloud CLI または IAP REST API を使用して、プロジェクト、リージョン、サービスレベルで管理できます。

次の Cloud Identity API 識別子に対してポリシーを構成できます。

  • Cloud Identity: 例: user:EMAIL@example.com
  • Workforce Identity 連携: 例: principal://iam.googleapis.com/locations/global/workforcePools/ <var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>

プリンシパル タイプの詳細と例については、プリンシパル ID のリストをご覧ください。

既存の Cloud Run サービスを更新する

サービスを更新して SSH を有効にするには、次のコマンドを実行します。

gcloud beta run services update \
    SERVICE_NAME \
    --ssh

SERVICE_NAME は、Cloud Run サービスの名前に置き換えます。Cloud Run サービスをデプロイするには、gcloud beta run deploy に --ssh を追加します。

プロジェクト内のすべての Cloud Run リソースへのアクセス権を付与する

プロジェクト内のすべてのリソースのアクセスを管理するには、プロジェクト レベルで IAM ポリシー バインディングを適用します。

gcloud

次のコマンドを実行します。

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run

USER は、ユーザーのプリンシパル ID(user:user@example.com や Workforce Identity 連携プリンシパルなど)に置き換えます。

REST API

プロジェクト ポリシー エンドポイントに POST リクエストを送信します。

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun:setIamPolicy"

次のように置き換えます。

  • USER: ユーザーのプリンシパル ID。
  • PROJECT_NUMBER: リソースがホストされている Google Cloudプロジェクト番号。

特定のロケーションにあるすべての Cloud Run リソースへのアクセス権を付与する

特定のリージョン(us-central1 など)内のすべてのリソースへのアクセスを制限するには、ロケーション レベルでポリシー バインディングを適用します。

gcloud

次のコマンドを実行します。

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --region=LOCATION

次のように置き換えます。

  • USER: ユーザーのプリンシパル ID。
  • LOCATION: リソースがデプロイされている Google Cloud リージョン(例: us-central1)。

REST API

ロケーション ポリシー エンドポイントに POST リクエストを送信します。

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
LOCATION:setIamPolicy"

次のように置き換えます。

  • USER: ユーザーのプリンシパル識別子
  • PROJECT_NUMBER: Google Cloud プロジェクト番号
  • LOCATION: Google Cloud リージョン

特定の Cloud Run サービスへのアクセス権を付与する

プロジェクト内の 1 つの名前付きサービスへのアクセスを制限するには、サービスレベルでポリシー バインディングを適用します。

gcloud

次のコマンドを実行します。

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --service=SERVICE_NAME \
    --region=LOCATION

次のように置き換えます。

  • USER: ユーザーのプリンシパル識別子
  • SERVICE_NAME: 接続するサービス ロジックの名前
  • LOCATION: サービスがデプロイされている Google Cloud リージョン

REST API

サービス ポリシー エンドポイントに POST リクエストを送信します。

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
    PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
    LOCATION/services/\
    SERVICE_NAME:setIamPolicy"

次のように置き換えます。

  • USER: ユーザーのプリンシパル識別子
  • PROJECT_NUMBER: Google Cloud プロジェクト番号
  • LOCATION: Google Cloud リージョン
  • SERVICE_NAME: サービスの名前。

SSH で接続

Cloud Run リソースへの SSH トンネルを確立するには、gcloud CLI を使用する必要があります。

サービスに接続する

次のコマンドを実行します。

gcloud beta run services ssh SERVICE_NAME \
    --region=LOCATION \
    --project=PROJECT_ID

次のように置き換えます。

  • SERVICE_NAME: 接続するサービスの名前
  • LOCATION: サービスが存在する Google Cloud リージョン
  • PROJECT_ID: Google Cloudの ID

セッションを終了する

SSH セッションを終了するには、「exit」と入力します。

コンテナに対する変更は、コンテナが存続している間のみ保持されます。セッションを終了しても、コンテナが自動的に停止または再起動することはありません。

ローカル OpenSSH クライアントを使用する

接続にローカル OpenSSH クライアントを使用するには:

  1. SSH トンネルを開始して必要な証明書を生成するには、次のコマンドを実行します。

    gcloud beta run services ssh SERVICE_NAME \
        --region=LOCATION \
        --project=PROJECT_ID
    

    次のように置き換えます。

    • SERVICE_NAME: サービスの名前。
    • LOCATION: Google Cloud リージョン
    • PROJECT_ID: 実際の Google Cloud プロジェクト ID
  2. ローカルの ~/.ssh/config ファイルに次の構成コードを追加します。

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile ~/.ssh/google_compute_engine
        CertificateFile ~/.ssh/google_compute_engine_cert/PROJECT_ID_LOCATION_SERVICE_NAME-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 ~/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_NAME --region=LOCATION
    

    gcloud のインストール パスが異なる場合は、ProxyCommand パスの接頭辞を更新します。

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID
    • LOCATION: Google Cloud リージョン
    • SERVICE_NAME: サービスの名前。
    • PROJECT_NUMBER: Google Cloud プロジェクト番号
  3. OpenSSH を使用してサービスに接続します。

    ssh cloud-run-ssh