IAM으로 액세스 제어

함수를 배포하는 사용자 또는 서비스 계정은 프로젝트 수준에서 역할을 사용하여 액세스 제어를 설정할 수 있습니다. 프로젝트 구성원 또는 서비스 계정에 역할을 부여하여 Google Cloud 프로젝트 및 해당 리소스에 대한 액세스 수준을 결정합니다. 기본적으로 모든 Google Cloud 프로젝트에는 원래 프로젝트 생성자인 단일 사용자가 존재합니다. 사용자가 프로젝트팀 구성원으로 추가되기 전까지 다른 사용자는 프로젝트에 액세스할 수 없으며 따라서 함수에도 액세스할 수 없습니다.

사용자 액세스 제어

Identity and Access Management(IAM)를 사용하여 사용자를 프로젝트에 팀 구성원으로 추가하고 역할을 부여할 수 있습니다.

Cloud Functions는 편집자, 소유자, 뷰어기본 역할을 지원하며 이러한 역할에는 다음 권한이 부여됩니다.

  • 편집자소유자: 모든 함수 관련 리소스에 대한 읽기 및 쓰기 권한입니다. 사용자는 이를 통해 함수를 배포, 업데이트, 삭제할 수 있습니다. 프로젝트의 다른 리소스에 추가로 액세스할 수 있습니다.
  • 뷰어: 함수와 위치에 대한 읽기 전용 액세스 권한입니다. 사용자는 이를 통해 함수를 나열하고 세부정보를 볼 수 있지만 소스 코드를 볼 수는 없습니다. 프로젝트의 다른 리소스에 추가로 액세스할 수 있습니다.

또한 Cloud Functions는 Cloud Functions 사전 정의된 개발자뷰어 역할을 지원하며, 이 역할에는 다음 권한이 부여됩니다.

  • 개발자: 모든 함수 관련 리소스에 대한 읽기 및 쓰기 액세스 권한입니다. 사용자는 이를 통해 함수를 배포, 업데이트, 삭제할 수 있습니다. 프로젝트의 다른 리소스에는 액세스할 수 없습니다.
  • 뷰어: 함수와 위치에 대한 읽기 전용 액세스 권한입니다. 사용자는 이를 통해 함수를 나열하고 세부정보를 볼 수 있지만 소스 코드를 볼 수는 없습니다. 프로젝트의 다른 리소스에는 액세스할 수 없습니다.

서비스 계정에 대한 액세스 제어

서비스 계정은 특수한 유형의 Google Cloud 계정으로, 다양한 작업을 수행하고 데이터에 액세스하도록 승인되고 인증되어야 하는 사람이 아닌 사용자의 ID 역할을 합니다. 이 계정 중 일부는 Google에서 직접 만들고 관리하며 이를 서비스 에이전트라고 합니다.

Cloud Functions에서 사용되는 서비스 계정은 다음과 같습니다.

이름 구성원 ID 역할
App Engine 기본 서비스 계정(1세대만) PROJECT_ID@appspot.gserviceaccount.com 편집기
Compute Engine 기본 서비스 계정(2세대만) PROJECT_NUMBER-compute@developer.gserviceaccount.com 편집기
Google Cloud Functions 서비스 에이전트 service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com Cloud Functions 서비스 에이전트
PROJECT_NUMBER@cloudbuild.gserviceaccount.com Cloud Build 서비스 계정
Cloud Build 서비스 계정 service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com Cloud Build 서비스 에이전트
Google Container Registry 서비스 에이전트 service-PROJECT_NUMBER@containerregistry.iam.gserviceaccount.com Container Registry 서비스 에이전트
Artifact Registry 서비스 에이전트 service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com Artifact Registry 서비스 에이전트

런타임 서비스 계정

런타임 시 Cloud Functions(1세대)에는 기본적으로 프로젝트에 대한 편집자 역할이 있는 App Engine 기본 서비스 계정(PROJECT_ID@appspot.gserviceaccount.com)이 사용됩니다. Cloud Functions(2세대)에는 기본적으로 프로젝트에 대한 편집자 역할도 있는 Compute Engine 기본 서비스 계정(PROJECT_NUMBER-compute@developer.gserviceaccount.com)이 사용됩니다. 이러한 서비스 계정의 역할을 변경하여 실행 중인 함수에 대한 권한을 제한하거나 확장할 수 있습니다. 기본이 아닌 서비스 계정을 제공하여 사용되는 서비스 계정을 변경할 수도 있습니다.

서비스 계정에 대해 자세히 알아보려면 서비스 계정 문서를 참조하세요.

관리 서비스 계정

함수를 생성, 업데이트 또는 삭제하는 동안 프로젝트에서 관리 작업을 수행하려면 Cloud Functions의 모든 프로젝트에 Google Cloud Functions 서비스 에이전트 서비스 계정(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)이 필요합니다.

또한 모든 런타임은 프로젝트 내에서 컨테이너 이미지 빌드와 스토리지를 수행합니다. 이를 지원하려면 다음을 프로비저닝해야 합니다.

이러한 서비스 계정에는 이전 에 나열된 역할이 있어야 합니다.

Google Cloud Functions 서비스 에이전트 서비스 계정

기본적으로 Google Cloud Functions 서비스 에이전트 서비스 계정(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)에는 프로젝트에 대한 cloudfunctions.serviceAgent 역할이 있습니다. 해당 계정의 권한을 변경하면 함수를 생성, 업데이트, 삭제하지 못할 수 있습니다.

다음은 cloudfunctions.serviceAgent에서 사용하는 몇 가지 주요 권한입니다.

권한 설명
roles/artifactregistry.admin Artifact Registry에서 저장소를 관리하고 빌드 이미지를 저장합니다.
roles/cloudbuild.builds.editor 사용자 프로젝트에서 빌드를 수행하기 위해 Cloud Build를 사용하는 데 필요합니다.
roles/cloudbuild.customworkers.builder Cloud Build 커스텀 작업자에서 빌드를 만듭니다.
cloudfunctions.functions.invoke IAM으로 보호되는 1세대 HTTP 함수를 호출합니다.
compute.globalOperations.get,
compute.networks.access,
vpcaccess.connectors.{get, use}
소비자 프로젝트 VPC에 액세스할 수 있는 함수를 프로비저닝합니다.
roles/eventarc.developer 2세대 함수에 대한 Eventarc 트리거를 관리합니다.
firebasedatabase.instances.{get, update} Firebase 실시간 데이터베이스에 의해 트리거된 함수를 생성합니다.
iam.serviceAccounts.{actAs, getAccessToken, signBlob} 런타임 서비스 계정 사용자 인증 정보를 가져옵니다.
iam.serviceAccounts.getOpenIdToken 에이전트가 사용자 지정 권한에 대한 OpenID 토큰을 가져오는 데 필요합니다. OpenID 토큰은 IAM이 사용 설정된 함수를 호출하는 데 사용됩니다.
pubsub.subscriptions 사용자 프로젝트의 구독을 관리합니다.
pubsub.topics 사용자 프로젝트의 주제를 관리합니다.
roles/run.developer 2세대 함수에 대한 Cloud Run 서비스를 관리합니다.
storage.buckets.{get, update} 1세대 함수를 트리거하는 Cloud Storage 버킷에서 알림을 구성합니다.
storage.buckets.create,
storage.objects.{delete, get, create, list}
사용자 프로젝트에 소스 코드를 저장하는 데 필요합니다.

사전 정의된 IAM 역할에서 또는

gcloud iam roles describe roles/cloudfunctions.serviceAgent
명령어를 실행하여 전체 권한 집합을 볼 수 있습니다.

현재 사용하는 서비스 역할을 제거하고 Cloud Functions 서비스 에이전트 역할을 추가하여 이 서비스 계정을 기본 역할로 재설정할 수 있습니다.

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member serviceAccount:service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
  --role roles/cloudfunctions.serviceAgent

권한 오류 문제 해결

프로젝트에서 함수를 배포, 업데이트, 삭제 또는 실행 시에 권한 오류가 발생하면 다음 단계를 수행합니다.

  1. 프로젝트에 대한 편집자 또는 소유자 역할이 있는지 Cloud Functions 개발자 역할을 사용하고 있는지 확인합니다.

    프로젝트 수준에서 Cloud Functions 개발자 역할을 사용하고 있다면 반드시 사용자에게 IAM 서비스 계정 사용자 역할을 부여해야 합니다.

    현재 함수별 수준에서는 실행 권한만 허용됩니다.

  2. Cloud Functions 서비스 에이전트 서비스 계정(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)에 프로젝트에 대한 cloudfunctions.serviceAgent 역할이 있는지 확인합니다.

    이 계정을 표시하려면 Console IAM 페이지의 권한 탭에서 Google 제공 역할 부여 포함 체크박스를 선택합니다. gcloud projects add-iam-policy-binding PROJECT_ID를 사용할 수도 있습니다.

  3. Pub/Sub 또는 Cloud Storage와 같은 트리거 소스에 권한이 있는지 확인합니다.

함수 실행 시 '권한 부족' 오류가 발생하거나 다른 인증 문제가 발생하는 경우, 런타임 서비스 계정에 함수에서 필요한 리소스에 액세스할 수 있는 올바른 권한이 있는지 확인합니다. 그런 다음 2단계와 3단계를 반복합니다.

배포 중에 '서비스를 사용할 수 없음' 오류가 발생하면 런타임 서비스 계정 PROJECT_ID@appspot.gserviceaccount.com이 프로젝트에 있는지 확인합니다. 서비스 계정이 삭제된 경우 이를 다시 만들려면 서비스 계정 삭제 취소를 참조하세요.

Cloud Functions 문제 해결도 참조하세요.