아키텍처에서 여러 서비스가 사용되는 경우 서비스 간 통신을 사용 설정하기 위해 사용자 인증 정보가 필요할 수 있습니다. 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.
이 계정을 사용하여 단기 사용자 인증 정보를 만들려면 IAM Service Account Credentials API도 사용 설정해야 합니다.
이 가이드에서 명령줄 예시를 사용하려면 Google Cloud CLI를 설치하고 구성합니다.
사용하려는 서비스 계정을 만들었는지 확인합니다. 빌드를 실행하는 프로젝트와 동일한 Google Cloud 프로젝트에서 서비스 계정을 만들어야 합니다.
필수 IAM 권한
사용자 지정 서비스 계정에 iam.serviceAccounts.getOpenIdToken
권한이 있어야 합니다.
- 서비스 계정을 만든 프로젝트에서 사용자 지정 서비스 계정에 서비스 계정 OpenID Connect ID 토큰 생성자(
roles/iam.serviceAccountOpenIdTokenCreator
) 역할을 부여합니다.
서비스 계정에 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 토큰을 가져오는 방법을 참조하세요.