서비스 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를 할당하고 IAM을 사용해 최소한의 권한 집합을 부여하여 액세스할 수 있는 항목을 제한하는 것이 좋습니다. 이를 위해 올바른 IAM 역할이 있는 명명된 서비스 계정을 할당하면 됩니다. 서비스 계정은 Cloud Run(완전 관리형) 서비스와 동일한 프로젝트에서만 사용할 수 있습니다.

기본이 아닌 ID를 사용하는 데 필요한 권한

기본이 아닌 서비스 계정으로 서비스를 배포하려면 배포되는 서비스 계정에 대한 iam.serviceAccounts.actAs 권한이 배포자에게 있어야 합니다.

사용자가 서비스 계정을 만들면 해당 사용자에게 자동으로 이 권한이 부여됩니다. 그렇지 않으면 올바른 권한을 가진 사용자가 배포자에게 서비스 계정에 대한 이 권한을 부여해야만 사용자가 함수를 배포할 수 있습니다.

기본이 아닌 ID로 새 서비스 배포

새 ID로 서비스를 배포하기 전에 사용할 서비스 계정이 이미 만들어져 있는지 확인합니다. 그렇지 않으면 서비스 계정 생성 및 관리 방법에 대해 알아보세요.

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

Console

  1. Cloud Run으로 이동

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

  3. 고급 설정에서 컨테이너를 클릭합니다.

    이미지

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

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

gcloud

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

gcloud run services update SERVICE --service-account SERVICE_ACCOUNT

다음과 같이 바꿉니다.

  • SERVICE를 서비스 이름으로 바꿉니다.
  • SERVICE_ACCOUNT를 새 ID와 연결된 서비스 계정으로 바꿉니다.

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

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

다음과 같이 바꿉니다.

  • IMAGE_URL을 컨테이너 이미지에 대한 참조(예: gcr.io/myproject/my-image:latest)로 바꿉니다.
  • SERVICE_ACCOUNT를 새 ID와 연결된 서비스 계정으로 바꿉니다.

YAML

YAML 형식으로 정리된 결과를 반환하는 gcloud run services describe --format export 명령어를 사용하면 기존 서비스 구성을 다운로드하고 볼 수 있습니다. 그런 다음 아래 설명된 필드를 수정하고 gcloud beta 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와 연결된 서비스 계정으로 바꿉니다.
  3. 다음 명령어를 사용하여 서비스를 새 구성으로 바꿉니다.

    gcloud beta 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 서비스 보안 가이드를 참조하세요.