Lógica AND/OR - Amazon Simple Notification Service

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Lógica AND/OR

Puede utilizar operaciones que incluyan la lógica AND/OR para que coincidan con los atributos de mensaje o las propiedades de cuerpo de mensaje.

Lógica AND

Puede aplicar la lógica AND utilizando varios nombres de propiedad.

Considere la siguiente política:

{ "customer_interests": ["rugby"], "price_usd": [{"numeric": [">", 100]}] }

Coincide con cualquier atributo de mensaje o propiedad de cuerpo de mensaje con el valor de customer_interests establecido en rugby y el valor de price_usd establecido en un número mayor de 100.

nota

No puede aplicar la lógica AND a los valores del mismo atributo.

Lógica OR

Puede aplicar la lógica OR asignando varios valores a un nombre de propiedad.

Considere la siguiente política:

{ "customer_interests": ["rugby", "football", "baseball"] }

Coincide con cualquier atributo de mensaje o propiedad de cuerpo de mensaje con el valor de customer_interests establecido en rugby, football o baseball.

Operador OR

Puede utilizar el operador "$or" para definir de forma explícita una política de filtrado que exprese la relación OR entre varios atributos de la política.

Amazon SNS solo reconoce una relación "$or" cuando la política ha cumplido todas las condiciones siguientes. Cuando no se cumplen todas estas condiciones, "$or" se trata como un nombre de atributo normal, igual que cualquier otra cadena de la política.

  • Hay un atributo de campo "$or" en la regla seguido de una matriz, por ejemplo “$or” : [].

  • Hay al menos 2 objetos en la matriz de "$or": "$or": [{}, {}].

  • Ninguno de los objetos de la matriz de "$or" tiene nombres de campo que sean palabras clave reservadas.

De lo contrario, "$or" se trata como un nombre de atributo normal, igual que otras cadenas de la política.

La siguiente política no se analiza como una relación OR porque el número y el prefijo son palabras clave reservadas.

{ "$or": [ {"numeric" : 123}, {"prefix": "abc"} ] }

Ejemplos de operadores OR

OR estándar:

{ "source": [ "aws.cloudwatch" ], "$or": [ { "metricName": [ "CPUUtilization" ] }, { "namespace": [ "AWS/EC2" ] } ] }

La lógica de filtrado de esta política es:

"source" && ("metricName" || "namespace")

Coincide con cualquiera de los siguientes conjuntos de atributos de mensaje:

"source": {"Type": "String", "Value": "aws.cloudwatch"}, "metricName": {"Type": "String", "Value": "CPUUtilization"}

o

"source": {"Type": "String", "Value": "aws.cloudwatch"}, "namespace": {"Type": "String", "Value": "AWS/EC2"}

También coincide con los siguientes cuerpos de mensaje:

{ "source": "aws.cloudwatch", "metricName": "CPUUtilization" }

o

{ "source": "aws.cloudwatch", "namespace": "AWS/EC2" }

Restricciones de políticas que incluyen relaciones OR

Considere la siguiente política:

{ "source": [ "aws.cloudwatch" ], "$or": [ { "metricName": [ "CPUUtilization", "ReadLatency" ] }, { "metricType": [ "MetricType" ] , "$or" : [ { "metricId": [ 1234, 4321 ] }, { "spaceId": [ 1000, 2000, 3000 ] } ] } ] }

La lógica de esta política también se puede simplificar de la siguiente manera:

("source" AND "metricName") OR ("source" AND "metricType" AND "metricId") OR ("source" AND "metricType" AND "spaceId")

El cálculo de la complejidad de las políticas con relaciones OR se puede simplificar como la suma de las complejidades combinadas de cada declaración OR.

La combinación total se calcula del siguiente modo:

(source * metricName) + (source * metricType * metricId) + (source * metricType * spaceId) = (1 * 2) + (1 * 1 * 2) + (1 * 1 * 3) = 7

source tiene un valor, metricName tiene dos valores, metricType tiene un valor, metricId tiene dos valores y spaceId tiene tres valores.

Tenga en cuenta la siguiente política de filtrado anidado:

{ "$or": [ { "metricName": [ "CPUUtilization", "ReadLatency" ] }, { "namespace": [ "AWS/EC2", "AWS/ES" ] } ], "detail" : { "scope" : [ "Service" ], "$or": [ { "source": [ "aws.cloudwatch" ] }, { "type": [ "CloudWatch Alarm State Change"] } ] } }

La lógica de esta política se puede simplificar de la siguiente manera:

("metricName" AND ("detail"."scope" AND "detail"."source") OR ("metricName" AND ("detail"."scope" AND "detail"."type") OR ("namespace" AND ("detail"."scope" AND "detail"."source") OR ("namespace" AND ("detail"."scope" AND "detail"."type")

El cálculo para las combinaciones totales es el mismo para las políticas no anidadas, excepto que debemos tener en cuenta el nivel de anidación de una clave.

La combinación total se calcula del siguiente modo:

(2 * 2 * 2) + (2 * 2 * 2) + (2 * 2 * 2) + (2 * 2 * 2) = 32

metricName tiene dos valores, namespace tiene dos valores, scope es una clave anidada de dos niveles con un valor, source es una clave anidada de dos niveles con un valor y type es una clave anidada de dos niveles con un valor.