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 以外のユーザーとして実行するなど、セキュリティに関するベスト プラクティスを検討します。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分も差し上げます。
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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
- gcloud CLI をインストールして初期化します。
-
コンポーネントを更新します。
gcloud components update
-
Windows: OpenSSH クライアントがインストールされていることを確認します。
通常、OpenSSH クライアントは Windows 10 以降にデフォルトでインストールされています。インストールされていない場合は、PowerShell で管理者として次のコマンドを実行してインストールできます。
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
詳細については、OpenSSH をインストールするをご覧ください。
- Cloud Run の料金ページを確認します。料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。SSH はネットワーク下り(外向き)バイト数に対して課金します。
-
プロジェクトで VPC Service Controls(VPC-SC)を使用している場合、トンネリング プロセスでは
run.googleapis.comではなくiaptunnel.googleapis.comがサービス名としてチェックされます。
必要なロール
これらの手順を完了するために必要な権限を取得するには、管理者に次の IAM ロールを付与するよう依頼してください。
- サービス アカウントに対するサービス アカウント ユーザー (
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) - IAP 管理オペレーションのプロジェクトに対する IAP ポリシー管理者 (
roles/iap.admin)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
プロジェクトが属する組織のメンバーでない場合、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
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
次の例には、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の形式です。
次のコマンドを使用して、サービスを作成または更新します。
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
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
次の例には、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の形式です。
次のコマンドを使用して、サービスを作成または更新します。
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:REGIONService: busybox Revision: busybox-REVISION Instance: INSTANCE-ID Container: busybox-1 Image: IMAGESSH セッションを終了するには、「
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
新しいインスタンスを作成する場合は、この手順をスキップします。既存のインスタンスを更新する場合は、その YAML 構成をダウンロードします。
gcloud beta run instances describe INSTANCE --format export > instance.yaml
次の例には、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など)。
次のコマンドを使用して、インスタンスを作成または更新します。
gcloud beta run instances replace instance.yaml
特定のインスタンスで検査アクセスを許可するには、gcloud CLI または YAML を使用します。
gcloud
既存のインスタンスでアクセスを有効にするには、次のコマンドを使用します。
gcloud beta run instances update INSTANCE --ssh
インスタンスをデプロイするときに --ssh フラグを使用して、インスタンスに対する検査アクセスを許可することもできます。
YAML
新しいインスタンスを作成する場合は、この手順をスキップします。既存のインスタンスを更新する場合は、その YAML 構成をダウンロードします。
gcloud beta run instances describe INSTANCE --format export > instance.yaml
次の例には、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など)。
次のコマンドを使用して、インスタンスを作成または更新します。
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 クライアントを使用して接続するには:
- ターゲット サービスで
gcloud beta run services sshコマンドを実行します。 - SSH トンネルを開始して証明書を生成します。
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 が別のフォルダにインストールされている場合は、最終行の場所を更新する必要があります。
次のコマンドを実行します。
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 デバッグ アクセスを有効にすることを制限するカスタム制約を使用します。
次のステップ
- Cloud Run の問題のトラブルシューティングの詳細を確認する。
- Cloud Run サービスのトラブルシューティングの詳細を確認する。
- Cloud Run の既知の問題を確認する。