このページは AI の支援を受けて英語から翻訳されています。内容が異なる場合は英語版が正となります。
AWS_POLICY_EQUAL
2 つの AWS IAM ポリシーの JSON 文字列(または AWS タグ配列)を比較し、AWS のポリシー評価ルールに従って意味的に等価であれば true を、そうでなければ false を返します。
関連項目:
[SELECT] [DESCRIBE] [JSON_EQUAL] [JSON_EXTRACT] [ データ型 ]
aws_policy_equal 関数は、StackQL 独自の拡張関数です。AWS のポリシー評価ルールに従って AWS IAM ポリシーを比較し、特定の要素(Action、Resource、Principal、Tags など)を順序のない集合として扱います。両方の引数がトップレベルの JSON 配列(たとえば AWS タグ配列そのもの)の場合も、順序のない集合として比較されます。aws_policy_equal 関数は StackQL バージョン 0.8.175 以降で利用でき、StackQL のデフォルトである組み込みのインメモリ SQL バックエンドでのみサポートされています。
構文
SELECT AWS_POLICY_EQUAL(policy1, policy2);
引数
policy1
AWS IAM ポリシードキュメントを表す JSON 文字列、または AWS タグの JSON 配列。
policy2
最初の引数と比較する、AWS IAM ポリシードキュメントまたはタグ配列を表すもう 1 つの JSON 文字列。
両方の引数が有効な JSON である必要があります。ポリシードキュメントを比較する場合は、両方が有効な AWS IAM ポリシーの JSON である必要があります。
戻り値
整数値です。ドキュメントが意味的に等価であれば 1、等価でなければ 0 になります。
例
AWS IAM ポリシーを比較する
SELECT
AssumeRolePolicyDocument as current_policy,
'{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}' as desired_policy,
AWS_POLICY_EQUAL(AssumeRolePolicyDocument, '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}') as compliant
FROM aws.iam.roles
WHERE RoleName = 'my-lambda-role';
/* returns...
|------------------------------------------------------------------|------------------------------------------------------------------|-----------|
| current_policy | desired_policy | compliant |
|------------------------------------------------------------------|------------------------------------------------------------------|-----------|
| {"Version":"2012-10-17","Statement":[{"Effect":"Allow", | {"Version":"2012-10-17","Statement":[{"Effect":"Allow", | 1 |
| "Principal":{"Service":"lambda.amazonaws.com"}, | "Principal":{"Service":"lambda.amazonaws.com"}, | |
| "Action":"sts:AssumeRole"}]} | "Action":"sts:AssumeRole"}]} | |
|------------------------------------------------------------------|------------------------------------------------------------------|-----------|
*/
要素の順序が異なるポリシーを比較する
SELECT
aws_policy_equal(
'{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:GetObject","s3:PutObject"],"Resource":"*"}]}',
'{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:PutObject","s3:GetObject"],"Resource":"*"}]}'
) as unordered_action_equal,
aws_policy_equal(
'{"Version":"2012-10-17","Statement":[{"Condition":{"StringEquals":{"sts:ExternalId":"0000"}},"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/role1"}}]}',
'{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/role1"},"Action":"sts:AssumeRole","Condition":{"StringEquals":{"sts:ExternalId":"0000"}}}]}'
) as reordered_elements_equal
;
/* returns...
|------------------------|--------------------------|
| unordered_action_equal | reordered_elements_equal |
|------------------------|--------------------------|
| 1 | 1 |
|------------------------|--------------------------|
*/
異なるポリシー形式を比較する(配列と文字列)
SELECT
aws_policy_equal(
'{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:GetObject"],"Resource":"*"}]}',
'{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"*"}]}'
) as array_string_equal
;
/* returns...
|--------------------|
| array_string_equal |
|--------------------|
| 1 |
|--------------------|
*/
AWS タグ配列を比較する
AWS は、API が返すタグの順序を保証しません。要素の順序に関係なくタグ配列を比較するには、aws_policy_equal を使用します。
SELECT
aws_policy_equal(
tags,
'[{"Key":"stackql:stack-name","Value":"stackql-serverless"},{"Key":"stackql:stack-env","Value":"dev"},{"Key":"stackql:resource-name","Value":"aws_s3_workspace_bucket"}]'
) as tags_match
FROM aws.s3.buckets
WHERE region = 'us-east-1'
AND name = 'my-workspace-bucket';
/* returns...
|------------|
| tags_match |
|------------|
| 1 |
|------------|
-- Returns 1 regardless of the order AWS returns the tags array
*/
リソースオブジェクト内にネストされたリソースタグを比較する
タグが Tags フィールドとしてリソースオブジェクト内に含まれている場合も、aws_policy_equal はタグ配列を順序のない集合として扱います。
SELECT
aws_policy_equal(
'{"BucketName":"my-bucket","Tags":[{"Key":"env","Value":"prod"},{"Key":"team","Value":"platform"}]}',
'{"BucketName":"my-bucket","Tags":[{"Key":"team","Value":"platform"},{"Key":"env","Value":"prod"}]}'
) as nested_tags_equal
;
/* returns...
|--------------------|
| nested_tags_equal |
|--------------------|
| 1 |
|--------------------|
*/
詳細については、aws_policy_equal を参照してください。