서비스 ID

런타임 서비스 계정

서비스를 실행하는 동안 Cloud Run 버전은 서비스 계정을 ID로 사용합니다. 따라서 코드에서 Google Cloud 클라이언트 라이브러리를 사용하는 경우 현재 Cloud Run 버전의 런타임 서비스 계정에서 사용자 인증 정보를 자동으로 가져와 사용합니다. 이 전략을 '애플리케이션 기본 사용자 인증 정보'라고 합니다.

기본적으로 Cloud Run 버전은 프로젝트 > 편집자 IAM 역할이 있는 Compute Engine 기본 서비스 계정(PROJECT_NUMBER-compute@developer.gserviceaccount.com)을 사용합니다. 즉, 기본적으로 Cloud Run 버전에는 Google Cloud 프로젝트의 모든 리소스에 대한 읽기 및 쓰기 액세스 권한이 있다는 것을 의미합니다. 이 전략을 매우 간편하지만 더 제한적인 IAM 역할로 전용 서비스 계정을 할당하여 각 Cloud Run 서비스에 보다 세분화된 권한을 부여하는 것이 좋습니다.

전용 서비스 계정 생성을 위한 추천 받기

추천자 서비스는 필요한 최소한의 권한 집합이 포함된 전용 서비스 계정을 만들 수 있도록 권장사항을 자동으로 제공합니다.

서비스별 ID 사용

각 서비스에 대해 기본 서비스 계정을 사용하는 대신 사용자 관리형 서비스 계정을 할당하여 전용 ID를 제공하는 것이 좋습니다. 사용자 관리형 서비스 계정을 사용하면 Identity and Access Management를 사용하여 최소한의 권한 집합을 부여하는 방식으로 액세스를 제어할 수 있습니다.

사용자 관리 서비스 계정을 Cloud Run 서비스와 동일한 프로젝트 또는 다른 프로젝트에서 사용할 수 있습니다.

서비스 계정과 Cloud Run 서비스가 서로 다른 프로젝트에 있는 경우:

  • 이 서비스 계정이 포함된 프로젝트의 경우 조직 정책 iam.disableCrossProjectServiceAccountUsage를 폴더 수준에서 false/unenforced로 설정하거나 프로젝트 수준 설정에서 상속해야 합니다. 기본적으로 true로 설정됩니다.
  • 서비스 계정에는 배포 프로젝트의 서비스 에이전트 service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com"에 대한 service account token creator의 역할 멤버십1이 필요합니다. 여기서 PROJECT_NUMBER는 프로젝트의 프로젝트 번호입니다.
  • 서비스 계정에는 배포 작업을 수행하는 ID(사용자 또는 자동화)의 service account user에 대한 역할 멤버십1이 필요합니다.

1 역할 멤버십을 서비스 계정 리소스에 직접 적용하거나 리소스 계층 구조의 상위 수준으로부터 상속할 수 있습니다.

사용자 관리형 서비스 계정에 필요한 권한

사용자가 서비스 계정을 만들면 해당 사용자에게 자동으로 iam.serviceAccounts.actAs 권한이 부여됩니다. 그러지 않으면 올바른 권한이 있는 사용자가 서비스를 배포하는 사용자에게 iam.serviceAccounts.actAs 권한을 부여해야 합니다. 권한 부여 방법을 알아보려면 리소스 액세스 권한 부여, 변경, 취소를 참조하세요.

사용자 관리형 서비스 계정으로 새 서비스 배포

아직 사용할 사용자 관리형 서비스 계정이 없으면 서비스 계정 만들기 및 관리 방법을 알아보세요.

새 서비스를 만들거나 새 서비스를 배포할 때 Cloud Console 또는 gcloud 명령줄을 사용하여 서비스 계정을 설정할 수 있습니다. 새 ID와 연결된 서비스 계정 이메일로 서비스 계정을 업데이트합니다.

콘솔

  1. Cloud Run으로 이동

  2. 배포할 새 서비스를 구성하려면 서비스 만들기를 클릭합니다. 기존 서비스를 구성하는 경우 서비스를 클릭한 다음 새 버전 수정 및 배포를 클릭합니다.

  3. 새 서비스를 구성하는 경우 필요에 따라 초기 서비스 설정 페이지를 작성한 후 다음 > 고급 설정을 클릭하여 서비스 구성 페이지에 연결합니다.

  4. 보안 탭을 클릭합니다.

    이미지

  5. 서비스 계정 드롭다운을 클릭하고 원하는 서비스 계정을 선택합니다.

  6. 만들기 또는 배포를 클릭합니다.

gcloud

다음 명령어로 기존 서비스를 업데이트하여 새 런타임 서비스 계정을 만들 수 있습니다.

gcloud run services update SERVICE --service-account SERVICE_ACCOUNT

다음과 같이 바꿉니다.

  • SERVICE를 서비스 이름으로 바꿉니다.
  • SERVICE_ACCOUNT를 새 ID와 연결된 서비스 계정으로 바꿉니다. 이 값은 서비스 계정의 이메일 주소입니다(예를 들어 example@myproject.iam.gserviceaccount.com).

배포 중에 다음 명령어를 사용하여 서비스 계정을 설정할 수도 있습니다.

gcloud run deploy --image IMAGE_URL --service-account SERVICE_ACCOUNT

다음과 같이 바꿉니다.

  • IMAGE_URL을 컨테이너 이미지에 대한 참조(예를 들어 gcr.io/myproject/my-image:latest)로 바꿉니다.
  • SERVICE_ACCOUNT를 새 ID와 연결된 서비스 계정으로 바꿉니다. 이 값은 서비스 계정의 이메일 주소입니다(예를 들어 example@myservice.iam.gserviceaccount.com).

YAML

YAML 형식으로 정리된 결과를 반환하는 gcloud run services describe --format export 명령어를 사용하면 기존 서비스 구성을 다운로드하고 볼 수 있습니다. 그런 다음 아래 설명된 필드를 수정하고 gcloud run services replace 명령어를 사용하여 수정된 YAML을 업로드할 수 있습니다. 설명된 대로 필드만 수정해야 합니다.

  1. 구성을 보고 다운로드하려면 다음을 실행합니다.

    gcloud run services describe SERVICE --format export > service.yaml
  2. serviceAccountName: 속성을 업데이트합니다.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: SERVICE_ACCOUNT

    다음과 같이 바꿉니다.

    • SERVICE를 Cloud Run 서비스 이름으로 바꿉니다.
    • SERVICE_ACCOUNT를 새 ID와 연결된 서비스 계정으로 바꿉니다. 이 값은 서비스 계정의 이메일 주소입니다(예를 들어 example@myproject.iam.gserviceaccount.com).
  3. 다음 명령어를 사용하여 서비스를 새 구성으로 바꿉니다.

    gcloud run services replace service.yaml

ID 및 액세스 토큰 가져오기

코드가 Cloud Run에서 실행되면 Compute 메타데이터 서버를 사용하여 ID 토큰과 액세스 토큰을 가져올 수 있으며 로컬 컴퓨터에서 직접 메타데이터 서버를 쿼리할 수 없습니다.

ID 토큰

다른 Cloud Run이나 ID 토큰을 검증할 수 있는 다른 서비스를 호출할 때 ID 토큰을 사용합니다.

다음과 같이 Compute 메타데이터 서버를 사용하여 특정 대상이 있는 ID 토큰을 가져올 수 있습니다.

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=[AUDIENCE]" \
  -H "Metadata-Flavor: Google"

여기서 AUDIENCE는 요청된 JWT 대상입니다. 예를 들어 https://service.domain.com과 같은 호출 중인 서비스의 URL 또는 1234567890.apps.googleusercontent.com과 같은 IAP 보호 리소스의 OAuth 클라이언트 ID입니다.

액세스 토큰

Google API를 호출할 때 액세스 토큰을 사용합니다.

기본적으로 액세스 토큰에는 cloud-platform 범위가 있으며, IAM에서도 액세스를 허용한다면 모든 Google Cloud Platform API에 액세스할 수 있습니다. 다른 Google 또는 Google Cloud APIs에 액세스하려면 해당 범위의 액세스 토큰을 가져와야 합니다.

Compute 메타데이터 서버를 사용하여 액세스 토큰을 가져올 수 있습니다.

특정 범위의 액세스 토큰이 필요하면 다음과 같이 액세스 토큰을 생성할 수 있습니다.

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=[SCOPES]" \
  -H "Metadata-Flavor: Google"

여기서 SCOPES는 요청된 OAuth 범위를 쉼표로 구분한 목록입니다. 예를 들면 다음과 같습니다. https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets

필요한 범위를 찾으려면 Google OAuth 범위의 전체 목록을 참조하세요.

다음 단계

서비스에 대한 액세스를 관리하거나 안전하게 개발자, 서비스, 최종 사용자를 인증하는 방법을 알아보세요.

보안 위험을 최소화하기 위해 서비스 ID를 사용하는 애플리케이션을 전반적으로 둘러보려면 Cloud Run 서비스 보안 가이드를 참조하세요.