이 페이지에서는 SSH를 사용하여 IAP (Identity-Aware Proxy) TCP 전달을 통해 Cloud Run 서비스에 연결하는 방법을 설명합니다.
IAP로 SSH 연결을 보호하면 보안 환경에서 개별 컨테이너 인스턴스를 디버그할 수 있습니다.
시작하기 전에
- Cloud Run 서비스가 2세대 실행 환경에서 실행되고 연결 후 명령어를 실행하는 데 필요한 디버깅 도구가 포함되어 있는지 확인합니다. 자세한 내용은 실행 환경을 참고하세요.
최신 버전의 Google Cloud CLI를 사용하고 있는지 확인하려면 다음 명령어를 실행하세요.
gcloud components update프로젝트에서 Cloud Run, Cloud Resource Manager API, Cloud OS 로그인 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 루트 액세스 (
roles/run.sshRoot) 역할 - 서비스에 대한 Cloud Run 뷰어 (
roles/run.viewer) 역할 - 서비스에 대한 IAP 보안 터널 사용자 (
roles/iap.tunnelResourceAccessor) - 서비스에 대한 Cloud Run 개발자 (
roles/run.developer) 역할 - 프로젝트에 대한 로그 뷰 접근자 (
roles/logging.viewAccessor) - 프로젝트에 대한 브라우저 (
roles/browser) - 프로젝트의 서비스 사용량 소비자 (
roles/serviceusage.serviceUsageConsumer)
- 서비스 계정에 대한 서비스 계정 사용자 (
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
제한사항
Cloud Run용 SSH에는 다음과 같은 제한사항이 있습니다.
- Cloud Run 서비스 및 인스턴스만 지원됩니다.
- 서비스의 경우 2세대 실행 환경만 지원됩니다.
- Cloud Run 작업은 지원되지 않습니다.
- 작업자 풀은 지원되지 않습니다.
- SSH를 사용하는 경우 이미지의 호스트 키가 덮어쓰여집니다. 서비스가 다시 시작될 때까지 SSH 세션이 종료된 후에도 키가 덮어쓰여진 상태로 유지됩니다.
- Windows: PuTTY는 지원되지 않습니다. OpenSSH 클라이언트를 사용합니다.
IAP 승인 정책 구성
gcloud CLI 또는 IAP REST API를 사용하여 프로젝트, 리전 또는 서비스 수준에서 Cloud Run 리소스에 대한 액세스를 관리할 수 있습니다.
다음 Cloud Identity API 식별자에 대한 정책을 구성할 수 있습니다.
- Cloud ID: 예:
user:EMAIL@example.com - 직원 ID 제휴: 예:
principal://iam.googleapis.com/locations/global/workforcePools/<var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>
주 구성원 유형에 관한 자세한 내용과 예시는 주 구성원 식별자 목록을 참고하세요.
기존 Cloud Run 서비스 업데이트
SSH를 사용 설정하도록 서비스를 업데이트하려면 다음 명령어를 실행합니다.
gcloud beta run services update \
SERVICE_NAME \
--ssh
SERVICE_NAME를 Cloud Run 서비스 이름으로 바꿉니다. gcloud beta run deploy에 --ssh를 추가하여 Cloud Run 서비스를 배포할 수 있습니다.
프로젝트의 모든 Cloud Run 리소스에 대한 액세스 권한 부여
프로젝트 내의 모든 리소스에 대한 액세스를 관리하려면 프로젝트 수준에서 IAM 정책 바인딩을 적용하세요.
gcloud
다음 명령어를 실행합니다.
gcloud beta iap tcp add-iam-policy-binding \
--member='USER' \
--role='roles/iap.tunnelResourceAccessor' \
--resource-type=cloud-run
USER을 사용자 주 구성원 식별자(예: user:user@example.com 또는 직원 ID 제휴 주 구성원)로 바꿉니다.
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: 사용자의 주 구성원 식별자입니다.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: 사용자의 주 구성원 식별자입니다.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 서비스에 대한 액세스 권한 부여
프로젝트에서 단일 명명된 서비스에 대한 액세스를 제한하려면 서비스 수준에서 정책 바인딩을 적용하세요.
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 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