SSH를 사용하여 Cloud Run 문제 해결

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를 사용할 때는 컨테이너를 보호하는 데 각별히 주의해야 합니다. 루트가 아닌 사용자로 애플리케이션 코드를 실행하는 등 보안 권장사항을 고려하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Cloud Run Admin API, Cloud Resource Manager API, Identity-Aware Proxy API, Cloud OS 로그인 API를 사용 설정합니다.
      gcloud services enable run.googleapis.com \
          iap.googleapis.com \
          oslogin.googleapis.com
      
  7. gcloud CLI를 설치하고 초기화합니다.
  8. 구성요소를 업데이트합니다.
    gcloud components update
  9. Windows: OpenSSH 클라이언트가 설치되어 있는지 확인합니다.

    OpenSSH 클라이언트는 일반적으로 Windows 10 이상에 기본적으로 설치됩니다. 설치되어 있지 않은 경우 관리자 권한으로 PowerShell에서 다음 명령어를 실행하여 설치할 수 있습니다.

    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

    자세한 내용은 OpenSSH 설치를 참고하세요.

  10. Cloud Run 가격 책정 페이지를 검토합니다. 프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. SSH는 네트워크 이그레스 바이트에 대해 청구합니다.
  11. 프로젝트에서 VPC 서비스 제어(VPC-SC)를 사용하는 경우 터널링 프로세스에서 서비스 이름으로 run.googleapis.com이 아닌 iaptunnel.googleapis.com를 확인합니다.

필요한 역할

이 단계를 완료하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

프로젝트가 속한 조직의 구성원이 아닌 경우 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

  1. 새 서비스를 만드는 경우에는 이 단계를 건너뜁니다. 기존 서비스를 업데이트하는 경우 YAML 구성을 다운로드합니다.

    gcloud run services describe SERVICE --format export > service.yaml
  2. 다음 예시에는 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 형식을 따릅니다.
  3. 다음 명령어를 사용하여 서비스를 만들거나 업데이트합니다.

    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

  1. 새 서비스를 만드는 경우에는 이 단계를 건너뜁니다. 기존 서비스를 업데이트하는 경우 YAML 구성을 다운로드합니다.

    gcloud run services describe SERVICE --format export > service.yaml
  2. 다음 예시에는 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 형식을 따릅니다.
  3. 다음 명령어를 사용하여 서비스를 만들거나 업데이트합니다.

    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: REGION
    Service: busybox
    Revision: busybox-REVISION
    Instance:
    INSTANCE-ID
    Container: busybox-1
    Image: IMAGE
    

    SSH 세션을 종료하려면 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가 기본적으로 사용 설정되어 있습니다.

gcloud CLI 또는 YAML을 사용하여 인스턴스별로 SSH 액세스를 사용 중지할 수 있습니다.

gcloud

인스턴스에서 액세스를 사용 중지하려면 다음 명령어를 사용합니다.

gcloud beta run instances update INSTANCE --no-ssh

YAML

  1. 새 인스턴스를 만드는 경우에는 이 단계를 건너뜁니다. 기존 인스턴스를 업데이트하는 경우 YAML 구성을 다운로드합니다.

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. 다음 예시에는 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)
  3. 다음 명령어를 사용하여 인스턴스를 만들거나 업데이트합니다.

    gcloud beta run instances replace instance.yaml

gcloud CLI 또는 YAML을 사용하여 특정 인스턴스에 대한 검사 액세스를 허용할 수 있습니다.

gcloud

기존 인스턴스에서 액세스를 사용 설정하려면 다음 명령어를 사용하세요.

gcloud beta run instances update INSTANCE --ssh

인스턴스를 배포할 때 --ssh 플래그를 사용하여 인스턴스에 대한 검사 액세스를 허용할 수도 있습니다.

YAML

  1. 새 인스턴스를 만드는 경우에는 이 단계를 건너뜁니다. 기존 인스턴스를 업데이트하는 경우 YAML 구성을 다운로드합니다.

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. 다음 예시에는 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)
  3. 다음 명령어를 사용하여 인스턴스를 만들거나 업데이트합니다.

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

  1. 타겟 서비스에서 gcloud beta run services ssh 명령어를 실행합니다.
  2. SSH 터널을 시작하고 인증서를 생성합니다.
  3. 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가 다른 폴더에 설치되어 있는 경우 마지막 줄에서 위치를 업데이트해야 할 수 있습니다.

  4. 다음 명령어를 실행합니다.

    ssh cloud-run-ssh
    

SSH 인증서는 5분 후에 만료됩니다. 5분 후에 서비스와 SSH 연결을 설정하려고 하면 gcloud beta run services ssh를 다시 실행하여 인증서를 다시 생성해야 합니다.

SSH 액세스 로그

SSH 키 관리의 감사 로그를 캡처하려면 Cloud OS 로그인 API의 감사 로그를 사용 설정해야 합니다. OS 로그인 감사 로그 보기를 참고하세요. Cloud Run 리소스의 SSH 로그에 액세스하려면 해당 프로젝트의 Cloud 감사 로그에 액세스할 수 있어야 합니다.

다음 예에서는 지난 하루 동안의 모든 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 액세스 사용 중지

SSH를 사용 중지하는 조직 정책을 설정하려면 Cloud Run 서비스에서 SSH 디버깅 액세스를 사용 설정하는 것을 제한하는 커스텀 제약 조건을 사용하세요.

다음 단계