タグを使用すると、リソースに特定のタグが付加されているかどうかに基づいて、条件付きでポリシーの許可や拒否を行えます。タグと組織のポリシーの条件付き適用を使用すると、階層内のリソースを集中管理できます。
始める前に
タグとその仕組みのより詳しい説明は、タグの概要をご覧ください。
タグの使用方法について詳しくは、タグの作成と管理をご覧ください。
タグを使用した組織のポリシーの設定
タグを使用して組織のポリシーを有効にする場所を決定するには、組織のポリシーの YAML ファイルで条件を指定する必要があります。特定のタグ Key-Value ペアに一致するように条件を設定し、組織のポリシーを適用するために特定のタグ値を設定することが要求できます。
ほとんどの組織のポリシーは、リソースを作成または更新するときに評価され、適用されます。リソースを作成する前にタグを付加することはできないため、条件付きの組織のポリシーは、作成時にはリソースのタグを評価できません。親リソースから継承されたタグに関してのみです。
タグは、組織、フォルダ、プロジェクトのリソースに対して評価されます。リソース階層内のプロジェクト下にあるリソースのほとんどは、組織のポリシーによって評価されません。ただし、Cloud Run サービスなどの特定の例外を除きます。特定の組織のポリシーの制約については、組織のポリシーの制約をご覧ください。
リスト型ポリシーの例
次の例は、gcp.resourceLocations
制約を適用する組織のポリシー ファイルの設定方法を示します。この組織のポリシーでは、同じポリシー ファイルに設定された条件付き値と無条件の値の両方が使用されます。
Console
組織のポリシーを設定する手順は次のとおりです。
Cloud コンソールで [組織のポリシー] ページを開きます。
ページの上部にあるプロジェクト選択ツールを選択します。
プロジェクト選択ツールから、組織のポリシーを設定するプロジェクトを選択します。
[組織のポリシー] ページのリストから制約を選択します。 その制約の [ポリシーの詳細] ページが表示されます。
このリソース用に組織ポリシーをカスタマイズするには、[編集] をクリックします。
[編集] ページで、[カスタマイズ] を選択します。
[ポリシーの適用] で、適用オプションを選択します。
組織ポリシーを結合してまとめて評価するには、[親と結合する] を選択します。継承とリソース階層の詳細については、階層評価についてをご覧ください。
親リソースから継承されたポリシーをオーバーライドするには、[置換] を選択します。
[ルールを追加] をクリックします。
[ポリシー値] で、この組織のポリシーですべての値を許可するか、すべての値を拒否するか、または値のカスタムセットを指定するかを選択します。
- ポリシーで使用できる特定の値は、ポリシーが適用されるサービスによって異なります。使用可能な制約と値の一覧については、組織のポリシーの制約をご覧ください。
タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。
[タイトル] フィールドに、条件の名前を入力します。
[説明] フィールドに、条件の説明を入力します。この説明では、必須タグとそれらがリソースに及ぼす影響について説明します。
条件作成ツールを使用して、制約を有効にするために特定のタグを必要とする条件を作成できます。
[条件タイプ] プルダウン メニューから [タグ] を選択します。
条件の [演算子] を選択します。タグ全体と一致するには、matches 演算子を使用します。タグキーとタグ値を照合するには、matches ID 演算子を使用します。
matches 演算子を選択した場合は、タグの名前空間名の値を入力します。matches ID 演算子を選択した場合は、キーと値の ID を入力します。
[追加] をクリックすると、複数の条件を作成できます。別の条件を追加する場合は、AND を切り替えることで、すべての条件を要求するように条件付きロジックを設定できます。OR を切り替えることで、条件の 1 つのみが true になるように条件付きロジックを設定できます。
条件フィールドの右側にある大きな [X] をクリックすると、式を削除できます。
条件の編集が完了したら、[保存] をクリックします。
次の図には、条件を含む組織のポリシーの構成例を示しています。
[条件エディタ] を使用して、プログラムで条件式を作成できます。また、現在の条件のセットがプログラムによってレンダリングされます。
- 条件エディタを使用して
!
論理演算子を適用できます。たとえば、!resource.matchTag('ORGANIZATION_ID/location', 'us-west1')
というクエリでは、us-west1
タグがないリソースに組織のポリシーの制約が適用されます。
- 条件エディタを使用して
組織ポリシーを完成させて適用するには、[保存] をクリックします。
gcloud
組織のポリシーを設定するには、次のコマンドを実行します。
gcloud org-policies set-policy POLICY_PATH
ここで、POLICY_PATH
は、組織のポリシー JSON ファイルへのフルパスです。出力は次のようになります。
{ "name":"RESOURCE_TYPE/RESOURCE_ID/policies/gcp.resourceLocations", "spec":{ "rules":[ { // As there is no condition specified, this allowedValue is enforced // unconditionally. "values":{ "allowedValues": ["us-east1-locations"] }, }, { // This condition applies to the values block. "condition":{ "expression":"resource.matchTag('ORGANIZATION_ID/location', 'us-west1')" }, "values":{ "allowedValues": ["us-west1-locations"] } } ] } }
ここで
RESOURCE_TYPE
はorganizations
、folders
、またはprojects
です。RESOURCE_ID
は、RESOURCE_TYPE
で指定されたリソースのタイプに応じた、組織 ID、フォルダ ID、プロジェクト ID またはプロジェクト番号です。ORGANIZATION_ID
はタグキーの親組織です。
上述の組織のポリシーの場合、リソースとそのすべての子リソースには gcp.resourceLocations
制約が適用され、allowedValues
は us-east1-locations
のみになります。タグ location: us-west1
が設定されているリソースには、gcp.resourceLocations
制約が適用され、allowedValues
は us-east1-locations
と us-west1-locations
です。
このようにして、1 つの組織のポリシー内の制約に条件付きと無条件の両方の値のセットを適用できます。
ブール型ポリシーの例
次の例は、compute.disableSerialPortAccess
制約を適用する組織のポリシー ファイルの設定方法を示します。この組織のポリシーでは、すべてのシリアルポートがリソースにアクセスできるように指定しますが、条件を使用して、一致するタグを持つリソースのみにシリアルポートへのアクセスを制限します。
Console
組織のポリシーを設定する手順は次のとおりです。
Cloud コンソールで [組織のポリシー] ページを開きます。
ページの上部にあるプロジェクト選択ツールを選択します。
プロジェクト選択ツールから、組織のポリシーを設定するプロジェクトを選択します。
[組織のポリシー] ページのリストから制約を選択します。 その制約の [ポリシーの詳細] ページが表示されます。
このリソース用に組織ポリシーをカスタマイズするには、[編集] をクリックします。
[編集] ページで、[カスタマイズ] を選択します。
[ルールを追加] をクリックします。
[適用] で、この組織のポリシーの適用を有効にするかどうかを選択します。
タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、無条件のルールを 1 つだけ追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。
[タイトル] フィールドに、条件の名前を入力します。
[説明] フィールドに、条件の説明を入力します。この説明では、必須タグとそれらがリソースに及ぼす影響について説明します。
条件作成ツールを使用して、制約を有効にするために特定のタグを必要とする条件を作成できます。
[条件タイプ] プルダウン メニューから [タグ] を選択します。
条件の [演算子] を選択します。タグ全体と一致するには、matches 演算子を使用します。タグキーとタグ値を照合するには、matches ID 演算子を使用します。
matches 演算子を選択した場合は、タグの名前空間名の値を入力します。matches ID 演算子を選択した場合は、キーと値の ID を入力します。
[追加] をクリックすると、複数の条件を作成できます。別の条件を追加する場合は、AND を切り替えることで、すべての条件を要求するように条件付きロジックを設定できます。OR を切り替えることで、条件の 1 つのみが true になるように条件付きロジックを設定できます。
条件フィールドの右側にある大きな [X] をクリックすると、式を削除できます。
条件の編集が完了したら、[保存] をクリックします。
条件が適用される組織ポリシーには、無条件のルールが 1 つだけ必要です。[ルールを追加] をクリックし、この組織のポリシーの適用をデフォルトで有効または無効にするかどうかを設定します。
次の図には、条件を含む組織のポリシーの構成例を示しています。
[条件エディタ] を使用して、プログラムで条件式を作成できます。また、現在の条件のセットがプログラムによってレンダリングされます。
- 条件エディタを使用して
!
論理演算子を適用できます。たとえば、!resource.matchTag('ORGANIZATION_ID/location', 'us-west1')
というクエリでは、us-west1
タグがないリソースに組織のポリシーの制約が適用されます。
- 条件エディタを使用して
組織ポリシーを完成させて適用するには、[保存] をクリックします。
gcloud
組織のポリシーを設定するには、次のコマンドを実行します。
gcloud org-policies set-policy POLICY_PATH
ここで、POLICY_PATH
は、組織のポリシー JSON ファイルへのフルパスです。出力は次のようになります。
{ "name": "RESOURCE_TYPE/RESOURCE_ID/policies/gcp.disableSerialPortAccess", "spec": { "rules": [ { "condition": { "expression": "resource.matchTag(\"ORGANIZATION_ID/disableSerialAccess\", \"yes\")" }, "enforce": true }, { "enforce": false } ] } }
ここで
RESOURCE_TYPE は
organizations
、folders
またはprojects
です。RESOURCE_ID は、組織 ID、フォルダ ID、プロジェクト ID、またはプロジェクト番号です。
ORGANIZATION_ID
はタグキーの親組織です。
上述の組織ポリシーでは、リソースとそのすべての子リソースには gcp.disableSerialPortAccess
制約が適用されます。タグ disableSerialAccess: yes
のあるリソースは、組織のポリシーで拒否されます。タグ disableSerialAccess: yes
がないリソースには、その制約は適用されません。
組織のポリシーに条件付きで制約を追加する
タグを使用すると、接続されたタグに基づいて、組織のポリシーの制約をリソースに条件付きで追加できます。同じ組織のポリシー内に複数の条件を追加できます。これにより、組織のポリシーを適用するリソースを詳細に制御できます。
Common Expression Language(CEL)は、条件式を指定するために使用する式言語です。条件式は、論理演算子(&&
、||
、!
)を使用して結合された 1 つ以上のステートメントで構成されます。詳細については、CEL 仕様とその言語の定義をご覧ください。
リソースに適用されるタグに基づいて、リソースを作成できるロケーションを制限する組織のポリシーについて考えてみます。これを行うには、gcp.resourceLocations
制約を適用する組織のポリシーを作成し、条件を使用して特定のリソースのみに適用されるように制限します。
まず、組織のポリシーを含む一時ファイル /tmp/policy.yaml
を作成します。
name: organizations/ORGANIZATION_ID/policies/gcp.resourceLocations spec: rules: - condition: expression: "resource.matchTag('ORGANIZATION_ID/location', 'us-east')" values: allowedValues: - in:us-east1-locations - condition: expression: "resource.matchTag('ORGANIZATION_ID/location', 'us-west')" values: allowedValues: - in:us-west1-locations - values: deniedValues: - in:asia-south1-locations
ORGANIZATION_ID
はタグキーの親組織です。
上の例では、location: us-east
タグが付いているリソースは、us-east1-locations
値グループ内の場所に制限されます。location: us-west
タグが付いているリソースは、us-west1-locations
値グループ内の場所に制限されます。組織内のすべてのリソースは、asia-south1-locations
値グループ内の場所からブロックされます。
次に、set-policy
コマンドを使用してポリシーを設定します。
gcloud org-policies set-policy /tmp/policy.yaml
タグ付けされていないリソースの制限
タグと条件付き組織ポリシーを使用すると、特定のタグを使用していないリソースを制限できます。サービスを制限するリソースに組織のポリシーを設定し、タグの存在を条件付きにすると、そのリソースから派生した子リソースは、タグ付けされていない限り使用できません。このように、ガバナンス計画に従って使用前にリソースを設定する必要があります。
タグ付けされていない組織、フォルダ、プロジェクト リソースを制限するには、組織のポリシーを作成するときに条件付きクエリで !
論理演算子を使用します。
たとえば、sqladmin=enabled
タグを持つプロジェクトでのみ sqladmin.googleapis.com
の使用を許可するには、sqladmin=enabled
タグがないプロジェクトで sqladmin.googleapis.com
を拒否する組織ポリシーを作成します。
リソースに適切なガバナンスが適用されているかどうかを識別するタグを作成します。たとえば、キー
sqlAdmin
と値enabled
のタグを作成して、このリソースで Cloud SQL Admin API の使用を許可するように指定できます。次に例を示します。新しく作成したタグの名前をクリックします。次のステップでは、[タグキーのパス] に一覧表示されているタグキーの名前空間名が必要です。
組織リソースのレベルで Restrict Resource Service Usage(リソース サービスの使用を制限する)組織ポリシーを作成し、Cloud SQL Admin API へのアクセスを拒否します。次に例を示します。
上記の組織のポリシーに条件を追加し、ガバナンス タグが存在しない場合に、ポリシーが適用されることを指定します。論理 NOT 演算子は条件ビルダーでサポートされていないため、この条件は条件エディタで構築する必要があります。次に例を示します。
!resource.matchTag("012345678901/sqlAdmin", "enabled")
これで、デベロッパーがそのプロジェクトで Cloud SQL Admin API を使用するには、sqlAdmin=enabled
タグをプロジェクトに接続するか、プロジェクトに継承する必要があります。
組織のポリシーの継承
タグを使用して有効になっている組織のポリシーのリスト型制約は、継承の通常のルールに従って、既存の組織のポリシーと結合されます。これらの条件付きルールは、条件が true の場合にのみ適用されます。
タグを使用して有効になっている組織のポリシーのブール型制約は、既存の組織のポリシーをオーバーライドします。また、ブール型ポリシーに設定できるのは true または false の 2 つの状態のみであるため、複数のタグが互いに競合しないようにするには、すべての条件ステートメントを条件付きではないステートメントの反対にする必要があります。
たとえば、disableSerialPortAccess
制約を適用する組織のポリシーについて考えてみます。無条件の値は、条件によってオーバーライドされない場合に使用する値であり、true です。したがって、このポリシーの他の条件ステートメントは、競合しないように false に設定する必要があります。
次のステップ
タグの使用方法の詳細については、タグの作成と管理ページをご覧ください。
組織のポリシー制約の作成と管理の方法の詳細については、制約の使用をご覧ください。