

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.

# Aplicación de una política de filtrado de suscripciones en Amazon SNS
<a name="message-filtering-apply"></a>

El filtrado de mensajes en Amazon SNS le permite entregar mensajes a los suscriptores de forma selectiva en función de las políticas de filtrado. Estas políticas definen las condiciones que deben cumplir los mensajes para poder entregarse a una suscripción. Si bien la entrega de mensajes sin procesar es una opción que puede afectar al procesamiento de los mensajes, no es necesaria para que los filtros de suscripción funcionen.

Puede aplicar una política de filtro a una suscripción de Amazon SNS mediante la consola de Amazon SNS. O bien, para aplicar las políticas mediante programación, puede utilizar la API de Amazon SNS, AWS Command Line Interface el AWS CLI() o AWS cualquier SDK compatible con Amazon SNS. También puede usar. AWS CloudFormation

**Habilitación de la entrega de mensajes sin procesar**

La entrega de mensajes sin procesar garantiza que las cargas útiles de los mensajes se entreguen tal cual a los suscriptores, sin necesidad de codificación ni transformación adicionales. Esto puede resultar útil cuando los suscriptores necesitan el formato de mensaje original para su procesamiento. Sin embargo, la entrega de mensajes sin procesar no está directamente relacionada con la funcionalidad de los filtros de suscripción.

**Aplicación de filtros de suscripciones**

Para aplicar filtros de mensajes a una suscripción, debe definir una política de filtrado mediante la sintaxis JSON. Esta política especifica las condiciones que debe cumplir un mensaje para entregarse a la suscripción. Los filtros se pueden basar en atributos del mensaje, como los atributos del mensaje, la estructura del mensaje o incluso el contenido del mensaje.

**Relación entre la entrega de mensajes sin procesar y los filtros de suscripción**

Aunque habilitar la entrega de mensajes sin procesar puede afectar a la forma en que los suscriptores entregan y procesan los mensajes, no es un requisito previo para usar filtros de suscripción. Sin embargo, en situaciones en las que los suscriptores requieren el formato de mensaje original sin ninguna modificación, habilitar la entrega de mensajes sin procesar podría resultar beneficioso junto con los filtros de suscripción.

**Consideraciones para un filtrado eficaz**

Al implementar el filtrado de mensajes, tenga en cuenta los requisitos específicos de su aplicación y de sus suscriptores. Defina políticas de filtrado que coincidan con precisión con los criterios de entrega de mensajes para garantizar una distribución eficiente y específica de los mensajes.

**importante**  
AWS servicios como IAM y Amazon SNS utilizan un modelo de computación distribuida denominado consistencia eventual. Los añadidos o cambios a una política de filtro de suscripción pueden tardar hasta 15 minutos en tener efecto. 

## Consola de administración de AWS
<a name="message-filtering-apply-console"></a>

1. Inicie sesión en la [consola de Amazon SNS](https://console.aws.amazon.com/sns/home).

1. En el panel de navegación, seleccione **Subscriptions (Suscripciones)**.

1. Seleccione una suscripción y, a continuación, elija **Edit (Editar)**.

1. En la página **Edit** (Editar), amplíe la sección **Subscription filter policy** (Política de filtro de suscripción).

1. Elija entre el **filtrado basado en atributos** o el **filtrado basado en cargas**.

1. En el campo **JSON editor** (Editor JSON), proporcione el **cuerpo JSON** de su política de filtrado.

1. Seleccione **Save changes (Guardar cambios)**.

   Amazon SNS aplica la política de filtro a la suscripción.

## AWS CLI
<a name="message-filtering-apply-cli"></a>

Para aplicar una política de filtrado con AWS Command Line Interface (AWS CLI), utilice el [https://docs.aws.amazon.com/cli/latest/reference/sns/set-subscription-attributes.html](https://docs.aws.amazon.com/cli/latest/reference/sns/set-subscription-attributes.html)comando, como se muestra en el siguiente ejemplo. Para la opción `--attribute-name`, especifique `FilterPolicy`. Para `--attribute-value`, especifique la **política JSON**. 

```
$ aws sns set-subscription-attributes --subscription-arn {{arn:aws:sns: ...}} --attribute-name FilterPolicy --attribute-value {{'{"store":["example_corp"],"event":["order_placed"]}'}}
```

Para proporcionar un objeto JSON válido para su política, incluya los nombres de atributos y valores entre comillas dobles. Incluya también todo el argumento de la política entre comillas. Para evitar que las comillas se interpreten como caracteres de escape, puede utilizar comillas simples para delimitar la política y comillas dobles para delimitar los nombres y los valores JSON, tal y como se muestra en el ejemplo anterior.

Si quieres cambiar de un filtrado de mensajes basado en atributos (predeterminado) a uno basado en cargas útiles, también puedes usar el [set-subscription-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/set-subscription-attributes.html)comando. Para la opción `--attribute-name`, especifique `FilterPolicyScope`. En `--attribute-value`, especifique `MessageBody`. 

```
$ aws sns set-subscription-attributes --subscription-arn arn:aws:sns: ... --attribute-name FilterPolicyScope --attribute-value MessageBody
```

Para verificar que su política de filtro se ha aplicado, utilice el comando `get-subscription-attributes`. Los atributos del resultado deben mostrar la política de filtro para la clave `FilterPolicy`, tal y como se muestra en el ejemplo siguiente:

```
$ aws sns get-subscription-attributes --subscription-arn {{arn:aws:sns: ...}}
{
    "Attributes": {
        "Endpoint": "endpoint . . .", 
        "Protocol": "https",
        "RawMessageDelivery": "false", 
        "EffectiveDeliveryPolicy": "delivery policy . . .",
        "ConfirmationWasAuthenticated": "true", 
        "FilterPolicy": "{\"store\": [\"example_corp\"], \"event\": [\"order_placed\"]}", 
        "FilterPolicyScope": "MessageAttributes",
        "Owner": "111122223333", 
        "SubscriptionArn": "arn:aws:sns: . . .", 
        "TopicArn": "arn:aws:sns: . . ."
    }
}
```

## AWS SDKs
<a name="message-filtering-apply-sdks"></a>

Los siguientes ejemplos de código muestran cómo utilizar `SetSubscriptionAttributes`.

**importante**  
Si utiliza el ejemplo de SDK for Java 2.x, la clase `SNSMessageFilterPolicy` no está disponible para usar. Para obtener instrucciones sobre cómo instalar esta clase, consulta el [ejemplo](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/sns/src/main/java/com/example/sns/SNSMessageFilterPolicy.java) del sitio web. GitHub 

------
#### [ CLI ]

**AWS CLI**  
**Establecimiento de los atributos de suscripción**  
En el siguiente ejemplo de `set-subscription-attributes`, se establece el atributo `RawMessageDelivery` en una suscripción de SQS.  

```
aws sns set-subscription-attributes \
    --subscription-arn {{arn:aws:sns:us-east-1:123456789012:mytopic:f248de18-2cf6-578c-8592-b6f1eaa877dc}} \
    --attribute-name {{RawMessageDelivery}} \
    --attribute-value {{true}}
```
Este comando no genera ninguna salida.  
En el siguiente ejemplo de `set-subscription-attributes`, se establece un atributo `FilterPolicy` en una suscripción de SQS.  

```
aws sns set-subscription-attributes \
    --subscription-arn {{arn:aws:sns:us-east-1:123456789012:mytopic:f248de18-2cf6-578c-8592-b6f1eaa877dc}} \
    --attribute-name {{FilterPolicy}} \
    --attribute-value "{ \"anyMandatoryKey\": [\"any\", \"of\", \"these\"] }"
```
Este comando no genera ninguna salida.  
En el siguiente ejemplo de `set-subscription-attributes`, se elimina el atributo `FilterPolicy` de una suscripción de SQS.  

```
aws sns set-subscription-attributes \
    --subscription-arn {{arn:aws:sns:us-east-1:123456789012:mytopic:f248de18-2cf6-578c-8592-b6f1eaa877dc}} \
    --attribute-name {{FilterPolicy}} \
    --attribute-value {{"{}"}}
```
Este comando no genera ninguna salida.  
+  Para obtener más información sobre la API, consulte [SetSubscriptionAttributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/set-subscription-attributes.html)la *Referencia de AWS CLI comandos*. 

------
#### [ Java ]

**SDK para Java 2.x**  
 Hay más información al respecto GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el [Repositorio de ejemplos de código de AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples). 

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SnsException;
import java.util.ArrayList;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class UseMessageFilterPolicy {
    public static void main(String[] args) {
        final String usage = """

                Usage:    <subscriptionArn>

                Where:
                   subscriptionArn - The ARN of a subscription.

                """;

        if (args.length != 1) {
            System.out.println(usage);
            System.exit(1);
        }

        String subscriptionArn = args[0];
        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        usePolicy(snsClient, subscriptionArn);
        snsClient.close();
    }

    public static void usePolicy(SnsClient snsClient, String subscriptionArn) {
        try {
            SNSMessageFilterPolicy fp = new SNSMessageFilterPolicy();
            // Add a filter policy attribute with a single value
            fp.addAttribute("store", "example_corp");
            fp.addAttribute("event", "order_placed");

            // Add a prefix attribute
            fp.addAttributePrefix("customer_interests", "bas");

            // Add an anything-but attribute
            fp.addAttributeAnythingBut("customer_interests", "baseball");

            // Add a filter policy attribute with a list of values
            ArrayList<String> attributeValues = new ArrayList<>();
            attributeValues.add("rugby");
            attributeValues.add("soccer");
            attributeValues.add("hockey");
            fp.addAttribute("customer_interests", attributeValues);

            // Add a numeric attribute
            fp.addAttribute("price_usd", "=", 0);

            // Add a numeric attribute with a range
            fp.addAttributeRange("price_usd", ">", 0, "<=", 100);

            // Apply the filter policy attributes to an Amazon SNS subscription
            fp.apply(snsClient, subscriptionArn);

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  Para obtener más información sobre la API, consulta [SetSubscriptionAttributes](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/SetSubscriptionAttributes)la *Referencia AWS SDK for Java 2.x de la API*. 

------
#### [ Python ]

**SDK para Python (Boto3)**  
 Hay más información al respecto GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el [Repositorio de ejemplos de código de AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sns#code-examples). 

```
class SnsWrapper:
    """Encapsulates Amazon SNS topic and subscription functions."""

    def __init__(self, sns_resource):
        """
        :param sns_resource: A Boto3 Amazon SNS resource.
        """
        self.sns_resource = sns_resource


    @staticmethod
    def add_subscription_filter(subscription, attributes):
        """
        Adds a filter policy to a subscription. A filter policy is a key and a
        list of values that are allowed. When a message is published, it must have an
        attribute that passes the filter or it will not be sent to the subscription.

        :param subscription: The subscription the filter policy is attached to.
        :param attributes: A dictionary of key-value pairs that define the filter.
        """
        try:
            att_policy = {key: [value] for key, value in attributes.items()}
            subscription.set_attributes(
                AttributeName="FilterPolicy", AttributeValue=json.dumps(att_policy)
            )
            logger.info("Added filter to subscription %s.", subscription.arn)
        except ClientError:
            logger.exception(
                "Couldn't add filter to subscription %s.", subscription.arn
            )
            raise
```
+  Para obtener más información sobre la API, consulta [SetSubscriptionAttributes](https://docs.aws.amazon.com/goto/boto3/sns-2010-03-31/SetSubscriptionAttributes)la *AWS Referencia de API de SDK for Python (Boto3*). 

------
#### [ SAP ABAP ]

**SDK para SAP ABAP**  
 Hay más información al respecto. GitHub Busque el ejemplo completo y aprenda a configurar y ejecutar en el [Repositorio de ejemplos de código de AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples). 

```
    TRY.
        lo_sns->setsubscriptionattributes(
            iv_subscriptionarn = iv_subscription_arn
            iv_attributename  = 'FilterPolicy'
            iv_attributevalue = iv_filter_policy ).
        MESSAGE 'Added filter policy to subscription.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Subscription does not exist.' TYPE 'E'.
    ENDTRY.
```
+  Para obtener más información sobre la API, consulte [SetSubscriptionAttributes](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)la *referencia sobre la API ABAP del AWS SDK para SAP*. 

------

## API de Amazon SNS
<a name="message-filtering-apply-api"></a>

Para aplicar una política de filtro con la API de Amazon SNS, realice una solicitud a la acción [https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html). Establezca el parámetro `AttributeName` en `FilterPolicy` y el parámetro `AttributeValue` en el objeto JSON de la política de filtro.

Si quiere cambiar de filtrado de mensajes basado en atributos (predeterminado) a filtrado de mensajes basado en cargas, puede usar también la acción [https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html). Establezca el parámetro `AttributeName` en `FilterPolicyScope` y el parámetro `AttributeValue` en `MessageBody`.

## AWS CloudFormation
<a name="message-filtering-apply-cloudformation"></a>

Para aplicar una política de filtrado CloudFormation, utilice una plantilla JSON o YAML para crear una CloudFormation pila. Para obtener más información, consulta la [`FilterPolicy`propiedad](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-filterpolicy) del `AWS::SNS::Subscription` recurso en la *Guía del AWS CloudFormation usuario* y en la [CloudFormation plantilla de ejemplo](https://github.com/aws-samples/aws-sns-samples/blob/master/templates/SNS-Subscription-Attributes-Tutorial-CloudFormation.template).

1. Inicie sesión en la [consola de CloudFormation](https://console.aws.amazon.com/cloudformation).

1. Elija **Crear pila**.

1. En la página **Select Template (Seleccionar plantilla)**, elija **Upload a template to Amazon S3 (Cargar una plantilla en Amazon S3)**, elija el archivo y, a continuación, elija **Next (Siguiente)**.

1. En la página **Specify Details (Especificar detalles)**, haga lo siguiente:

   1. Para **Stack Name (Nombre de la pila)**, escriba `MyFilterPolicyStack`.

   1. Para **myHttpEndpoint**, escriba el punto final HTTP al que se va a suscribir al tema.
**sugerencia**  
Si no dispone de un punto de enlace HTTP, cree uno.

1. En la página **Opciones**, seleccione **Siguiente**.

1. En la página **Review (Revisar)**, elija **Create (Crear)**.