서비스 ID 구성

Cloud Run 서비스나 버전에는 Cloud Run 인스턴스 컨테이너에서 Google Cloud API에 액세스할 수 있도록 인증된 계정으로 사용되는 서비스 ID가 있습니다. 서비스 ID에 대한 자세한 내용은 서비스 ID 소개 가이드를 참조하세요.

서비스 ID 사용 방법

Cloud Run에서 서비스 ID는 리소스이자 주 구성원인 서비스 계정입니다.

  • 리소스로 서비스 ID: 서비스 계정을 서비스 ID로 연결하려면 배포자 계정에 서비스 ID 리소스에 대한 액세스 권한이 있어야 합니다. 서비스나 버전 만들기 또는 업데이트와 같은 특정 작업을 수행하려면 배포자 계정에 서비스 ID 리소스에 대한 권한이 있어야 합니다.
  • 주 구성원으로 서비스 ID: Cloud Run 서비스나 버전에서 Google Cloud API에 액세스하려면 서비스 ID에 수행하려는 서비스나 버전에 필요한 역할이나 권한을 부여해야 합니다.

다음 섹션에서는 배포자 계정에 서비스 ID 리소스에 대한 액세스 권한을 부여하고 서비스 계정 주 구성원에 대한 액세스 권한을 부여하는 데 필요한 역할을 설명합니다.

필요한 역할

개발자나 관리자가 배포자 계정과 서비스 ID에 대한 IAM 역할과 권한을 부여해야 합니다.

클릭하여 배포자 계정에 필요한 역할 보기

서비스 계정을 서비스나 버전에서 서비스 ID로 연결하는 데 필요한 권한을 얻으려면 개발자나 관리자가 배포자 계정에 서비스 ID로 사용되는 서비스 계정에 대한 서비스 계정 사용자 역할(roles/iam.serviceAccountUser)을 부여해야 합니다.

이 사전 정의된 역할에는 서비스나 버전에서 서비스 계정을 연결하는 데 필요한 iam.serviceAccounts.actAs 권한이 포함되어 있습니다. 커스텀 역할을 구성하거나 다른 사전 정의된 역할을 사용하여 이 권한을 얻을 수도 있습니다.

배포자 계정에 서비스 ID에 대한 이 역할을 부여하는 방법은 배포 권한을 참조하세요. 서비스 계정이 Cloud Run 서비스나 버전과 다른 프로젝트에 있으면 개발자나 또는 관리자가 Cloud Run 서비스 에이전트에 대한 IAM 역할을 구성하고 조직 정책을 설정해야 합니다. 자세한 내용은 다른 프로젝트에서 서비스 계정 사용을 참조하세요.

클릭하여 서비스 ID에 필요한 역할 보기

서비스 ID가 Cloud Run에서 Google Cloud API에 액세스하도록 허용하려면 개발자나 관리자가 서비스 ID에 수행하려는 작업에 필요한 권한이나 역할을 부여해야 합니다. 특정 Cloud 클라이언트 라이브러리에 액세스하려면 Google Cloud 서비스에 대한 Google Cloud 문서를 참조하세요.

Cloud Run 서비스나 버전에서 다른 Google Cloud 서비스에 액세스하지 않는 경우에는 서비스 ID에 역할이나 권한을 부여할 필요가 없으며 프로젝트에 할당된 기본 서비스 계정을 사용할 수 있습니다.

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

Google Cloud 콘솔에서 새 서비스 계정을 만들 때 추가 액세스 권한에 선택적 단계 '이 서비스 계정에 프로젝트에 대한 액세스 권한 부여'가 필요합니다. 예를 들어 Cloud Run 서비스 하나에서 다른 비공개 Cloud Run 서비스를 호출하거나 Cloud SQL 데이터베이스에 액세스할 수 있으며 둘 다 특정 IAM 역할이 필요합니다. 자세한 내용은 액세스 관리 문서를 참조하세요.

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

서비스 ID 구성

아직 서비스 계정을 만들지 않았으면 IAM 또는 Cloud Run에서 사용자 관리형 서비스 계정을 만들 수 있습니다.

서비스 ID를 구성하려면 새 서비스를 만들거나 새 버전을 배포할 때 Google Cloud 콘솔, gcloud CLI, API(YAML)를 또는 Terraform을 사용합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud Run으로 이동합니다.

    Cloud Run으로 이동

  2. 컨테이너 배포를 클릭하고 서비스를 선택하여 새 서비스를 구성합니다. 기존 서비스를 구성하는 경우 서비스를 클릭한 후 새 버전 수정 및 배포를 클릭합니다.

  3. 새 서비스를 구성하는 경우 초기 서비스 설정 페이지를 작성한 후 컨테이너, 볼륨, 네트워킹, 보안을 클릭하여 서비스 구성 페이지를 펼칩니다.

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

    이미지

    • 서비스 계정 드롭다운을 클릭하고 기존 서비스 계정을 선택하거나새 서비스 계정 만들기를 클릭합니다(해당하는 경우).
  5. 만들기 또는 배포를 클릭합니다.

gcloud

아직 서비스 계정을 만들지 않았으면 IAM에서 사용자 관리형 서비스 계정을 만들 수 있습니다.

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

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: 컨테이너 이미지에 대한 참조(예: us-docker.pkg.dev/cloudrun/container/hello:latest). Artifact Registry를 사용하는 경우 저장소 REPO_NAME이 이미 생성되어 있어야 합니다. URL의 형식은 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG입니다.
  • SERVICE_ACCOUNT를 새 ID와 연결된 서비스 계정으로 바꿉니다. 이 값은 서비스 계정의 이메일 주소입니다(예를 들어 example@myservice.iam.gserviceaccount.com).

YAML

아직 서비스 계정을 만들지 않았으면 IAM에서 사용자 관리형 서비스 계정을 만들 수 있습니다.

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

    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와 연결된 서비스 계정. 이 값은 서비스 계정의 이메일 주소입니다(예를 들어 SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com).
  3. 다음 명령어를 사용하여 서비스를 만들거나 업데이트합니다.

    gcloud run services replace service.yaml

Terraform

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

서비스 계정을 만들려면 다음 리소스를 기존 main.tf 파일에 추가합니다.

resource "google_service_account" "cloudrun_service_identity" {
  account_id = "my-service-account"
}

Cloud Run 서비스를 만들거나 업데이트하고 서비스 계정을 포함합니다.

resource "google_cloud_run_v2_service" "default" {
  name     = "id-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.cloudrun_service_identity.email
  }
}

다른 프로젝트에서 서비스 계정 사용

Cloud Run 리소스와 다른 Google Cloud 프로젝트에서 서비스 계정을 구성하는 경우 다음을 수행합니다.

  1. 개발자나 관리자가 서비스 ID로 사용하는 서비스 계정에 대한 서비스 계정 사용자 역할(roles/iam.serviceAccountUser)을 부여해야 합니다.

    콘솔

    1. Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다.

      서비스 계정으로 이동

    2. 서비스 ID로 사용하고 있는 서비스 계정 이메일 주소를 선택합니다.

    3. 권한 탭을 클릭합니다.

    4. 액세스 권한 부여 버튼을 클릭합니다.

    5. 관리자 또는 개발자 역할을 부여할 주 구성원과 일치하는 배포자 계정 이메일 주소를 입력합니다.

    6. 역할 선택 드롭다운에서 서비스 계정 > 서비스 계정 사용자 역할을 선택합니다.

    7. 저장을 클릭합니다.

    gcloud

    gcloud iam service-accounts add-iam-policy-binding 명령어를 사용하여 강조표시된 변수를 적절한 값으로 바꿉니다.

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
        --member="PRINCIPAL" \
        --role="roles/iam.serviceAccountUser"

    다음과 같이 바꿉니다.

    • SERVICE_ACCOUNT_NAME: Cloud Run 리소스를 연결할 서비스 계정의 이름
    • SERVICE_ACCOUNT_PROJECT_ID: 서비스 계정이 있는 프로젝트 ID
    • PRINCIPAL: user|group|serviceAccount:email 또는 domain:domain 형식을 사용하여 바인딩을 추가할 배포자 계정. 예를 들면 다음과 같습니다.

      • user:test-user@gmail.com
      • group:admins@example.com
      • serviceAccount:test123@example.domain.com
      • domain:example.domain.com
  2. 개발자나 관리자가 Cloud Run 리소스의 서비스 에이전트에 서비스 ID로 사용하는 서비스 계정에 대한 서비스 계정 토큰 생성자 역할(roles/iam.serviceAccountTokenCreator)을 부여해야 합니다. 서비스 에이전트는 service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com 형식을 따릅니다.

    콘솔

    1. Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다.

      서비스 계정으로 이동

    2. 서비스 ID로 사용하고 있는 서비스 계정 이메일 주소를 선택합니다.

    3. 권한 탭을 클릭합니다.

    4. 액세스 권한 부여 버튼을 클릭합니다.

    5. 서비스 에이전트 이메일 주소를 입력합니다. 예를 들면 service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com입니다.

    6. 역할 선택 드롭다운에서 서비스 계정 > 서비스 계정 토큰 생성자 역할을 선택합니다.

    7. 저장을 클릭합니다.

    gcloud

    gcloud iam service-accounts add-iam-policy-binding 명령어를 사용합니다.

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
        --member="serviceAccount:service-CLOUD_RUN_RESOURCE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \
        --role="roles/iam.serviceAccountTokenCreator"

    다음 값을 바꿉니다.

    • SERVICE_ACCOUNT_NAME: Cloud Run 리소스를 연결할 서비스 계정의 이름
    • SERVICE_ACCOUNT_PROJECT_ID: 서비스 계정이 있는 프로젝트 ID
    • CLOUD_RUN_RESOURCE_PROJECT_NUMBER: Cloud Run이 있는 프로젝트 번호

    이 명령어는 사용자 관리 서비스 계정의 업데이트된 허용 정책을 출력합니다.

  3. 이 서비스 계정이 포함된 프로젝트를 사용하려면 조직 정책 iam.disableCrossProjectServiceAccountUsage를 폴더 수준에서 false 또는 unenforced로 설정하거나 프로젝트 수준 설정에서 상속해야 합니다. 기본적으로 true로 설정됩니다.

    콘솔

    1. Google Cloud 콘솔의 조직 정책 페이지로 이동합니다.

      조직 정책으로 이동

    2. 프로젝트 선택 도구에서 프로젝트 간 서비스 계정 사용을 중지할 조직과 프로젝트를 선택합니다.

    3. 프로젝트 간 서비스 계정 사용 중지 정책을 선택합니다.

    4. 정책 관리를 클릭합니다.

    5. 정책 소스에서 상위 정책 재정의를 선택합니다.

    6. 규칙 추가를 클릭합니다.

    7. 시행에서 사용 안함을 선택합니다.

    8. 정책을 시행하려면 정책 설정을 클릭합니다.

    gcloud

    서비스 계정이 있는 프로젝트에서 iam.disableCrossProjectServiceAccountUsage 조직 정책 제약조건이 적용되지 않았는지 확인합니다. 이 제약조건은 기본적으로 적용됩니다.

    이 조직 정책 제약조건을 중지하려면 다음을 실행합니다.

    gcloud resource-manager org-policies disable-enforce iam.disableCrossProjectServiceAccountUsage
        --project=SERVICE_ACCOUNT_PROJECT_ID

    SERVICE_ACCOUNT_PROJECT_ID를 서비스 계정이 포함된 프로젝트 ID로 바꿉니다.

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

다음 단계