Cloud Run에 SSH 사용

이 페이지에서는 SSH를 사용하여 IAP (Identity-Aware Proxy) 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 로그인 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 승인 정책 구성

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 클라이언트를 사용하려면 다음 단계를 따르세요.

  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