함수 ID

Google Cloud의 항목 간 대다수 상호작용의 보안을 위해 각 항목에 비밀번호 또는 키와 같은 일부 보안 비밀 유형으로 보호되는 확인 가능한 ID가 있어야 합니다. 다른 항목이 Cloud Run Functions에 액세스하기 위해 ID가 필요한 것처럼 함수 자체도 경우에 따라 작업을 수행하기 위해 Google Cloud의 다른 리소스에 액세스해야 합니다. 모든 함수는 함수가 다른 리소스에 액세스할 때 ID로 제공되는 서비스 계정과 연결됩니다. 함수에서 ID로 사용하는 서비스 계정을 런타임 서비스 계정이라고도 합니다.

프로덕션 용도인 경우 각 함수에 사용자 관리 서비스 계정을 할당하여 전용 ID를 제공하는 것이 좋습니다. 사용자 관리 서비스 계정을 사용하면 Identity and Access Management를 사용하여 최소한의 권한 집합을 부여하는 방식으로 액세스를 제어할 수 있습니다.

런타임 서비스 계정

함수를 배포할 때 다른 런타임 서비스 계정을 지정하지 않으면 Cloud Run Functions가 함수 실행을 위한 ID로 기본 서비스 계정을 사용합니다.

  • Cloud Run Functions는 기본 Compute 서비스 계정PROJECT_NUMBER-compute@developer.gserviceaccount.com을 사용합니다.

    프로젝트 번호는 프로젝트 ID 및 프로젝트 이름과 다릅니다. Google Cloud 콘솔 대시보드 페이지에서 프로젝트 번호를 찾을 수 있습니다.

조직 정책 구성에 따라 프로젝트에 대한 편집자 역할이 기본 서비스 계정에 자동으로 부여될 수 있습니다. iam.automaticIamGrantsForDefaultServiceAccounts 조직 정책 제약조건을 적용하여 자동 역할 부여를 중지하는 것이 좋습니다. 2024년 5월 3일 이후에 조직을 만든 경우 기본적으로 이 제약조건이 적용됩니다.

자동 역할 부여를 중지한 경우 기본 서비스 계정에 부여할 역할을 결정한 후 직접 이러한 역할을 부여해야 합니다.

기본 서비스 계정에 이미 편집자 역할이 있으면 편집자 역할을 권한이 더 낮은 역할로 바꾸는 것이 좋습니다. 서비스 계정 역할을 안전하게 수정하려면 정책 시뮬레이터를 사용하여 변경사항의 영향을 확인한 후 적절한 역할을 부여하고 취소합니다.

프로덕션 환경에서 함수를 보호하려면 다음 안내를 따르세요.

기본 런타임 서비스 계정의 권한 변경

콘솔

  1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

    Google Cloud 콘솔로 이동

  2. 테이블에서 App Engine 기본 서비스 계정 또는 기본 compute 서비스 계정을 선택합니다.

  3. 행 오른쪽에 있는 연필 아이콘을 클릭하여 권한 수정 탭을 표시합니다.

  4. 최소 권한 액세스를 제공하도록 역할 드롭다운에서 역할을 추가 또는 삭제합니다.

  5. 저장을 클릭합니다.

gcloud

편집자 역할을 삭제한 다음 gcloud projects add-iam-policy-binding 명령어를 사용하여 새 역할을 추가합니다.

# Remove the Editor role
gcloud projects remove-iam-policy-binding PROJECT_ID \
--member="SERVICE_ACCOUNT_EMAIL" \
--role="roles/editor"

# Add the desired role
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="SERVICE_ACCOUNT_EMAIL" \
--role="ROLE"

여기서 PROJECT_ID는 사용 중인 프로젝트의 프로젝트 ID입니다. SERVICE_ACCOUNT_EMAIL런타임 서비스 계정에서 앞에 표시된 대로 기본 런타임 서비스 계정의 이메일 주소입니다. 그리고 ROLE은 기본 런타임 서비스 계정에 할당할 새 역할입니다.

함수에 개별 서비스 계정 사용

함수에 대한 액세스를 보다 유연하게 제어하려면 함수 자체 사용자 관리 서비스 계정을 부여하면 됩니다.

  1. 서비스 계정을 만듭니다. 이름을 기록해 둡니다.
  2. 함수가 작업을 수행하기 위해 액세스해야 하는 리소스에 따라 적절한 역할부여합니다.
  3. 서비스 계정과 함수가 다른 프로젝트에 있는 경우 서비스 계정이 있는 프로젝트에서 다음을 수행합니다.

    1. 여러 프로젝트에서 작동하도록 서비스 계정을 구성합니다.
    2. Cloud Run 서비스 에이전트(service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com)에 서비스 계정 토큰 생성자 역할(roles/iam.serviceAccountTokenCreator)을 부여합니다. 여기서 PROJECT는 함수가 있는 프로젝트를 참조합니다. Cloud Run 서비스 에이전트는 서비스 계정의 프로젝트 간 액세스를 관리합니다.

    3. 다른 프로젝트의 서비스 계정에서 Cloud Run Functions 서비스 에이전트(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)에 iam.serviceaccounts.actAs 권한을 부여합니다.

  4. 리소스에 서비스 계정 액세스 권한을 부여합니다. 이 작업을 수행하는 방법은 리소스 유형에 따라 다릅니다.

  5. 함수에 서비스 계정을 연결합니다. 배포 시에 또는 이전에 배포된 함수를 업데이트하여 이 작업을 수행할 수 있습니다.

배포 시 사용자 관리 서비스 계정 추가

콘솔

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔로 이동

  2. 원하는 대로 함수를 지정하고 구성합니다.

  3. 런타임, 빌드...를 클릭하여 추가 설정을 표시합니다.

  4. 런타임 탭을 선택합니다.

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

  6. 다음배포를 클릭합니다.

gcloud

gcloud functions deploy를 사용하여 함수를 배포할 때 --service-account 플래그를 추가합니다. 예를 들면 다음과 같습니다.

gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

여기서 FUNCTION_NAME은 함수 이름이고 SERVICE_ACCOUNT_EMAIL은 서비스 계정 이메일입니다.

기존 함수의 서비스 계정 업데이트

기존 함수의 런타임 서비스 계정을 업데이트할 수 있습니다.

콘솔

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔로 이동

  2. 원하는 함수 이름을 클릭하여 세부정보 페이지로 이동합니다.

  3. 세부정보 페이지의 맨 위에 있는 수정 연필을 클릭하여 함수를 편집합니다.

  4. 런타임, 빌드...를 클릭하여 추가 설정을 표시합니다.

  5. 런타임 탭을 선택합니다.

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

  7. 다음배포를 클릭합니다.

gcloud

gcloud functions deploy를 사용하여 함수를 배포할 때 --service-account 플래그를 추가합니다.

gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

여기서 FUNCTION_NAME은 함수 이름이고 SERVICE_ACCOUNT_EMAIL은 서비스 계정입니다.

이제 다시 배포된 함수에서 새 런타임 서비스 계정을 사용합니다.

메타데이터 서버를 사용하여 토큰 획득

IAM에서 정의한 서비스 계정이 Google Cloud에서 액세스 관리에 선호되는 방법이지만 일부 서비스에는 다른 모드(예:API 키, OAuth 2.0 클라이언트 또는 서비스 계정 키)가 필요할 수 있습니다. 외부 리소스에 액세스할 때는 다른 방법이 필요할 수도 있습니다.

대상 서비스에서 OpenID Connect ID 토큰이나 Oauth 2.0 액세스 토큰이 필요한 경우 전체 OAuth 클라이언트를 설정하는 대신 Compute 메타데이터 서버를 사용하여 이러한 토큰을 가져올 수 있습니다.

ID 토큰

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

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

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

액세스 토큰

OAuth 2.0 액세스 토큰은 범위를 사용하여 액세스 권한을 정의합니다. 기본적으로 Google Cloud 액세스 토큰에는 cloud-platform 범위가 있습니다. 다른 Google 또는 Google Cloud API에 액세스하려면 해당 범위의 액세스 토큰을 가져와야 합니다.

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 범위의 전체 목록을 참조하세요.

다음 단계

함수에 대한 액세스를 승인하거나 함수를 호출할 수 있도록 개발자 및 기타 함수를 인증하는 방법 알아보기