Cette page a été traduite de l'anglais avec l'aide de l'IA. En cas de divergence, la version anglaise fait référence.
AWS_POLICY_EQUAL
Compare deux chaînes de caractères JSON de politique AWS IAM (ou deux tableaux de tags AWS) et renvoie true si elles sont sémantiquement équivalentes selon les règles d'évaluation des politiques AWS, false sinon.
Voir aussi :
[SELECT] [DESCRIBE] [JSON_EQUAL] [JSON_EXTRACT] [ Types de données ]
La fonction aws_policy_equal est une fonction d'extension personnalisée de StackQL. Elle compare les politiques AWS IAM selon les règles d'évaluation des politiques AWS, où certains éléments (comme Action, Resource, Principal et Tags) sont traités comme des ensembles non ordonnés. Lorsque les deux arguments sont des tableaux JSON de premier niveau (par exemple un tableau brut de tags AWS), ils sont également comparés comme des ensembles non ordonnés. La fonction aws_policy_equal est disponible dans les versions 0.8.175 et ultérieures de StackQL et n'est prise en charge qu'avec le backend SQL par défaut de StackQL, embarqué et en mémoire.
Syntaxe
SELECT AWS_POLICY_EQUAL(policy1, policy2);
Arguments
policy1
Une chaîne JSON représentant un document de politique AWS IAM, ou un tableau JSON de tags AWS.
policy2
Une autre chaîne JSON représentant un document de politique AWS IAM ou un tableau de tags, à comparer à la première.
Les deux arguments doivent être du JSON valide. Lors de la comparaison de documents de politique, les deux doivent être du JSON de politique AWS IAM valide.
Valeur(s) renvoyée(s)
Une valeur entière : 1 si les documents sont sémantiquement équivalents, 0 sinon.
Exemples
Comparer des politiques 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"}]} | |
|------------------------------------------------------------------|------------------------------------------------------------------|-----------|
*/
Comparer des politiques dont les éléments sont dans un ordre différent
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 |
|------------------------|--------------------------|
*/
Comparer des formats de politique différents (tableau ou chaîne)
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 |
|--------------------|
*/
Comparer des tableaux de tags AWS
AWS ne garantit pas l'ordre des tags renvoyés par ses API. Utilisez aws_policy_equal pour comparer des tableaux de tags sans tenir compte de l'ordre des éléments.
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
*/
Comparer des tags de ressource imbriqués dans un objet de ressource
Lorsque les tags sont imbriqués dans un objet de ressource sous la forme d'un champ Tags, aws_policy_equal traite toujours le tableau de tags comme un ensemble non ordonné.
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 |
|--------------------|
*/
Pour plus d'informations, consultez aws_policy_equal.