カスタム制約を使用して Dataproc リソースを管理する

Google Cloud の組織のポリシーを使用すると、組織のリソースをプログラムで一元管理できます。組織のポリシー管理者は組織のポリシーを定義できます。組織のポリシーは、Google Cloud のリソース階層内の Google Cloud リソースやそれらのリソースの子孫に適用される、制約と呼ばれる一連の制限です。組織のポリシーは、組織レベル、フォルダレベル、またはプロジェクト レベルで適用できます。

組織のポリシーは、さまざまな Google Cloud サービスに事前に定義された制約を提供します。ただし、組織のポリシーで制限されている特定のフィールドをきめ細かく制御する必要がある場合は、カスタム制約を作成して、カスタムの組織のポリシーでそれらのカスタム制約を使用することもできます。

利点

カスタムの組織のポリシーを使用して、Dataproc クラスタでの特定のオペレーションを許可または拒否できます。たとえば、クラスタの作成または更新を行うリクエストが、組織のポリシーによって設定されたカスタム制約検証を満たしていない場合、リクエストは失敗し、エラーが呼び出し元に返されます。

ポリシーの継承

デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、フォルダにポリシーを適用した場合、Google Cloud はそのフォルダ内のすべてのプロジェクトにそのポリシーを適用します。この動作の詳細と変更方法については、階層評価ルールをご覧ください。

料金

事前に定義された組織のポリシーやカスタムの組織のポリシーを含む組織のポリシー サービスは無料です。

準備

  1. プロジェクトを設定する
    1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
    2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

      プロジェクト セレクタに移動

    3. Google Cloud プロジェクトで課金が有効になっていることを確認します

    4. Dataproc API を有効にします。

      API を有効にする

    5. Google Cloud CLI をインストールします。
    6. gcloud CLI を初期化するには:

      gcloud init
    7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

      プロジェクト セレクタに移動

    8. Google Cloud プロジェクトで課金が有効になっていることを確認します

    9. Dataproc API を有効にします。

      API を有効にする

    10. Google Cloud CLI をインストールします。
    11. gcloud CLI を初期化するには:

      gcloud init
    12. 組織 ID を確実に把握します。

必要なロール

組織のポリシーを管理するために必要な権限を取得するには、 次の IAM ロールを付与するように管理者に依頼してください。

ロールの付与の詳細については、アクセスの管理をご覧ください。

これらの事前定義ロールには、拒否ポリシーの管理に必要な権限が含まれています。必要な権限を正確に確認するには、[必要な権限] セクションを開いてください。

必要な権限

組織のポリシーを管理するには、次の権限が必要です。

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

カスタム制約を作成する

カスタム制約は、適用先のリソース、メソッド、条件、アクションによって YAML ファイルで定義されます。Dataproc では、CLUSTER リソースの CREATE メソッドと UPDATE メソッドに適用されるカスタム制約がサポートされています(リソースとオペレーションに対する Dataproc の制約をご覧ください)。

Dataproc カスタム制約の YAML ファイルを作成するには:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- dataproc.googleapis.com/Cluster
methodTypes:
- METHOD
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

次のように置き換えます。

  • ORGANIZATION_ID: 組織 ID(123456789 など)。

  • CONSTRAINT_NAME: 新しいカスタム制約に付ける名前。カスタム制約は custom. で始まる必要があります。含められるのは大文字、小文字、数字のみです(例: custom.dataprocEnableComponentGateway)。このフィールドの最大長は 70 文字です。接頭辞(例: organizations/123456789/customConstraints/custom)はカウントされません。

  • METHOD: クラスタの作成制約を作成する場合は、CREATE を指定します。クラスタの UPDATE 制約を作成する場合は、次のように両方を指定します。
    methodTypes:
    - CREATE
    - UPDATE
    
  • CONDITION: サポート対象のサービス リソースの表現に対して書き込まれる CEL 条件。このフィールドの最大長は 1000 文字です。条件の書き込み先として使用できるリソースの詳細については、サポート対象のリソースをご覧ください。例: "resource.config.endpointConfig.enableHttpPortAccess==true"

  • ACTION: condition が満たされている場合に実行するアクション。ALLOW または DENY になります。

  • DISPLAY_NAME: 制約のわかりやすい名前(例: 「Dataproc コンポーネント ゲートウェイの有効化を適用する」)。 このフィールドの最大長は 200 文字です。

  • DESCRIPTION: ポリシー違反が発生したときにエラー メッセージとして表示される、制約のわかりやすい説明(例:「コンポーネント ゲートウェイが有効になっている場合にのみ Dataproc クラスタの作成を許可する」)。このフィールドの最大長は 2000 文字です。

カスタム制約の作成方法については、カスタム制約の定義をご覧ください。

カスタム制約を設定する

Google Cloud CLI を使用して新しいカスタム制約を作成したら、組織内の組織のポリシーで使用できるように設定する必要があります。カスタム制約を設定するには、gcloud org-policies set-custom-constraint コマンドを使用します。
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
CONSTRAINT_PATH は、カスタム制約ファイルのフルパスに置き換えます。たとえば、/home/user/customconstraint.yaml のようにします。完了すると、利用可能な組織のポリシーとしてカスタム制約が Google Cloud 組織のポリシーのリストに表示されます。カスタム制約が存在することを確認するには、gcloud org-policies list-custom-constraints コマンドを使用します。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ORGANIZATION_ID は組織リソースの ID に置き換えます。詳細については、組織のポリシーの表示をご覧ください。

カスタム制約を適用する

ブール型制約を適用するには、それを参照する組織のポリシーを作成し、それを Google Cloud リソースに適用します。

コンソール

ブール型制約を適用するには、次のようにします。

  1. Google Cloud コンソールで、[組織のポリシー] ページに移動します。

    [組織のポリシー] に移動

  2. ページの上部にあるプロジェクト選択ツールを選択します。
  3. プロジェクト選択ツールから、組織のポリシーを設定するプロジェクトを選択します。
  4. [組織のポリシー] ページのリストから制約を選択します。その制約の [ポリシーの詳細] ページが表示されます。
  5. このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
  6. [ポリシーの編集] ページで、[Override parent's policy] を選択します。
  7. [ルールを追加] をクリックします。
  8. [適用] で、この組織のポリシーの適用を有効にするかどうかを選択します。
  9. タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、タグを使用した組織のポリシーの設定をご覧ください。
  10. カスタム制約の場合は、[変更内容をテスト] をクリックして、組織のポリシーの効果をシミュレートできます。詳細については、Policy Simulator で組織のポリシーの変更をテストするをご覧ください。
  11. 組織のポリシーを完成させて適用するには、[ポリシーを設定] をクリックします。ポリシーが有効になるまでに最長 15 分かかります。

gcloud

ブール型制約を適用する組織のポリシーを作成するには、制約を参照するポリシー YAML ファイルを作成します。

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

次のように置き換えます。

  • PROJECT_ID: 制約を適用するプロジェクト。
  • CONSTRAINT_NAME: カスタム制約に定義した名前。たとえば、custom.dataprocEnableComponentGateway のようにします。

制約を含む組織のポリシーを適用するには、次のコマンドを実行します。

    gcloud org-policies set-policy POLICY_PATH
    

POLICY_PATH は、組織のポリシーの YAML ファイルのパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。

カスタム制約をテストする

次のクラスタ作成例では、カスタム組織のポリシーが作成され、クラスタ作成時に適用され、コンポーネント ゲートウェイresource.config.endpointConfig.enableHttpPortAccess==true)を有効にする必要があることを前提としています。

gcloud dataproc clusters create example-cluster \
    --project=PROJECT_ID \
    --zone=COMPUTE_ZONE

出力例(デフォルトでは、Dataproc クラスタの作成時にコンポーネント ゲートウェイは有効になりません):

Operation denied by custom org policies: ["customConstraints/custom.dataprocEnableComponentGateway": "Only allow Dataproc cluster creation if the Component Gateway is enabled"]

リソースとオペレーションに対する Dataproc の制約

次の Dataproc カスタム制約フィールドは、Dataproc クラスタを作成または更新する際に使用できます。 クラスタを更新するときは、編集可能なクラスタ パラメータに関連する制約のみがサポートされます(クラスタの更新をご覧ください)。

  • Compute Engine ネットワーク構成(networkUri、internalIpOnly、serviceAccount、metadata)
    • resource.config.gceClusterConfig.networkUri
    • resource.config.gceClusterConfig.internalIpOnly
    • resource.config.gceClusterConfig.serviceAccount
    • resource.config.gceClusterConfig.metadata
  • Compute Engine インスタンス グループ構成(imageUri と machineTypeUri)
    • resource.config.masterConfig.imageUri
    • resource.config.masterConfig.machineTypeUri
    • resource.config.workerConfig.imageUri
    • resource.config.workerConfig.machineTypeUri
    • resource.config.secondaryWorkerConfig.imageUri
    • resource.config.secondaryWorkerConfig.machineTypeUri
  • 初期化アクション(executableFile)
    • resource.config.initializationActions.executableFile
  • ソフトウェア設定(imageVersion、properties、optionalComponents)
    • resource.config.softwareConfig.imageVersion
    • resource.config.softwareConfig.properties
    • resource.config.softwareConfig.optionalComponents
  • Kerberos 構成(enableKerberos と crossRealmTrustKdc)
    • resource.config.securityConfig.kerberosConfig.enableKerberos
    • resource.config.securityConfig.kerberosConfig.crossRealmTrustKdc
  • コンポーネント ゲートウェイ(enableHttpPortAccess)
    • resource.config.endpointConfig.enableHttpPortAccess
  • Metastore 構成(dataprocMetastoreService)
    • resource.config.metastoreConfig.dataprocMetastoreService
  • Persistent Disk CMEK(gcePdKmsKeyName)
    • resource.config.encryptionConfig.gcePdKmsKeyName
  • クラスタラベル
    • resource.labels
  • クラスタサイズ
    • resource.config.masterConfig.numInstances
    • resource.config.workerConfig.numInstances
    • resource.config.secondaryWorkerConfig.numInstances
  • 自動スケーリング
    • resource.config.autoscalingConfig.policyUri

一般的なユースケースのカスタム制約の例

次の表に、カスタム制約の例を示します。

説明 制約の構文
クラスタを作成または更新する際には、Dataproc ワーカー インスタンスの数を 10 以下に制限します。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.dataprocNoMoreThan10Workers
    resourceTypes:
    - dataproc.googleapis.com/Cluster
    methodTypes:
    - CREATE
    - UPDATE
    condition: "resource.config.workerConfig.numInstances + resource.config.secondaryWorkerConfig.numInstances > 10"
    actionType: DENY
    displayName: Total number of worker instances cannot be larger than 10
    description: Cluster cannot have more than 10 workers, including primary and
    secondary workers.
Dataproc クラスタのプリエンプティブル ワーカーでアプリケーション マスターが実行されないようにします。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.dataprocAmPrimaryOnlyEnforced
    resourceTypes:
    - dataproc.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition:  "('dataproc:am.primary_only' in resource.config.softwareConfig.properties) && (resource.config.softwareConfig.properties['dataproc:am.primary_only']==true)"
    actionType: ALLOW
    displayName: Application master cannot run on preemptible workers
    description: Property "dataproc:am.primary_only" must be "true".
Dataproc クラスタでカスタム Hive プロパティを禁止します。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.dataprocNoCustomHiveProperties
    resourceTypes:
    - dataproc.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "resource.config.softwareConfig.properties.all(p, !p.startsWith('hive:'))"
    actionType: ALLOW
    displayName: Cluster cannot have custom Hive properties
    description: Only allow Dataproc cluster creation if no property
    starts with Hive prefix "hive:".
Dataproc マスター インスタンスへの n1-standard-2 マシンタイプの使用を禁止します。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.dataprocMasterMachineType
    resourceTypes:
    - dataproc.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "resource.config.masterConfig.machineTypeUri.contains('n1-standard-2')"
    actionType: DENY
    displayName: Master cannot use the n1-standard-2 machine type
    description:  Prevent Dataproc cluster creation if the master machine type is n1-standard-2.
指定した初期化アクション スクリプトの使用を適用します。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.dataprocInitActionScript
    resourceTypes:
    - dataproc.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "resource.config.initializationActions.exists(action, action.executableFile=='gs://some/init-action.sh')"
    actionType: ALLOW
    displayName: Initialization action script "gs://some/init-action.sh" must be used
    description:  Only allow Dataproc cluster creation if the "gs://some/init-action.sh".
    initialization action script is used.
指定した永続ディスク暗号化鍵の使用を適用します。

    name: organizations/ORGANIZATION_ID/custom.dataprocPdCmek
    resourceTypes:
    - dataproc.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "resource.config.encryptionConfig.gcePdKmsKeyName == 'projects/project-id/locations/global/keyRings/key-ring-name/cryptoKeys/key-name'"
    actionType: ALLOW
    displayName: Cluster PD must be encrypted with "key-name" from "key-ring-name" key-ring
    description: Only allow Dataproc cluster creation if the PD is encrypted with "key-name" from "key-ring-name" key-ring.
クラスタ ラベル制限を適用します。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.dataprocEnvLabel
    resourceTypes:
    - dataproc.googleapis.com/Cluster
    methodTypes:
    - CREATE
    - UPDATE
    condition:  "('env' in resource.labels) && (resource.labels.env=='test')"
    actionType: DENY
    displayName: Cluster cannot have the "env=test" label
    description:  Deny Dataproc cluster creation or update if the cluster will be labeled "env=test".
デフォルト以外のネットワークの使用を適用します。

    name: organizations/ORGANIZATION_ID/customConstraints/custom.dataprocNoDefaultNetwork
    resourceTypes:
    - dataproc.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition:  "resource.config.gceClusterConfig.networkUri.contains('networks/default')"
    actionType: DENY
    displayName: Cluster cannot be created in the default network
    description:  Deny Dataproc cluster creation if the cluster will be created in the default network.

次のステップ