함수 ID

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

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

런타임 서비스 계정

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

  • Cloud Functions(1세대)에는 App Engine 기본 서비스 계정PROJECT_ID@appspot.gserviceaccount.com이 사용됩니다.
  • Cloud Functions(2세대)에는 기본 compute 서비스 계정PROJECT_NUMBER-compute@developer.gserviceaccount.com이 사용됩니다.

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

이러한 기본 서비스 계정에는 여러 Google Cloud 서비스에 대한 광범위한 액세스를 허용하는 편집자 역할이 있습니다. 이 방법이 함수를 개발하는 가장 빠른 방법이지만 테스트 및 개발에만 기본 서비스 계정을 사용하는 것이 좋습니다. 프로덕션에서는 목표 달성에 필요한 최소 권한 집합만 런타임 서비스 계정에 부여해야 합니다.

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

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

Console

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

    Google Cloud Console로 이동

  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. 이러한 Google 관리 서비스 계정 모두에 서비스 계정 토큰 생성자 역할(roles/iam.serviceAccountTokenCreator)을 부여합니다. PROJECT...는 함수가 있는 프로젝트를 참조합니다.

      • 기본 서비스 계정(1세대 또는 2세대 사용 여부에 따라 다름):
        • 1세대: App Engine 기본 서비스 계정(PROJECT_ID@appspot.gserviceaccount.com)
        • 2세대: Compute Engine 기본 서비스 계정(PROJECT_NUMBER-compute@developer.gserviceaccount.com)
      • Cloud Functions 서비스 에이전트(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)

      이러한 계정은 서비스 계정의 프로젝트 간 액세스를 관리합니다.

    3. 다른 프로젝트의 서비스 계정에서 Cloud Functions 서비스 에이전트에 iam.serviceaccounts.actAs 권한을 부여합니다.

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

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

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

Console

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

    Google Cloud Console로 이동

  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은 서비스 계정 이메일입니다.

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

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

Console

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

    Google Cloud Console로 이동

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

다음 단계

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