큐 구성 보호

이 페이지에서는 큐 관리와 queue.yaml 사용 비교에서 설명한 문제를 최소화하는 등 큐 생성 및 구성을 보호하기 위한 권장사항을 구현하기 위한 제안사항을 설명합니다. 핵심은 소수의 사용자 또는 항목으로 큐 관리 메서드를 제한하는 것입니다. 대규모 조직의 경우 서비스 계정을 사용하여 적절한 큐 구성을 시행하는 소프트웨어를 실행해야 할 수 있습니다.

일반적으로 사용자와 기타 항목을 다음 3가지 카테고리로 구분합니다.

  1. 큐 관리자 - 이 그룹의 사용자에게는 Cloud Tasks 큐 관리 메서드를 호출하거나 queue.yaml 파일을 업로드할 권한이 있습니다. 이 그룹은 의도치 않게 queue.yaml과 Cloud Tasks 큐 관리 메서드를 혼합하여 큐 구성에 문제가 발생할 위험을 줄이기 위해 소수의 사용자로 제한됩니다.
  2. Cloud Tasks 작업자 - 이 그룹의 사용자는 태스크를 큐에 추가하거나 큐에서 삭제하는 등 Cloud Tasks와의 일반적인 상호작용을 수행할 권한이 있습니다. Cloud Tasks 큐 관리 메서드를 호출할 수 없습니다.
  3. App Engine 배포자 - App Engine 앱이 있는 프로젝트의 경우 이 그룹의 사용자는 앱을 배포할 권한을 가집니다. queue.yaml 파일을 업로드하거나 Cloud Tasks API를 호출할 수는 없으므로 큐 관리자가 적절한 정책을 적용할 수 있습니다.

이 체계에서 큐 관리자인 사용자는 Cloud Tasks 작업자가 아니어야 합니다. 그렇게 되면 분리 목적이 무효화될 수 있습니다.

프로젝트가 Cloud Tasks 큐 관리 메서드만 사용하는 경우 잘못된 queue.yaml 파일을 업로드할 수 있으므로 큐 관리자는 App Engine 개발자도 아니어야 합니다.

소규모 프로젝트 및 조직

소규모 프로젝트 및 조직은 Identity and Access Management(IAM) 역할을 사용자에게 직접 할당하여 위의 그룹에 배치할 수 있습니다. 이는 구성의 단순성을 선호하는 팀이나 대기열 구성 변경 또는 App Engine 앱 배포를 수동으로 수행하는 팀에 적합합니다.

다음과 같이 사용자를 이 그룹에 추가하세요.

큐 관리자

  1. 프로젝트 관리자로서 Cloud Tasks 큐 관리 API를 호출하거나 queue.yaml 파일을 업로드할 수 있는 사용자에게 cloudtasks.queueAdmin 역할을 부여합니다.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/cloudtasks.queueAdmin
    
  2. cloudtasks.queueAdmin 역할이 있는 사용자로서 위의 권장사항에 따라 다음 방법 중 하나를 선택하여 큐 구성을 변경합니다.

    1. Cloud Tasks API를 사용하여 큐 구성을 변경합니다.

    2. gcloudqueue.yaml 업로드:

      gcloud app deploy queue.yaml
      

Cloud Tasks 작업자

Cloud Tasks와 상호작용할 수 있는 사용자가 많이 있으므로 개별 사용자가 아니라 서비스 계정에 역할을 할당할 수 있습니다. 이러한 사용 방식은 프로덕션 단계에서 일반적입니다. 자세한 내용은 대규모 프로젝트 및 조직을 참조하세요.

  1. 프로젝트 관리자로서 Cloud Tasks와 상호작용할 수는 있지만 큐 구성은 변경할 수 없는 사용자에게 역할을 부여합니다.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskDeleter
    

위에서 부여된 역할이 하나 이상 있는 사용자로서 Cloud Tasks API와 상호작용할 수 있습니다.

App Engine 배포자

  1. 프로젝트 관리자로서 App Engine 앱을 배포할 수는 있지만 대기열 구성을 수정하거나 작업과 상호작용할 수 없는 사용자에게 역할을 부여합니다.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member user:[EMAIL] \
      --role roles/storage.admin
    
  2. 위에서 부여된 역할이 있는 사용자로서 App Engine 앱을 배포합니다.

    gcloud app deploy app.yaml
    

대규모 프로젝트 및 조직

대규모 프로젝트 및 조직은 서비스 계정을 사용하여 업무 및 책임을 분리할 수 있습니다. 이 방법은 큐 구성을 변경하고 App Engine 앱을 배포하기 위한 복잡한 인프라가 있는 팀에 적합합니다.

아래 안내는 일반적으로 큐 구성, Cloud Tasks와의 상호작용, App Engine 앱 배포가 실제 사용자를 통해서가 아니라 소프트웨어를 통해 발생하는 경우에 적합합니다. 또한 팀의 모든 구성원이 이 페이지의 콘텐츠를 이해하지 않고도 큐 구성을 보호할 수 있습니다.

예를 들어 모든 사용자가 큐를 만들고 업데이트하고 삭제하기 위해 사용해야 하는 웹 앱 또는 명령줄 도구를 만들 수 있습니다. 해당 도구가 Cloud Tasks 큐 관리 메서드 또는 queue.yaml 중 어떤 것을 사용하는지는 사용자가 신경 쓸 필요 없는 도구의 구현 세부정보입니다. 도구가 큐 관리자 그룹의 유일한 항목인 경우에는 Cloud Tasks 큐 관리 메서드와 queue.yaml이 부적절하게 혼합되는 경우는 없습니다.

이러한 서비스 계정을 설정하는 방법은 다음과 같습니다.

큐 관리자

  1. 프로젝트 관리자로서 서비스 계정을 만듭니다.

    gcloud iam service-accounts create queue-admin \
      --display-name "Queue Admin"
    
  2. queue.yaml 파일을 업로드하고 Cloud Tasks 큐 관리 API 호출을 수행할 수 있도록 cloudtasks.queueAdmin 역할을 서비스 계정에 부여합니다.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.queueAdmin
    
  3. 큐 구성을 변경할 수 있는 실제 사용자, 그룹 또는 기타 항목iam.serviceAccountActor 역할을 부여합니다. 이는 응급 상황에서 대응할 수 있는 관리자와 같이 매우 적은 수의 사용자여야 합니다.

    gcloud iam service-accounts add-iam-policy-binding \
      queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. 실제 사용자 또는 다른 항목이 서비스 계정의 ID를 사용할 수 있도록 서비스 계정 키를 만듭니다.

    gcloud iam service-accounts keys create \
      --iam-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      ~/queue-admin-service-account-key.json
    
  5. iam.serviceAccountActor 역할이 부여된 사용자 또는 기타 항목으로서 서비스 계정의 ID를 가정합니다.

    gcloud auth activate-service-account queue-admin@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/queue-admin-service-account-key.json
    
  6. 위의 권장사항을 따라 다음 방법 중 하나만 선택하여 큐 구성을 변경합니다.

    1. Cloud Tasks를 사용하여 큐 구성을 변경합니다.

    2. gcloudqueue.yaml 업로드:

      gcloud app deploy queue.yaml
      

Cloud Tasks 작업자

  1. 프로젝트 관리자로서 서비스 계정을 만듭니다.

    gcloud iam service-accounts create cloud-tasks-worker \
      --display-name "Cloud Tasks Worker"
    
  2. Cloud Tasks와 상호작용할 수는 있지만 대기열 구성은 변경할 수 없도록 서비스 계정에 역할을 부여합니다.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/cloudtasks.taskDeleter
    
  3. 프로젝트에서 Cloud Tasks API를 사용할 수 있는 실제 사용자, 그룹 또는 기타 항목iam.serviceAccountActor 역할을 부여합니다.

    gcloud iam service-accounts add-iam-policy-binding \
      cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. 실제 사용자 또는 다른 항목이 서비스 계정의 ID를 사용할 수 있도록 서비스 계정 키를 만듭니다.

    gcloud iam service-accounts keys create \
      --iam-account cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      ~/cloud-tasks-worker-service-account-key.json
    
  5. iam.serviceAccountActor 역할이 부여된 사용자 또는 기타 항목으로서 서비스 계정의 ID를 가정합니다.

    gcloud auth activate-service-account cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/cloud-tasks-worker-service-account-key.json
    
  6. Cloud Tasks API를 사용합니다.

App Engine 배포자

  1. 프로젝트 관리자로서 서비스 계정을 만듭니다.

    gcloud iam service-accounts create app-engine-deployer \
      --display-name "App Engine Deployer"
    
  2. App Engine 앱을 배포할 수 있지만 queue.yaml은 배포할 수 없도록 서비스 계정에 역할을 부여합니다.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding [PROJECT_ID] \
      --member serviceAccount:app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --role roles/storage.admin
    
  3. App Engine 앱을 배포할 수 있는 실제 사용자, 그룹 또는 기타 항목iam.serviceAccountActor 역할을 부여합니다.

    gcloud iam service-accounts add-iam-policy-binding \
      app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. 실제 사용자 또는 다른 항목이 서비스 계정의 ID를 사용할 수 있도록 서비스 계정 키를 만듭니다.

    gcloud iam service-accounts keys create \
      --iam-account app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      ~/app-engine-deployer-service-account-key.json
    
  5. iam.serviceAccountActor 역할이 부여된 사용자 또는 기타 항목으로서 서비스 계정의 ID를 가정합니다.

    gcloud auth activate-service-account app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --key-file ~/app-engine-deployer-service-account-key.json
    
  6. App Engine 앱을 배포합니다.

    gcloud app deploy app.yaml
    

서비스 계정 자세히 알아보기

서비스 계정에 대한 포괄적인 설명은 다음 페이지를 참조하세요.