このページでは、SSH を使用して Identity-Aware Proxy(IAP)TCP 転送経由で Cloud Run サービスに接続する方法について説明します。
IAP で SSH 接続を保護することで、安全な環境で個々のコンテナ インスタンスをデバッグできます。
始める前に
- Cloud Run サービスが第 2 世代の実行環境で実行されており、接続後にコマンドを実行するために必要なデバッグツールが含まれていることを確認します。詳細については、実行環境をご覧ください。
Google Cloud CLI の最新バージョンを使用していることを確認するには、次のコマンドを実行します。
gcloud components updateプロジェクトで 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 ロールを付与するよう管理者に依頼してください。
-
ポリシーを構成します。
- プロジェクトに対する IAP ポリシー管理者 (
roles/iap.admin) - プロジェクトに対する Cloud Run 管理者 (
roles/run.admin)
- プロジェクトに対する IAP ポリシー管理者 (
-
ワークロードに接続する:
- サービス アカウントに対するサービス アカウント ユーザー (
roles/iam.serviceAccountUser) - サービスに対する Cloud Run SSH root アクセス権 (
roles/run.sshRoot) - サービスに対する Cloud Run 閲覧者 (
roles/run.viewer) - サービスに対する IAP で保護されたトンネル ユーザー (
roles/iap.tunnelResourceAccessor) - サービスに対する Cloud Run デベロッパー (
roles/run.developer) - プロジェクトに対するログビュー アクセス者 (
roles/logging.viewAccessor) - プロジェクトに対するブラウザ (
roles/browser) - プロジェクトに対する Service Usage コンシューマー (
roles/serviceusage.serviceUsageConsumer)
- サービス アカウントに対するサービス アカウント ユーザー (
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
制限事項
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 クライアントを使用するには:
SSH トンネルを開始して必要な証明書を生成するには、次のコマンドを実行します。
gcloud beta run services ssh SERVICE_NAME \ --region=LOCATION \ --project=PROJECT_ID次のように置き換えます。
SERVICE_NAME: サービスの名前。LOCATION: Google Cloud リージョンPROJECT_ID: 実際の Google Cloud プロジェクト ID
ローカルの
~/.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=LOCATIONgcloudのインストール パスが異なる場合は、ProxyCommandパスの接頭辞を更新します。次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト IDLOCATION: Google Cloud リージョンSERVICE_NAME: サービスの名前。PROJECT_NUMBER: Google Cloud プロジェクト番号
OpenSSH を使用してサービスに接続します。
ssh cloud-run-ssh