キュー構成の保護

このページでは、キューの作成と構成を安全に行うためのベスト プラクティスの実装に関するアドバイスを提供します。その中には、キュー管理と 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
    

上記で付与された役割を 1 つ以上持つユーザーとして、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. サービスア カウントに cloudtasks.queueAdmin ロールを付与して、queue.yaml ファイルをアップロードし、Cloud Tasks のキュー管理 API 呼び出しを行えるようにします。

    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. ユーザーまたは別のエンティティがサービス アカウントの代理になれるように、サービス アカウント キーを作成します。

    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. iam.serviceAccountActor のロールを、プロジェクト内の Cloud Tasks API の使用を許可するユーザー、グループ、その他のエンティティに付与します。

    gcloud iam service-accounts add-iam-policy-binding \
      cloud-tasks-worker@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. ユーザーまたは別のエンティティがサービス アカウントの代理になれるように、サービス アカウント キーを作成します。

    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. queue.yaml ではなく App Engine アプリをデプロイできるように、サービス アカウントにロールを付与します。

    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. iam.serviceAccountActor のロールを、App Engine アプリのデプロイを許可するユーザー、グループ、その他のエンティティに付与します。

    gcloud iam service-accounts add-iam-policy-binding \
      app-engine-deployer@[PROJECT_ID].iam.gserviceaccount.com \
      --member user:[EMAIL] \
      --role roles/iam.serviceAccountActor
    
  4. ユーザーまたは別のエンティティがサービス アカウントの代理になれるように、サービス アカウント キーを作成します。

    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
    

サービス アカウントの詳細

サービス アカウントの包括的な説明については、次のページを参照してください。