서비스 간 액세스 승인

아키텍처에서 여러 서비스가 사용되는 경우 서비스 간 통신을 사용 설정하기 위해 사용자 인증 정보가 필요할 수 있습니다. Cloud Build는 서비스 간 보안 인증과 승인을 위해 OpenID Connect(OIDC) 표준을 기본 제공합니다.

Cloud Build를 사용하여 ID 토큰을 생성할 수 있습니다. 이 토큰을 사용하면 Cloud Build 내에서 보안 엔드포인트를 호출할 수 있습니다.

예를 들어 Cloud Run 함수, Cloud Run 또는 App Engine과 같은 서버리스 플랫폼 애플리케이션을 실행하는 경우 Cloud Build 워크로드 내에서 애플리케이션과 안전하게 상호작용할 수 있습니다.

시작하기 전에

  • Enable the Cloud Build and IAM APIs.

    Enable the APIs

  • 이 계정을 사용하여 단기 사용자 인증 정보를 만들려면 IAM Service Account Credentials API도 사용 설정해야 합니다.

    Enable the API

  • 이 가이드에서 명령줄 예시를 사용하려면 Google Cloud CLI를 설치하고 구성합니다.

  • 사용하려는 서비스 계정을 만들었는지 확인합니다. 빌드를 실행하는 프로젝트와 동일한 Google Cloud 프로젝트에서 서비스 계정을 만들어야 합니다.

필수 IAM 권한

사용자 지정 서비스 계정에 iam.serviceAccounts.getOpenIdToken 권한이 있어야 합니다.

서비스 계정에 IAM 역할을 부여하는 방법은 서비스 계정에 대한 액세스 관리를 참조하세요.

ID 토큰을 가져오는 방법

ID 토큰을 가져오도록 빌드 단계를 구성하는 방법에는 두 가지가 있습니다.

  • gcloud CLI 사용
  • 메타데이터 서버로 직접 요청 전송

gcloud를 통해 ID 토큰 가져오기

이 섹션의 다음 코드 스니펫에서는 gcloud CLI를 사용하여 ID 토큰을 가져오는 방법을 보여줍니다.

YAML

steps:

- name: 'gcr.io/cloud-builders/gcloud'
  script: 'gcloud auth print-identity-token --audiences ${_TOKEN_AUDIENCE} > /workspace/identity_token.txt'
  env:
  - _TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}
service_account: '$_SERVICE_ACCOUNT'
substitutions:
  _TOKEN_AUDIENCE: 'TOKEN_AUDIENCE'
  _SERVICE_ACCOUNT_ID: 'SERVICE_ACCOUNT_ID'
  _SERVICE_ACCOUNT: 'projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}'
logsBucket: 'LOGS_BUCKET_LOCATION'
options:
  logging: GCS_ONLY
  dynamic_substitutions: true

JSON

{
  "steps": [
      {
          "name": "gcr.io/cloud-builders/gcloud",
          "script": "gcloud auth print-identity-token --audiences ${_TOKEN_AUDIENCE} > /workspace/identity_token.txt"
          "env": [
              "_TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}"
          ]
      }
  ],
  "service_account": "$_SERVICE_ACCOUNT",
  "substitutions": {
      "_TOKEN_AUDIENCE": "TOKEN_AUDIENCE",
      "_SERVICE_ACCOUNT_ID": "SERVICE_ACCOUNT_ID",
      "_SERVICE_ACCOUNT": "projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}"
  },
  "logsBucket": "LOGS_BUCKET_LOCATION",
  "options": {
      "logging": "GCS_ONLY",
      "dynamic_substitutions": true
  }
}

다음을 바꿉니다.

  • TOKEN_AUDIENCE는 ID 토큰을 가져올 URL 또는 공유 대상 그룹입니다(예: http://www.example.com).
  • SERVICE_ACCOUNT_ID는 사용자 지정 서비스 계정의 이메일 주소나 고유 ID입니다. 예를 들면 service-account-name@project-id.iam.gserviceaccount.com입니다.
  • LOGS_BUCKET_LOCATION은 빌드 로그를 저장할 Cloud Storage 버킷입니다. 예를 들면 gs://mylogsbucket입니다.

메타데이터 서버로 직접 요청 전송

이 섹션의 다음 코드 스니펫에서는 요청을 직접 메타데이터 서버로 보내 ID 토큰을 가져오는 방법을 보여줍니다.

YAML

steps:
- name: 'gcr.io/cloud-builders/curl'
  id: 'printTokenFromCurl'
  script: |
    curl -H 'Metadata-Flavor: Google' http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=${_TOKEN_AUDIENCE} -o /workspace/identity_token.txt
  env:
  - _TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}
service_account: '$_SERVICE_ACCOUNT'
substitutions:
  _TOKEN_AUDIENCE: 'TOKEN_AUDIENCE'
  _SERVICE_ACCOUNT_ID: 'SERVICE_ACCOUNT_ID'
  _SERVICE_ACCOUNT: 'projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}'
logsBucket: 'LOGS_BUCKET_LOCATION'
options:
  logging: GCS_ONLY
  dynamic_substitutions: true

JSON

{
  "steps": [
      {
          "name": "gcr.io/cloud-builders/curl",
          "id": "printTokenFromCurl"
          "script": "curl -H 'Metadata-Flavor: Google' http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=${_TOKEN_AUDIENCE} -o /workspace/identity_token.txt"
          "env":
              "_TOKEN_AUDIENCE=${_TOKEN_AUDIENCE}"
      }
  ],
  "service_account": "$_SERVICE_ACCOUNT",
  "substitutions": {
      "_TOKEN_AUDIENCE": "TOKEN_AUDIENCE",
      "_SERVICE_ACCOUNT_ID": "SERVICE_ACCOUNT_ID",
      "_SERVICE_ACCOUNT": "projects/${PROJECT_ID}/serviceAccounts/${_SERVICE_ACCOUNT_ID}"
  },
  "logsBucket": "LOGS_BUCKET_LOCATION",
  "options": {
      "logging": "GCS_ONLY",
      "dynamic_substitutions": true
  }
}

다음을 바꿉니다.

  • TOKEN_AUDIENCE는 ID 토큰을 가져올 URL 또는 공유 대상 그룹입니다(예: http://www.example.com).
  • SERVICE_ACCOUNT_ID는 사용자 지정 서비스 계정의 이메일 주소나 고유 ID입니다. 예를 들면 service-account-name@project-id.iam.gserviceaccount.com입니다.
  • LOGS_BUCKET_LOCATION은 빌드 로그를 저장할 Cloud Storage 버킷입니다. 예를 들면 gs://mylogsbucket입니다.

워크로드에서 ID 토큰을 생성하고 사용하는 방법에 대한 자세한 내용은 ID 토큰을 가져오는 방법을 참조하세요.

다음 단계