

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Anwenden einer Abonnementfilterrichtlinie in Amazon SNS
<a name="message-filtering-apply"></a>

Die Nachrichtenfilterung in Amazon SNS ermöglicht es Ihnen, Nachrichten anhand von Filterrichtlinien selektiv an Abonnenten zu senden. Diese Richtlinien definieren Bedingungen, die Nachrichten erfüllen müssen, um im Rahmen eines Abonnements zugestellt zu werden. Die Zustellung von Rohnachrichten ist zwar eine Option, die sich auf die Nachrichtenverarbeitung auswirken kann, sie ist jedoch nicht erforderlich, damit Abonnementfilter funktionieren.

Sie können eine Filterrichtlinie unter Verwendung der Amazon SNS-Konsole auf ein Amazon SNS-Abonnement anwenden. Um Richtlinien programmgesteuert anzuwenden, können Sie auch die Amazon SNS-API, das AWS Command Line Interface (AWS CLI) oder ein beliebiges AWS SDK verwenden, das Amazon SNS unterstützt. Sie können auch verwenden. AWS CloudFormation

**Die Zustellung von Rohnachrichten aktivieren**

Die Zustellung von Rohnachrichten stellt sicher, dass Nachrichtennutzdaten den Abonnenten unverändert und ohne zusätzliche Kodierung oder Transformation zugestellt werden. Dies kann nützlich sein, wenn Abonnenten das ursprüngliche Nachrichtenformat für die Verarbeitung benötigen. Die Zustellung von Rohnachrichten steht jedoch nicht in direktem Zusammenhang mit der Funktionalität von Abonnementfiltern.

**Abonnementfilter anwenden**

Um Nachrichtenfilter auf ein Abonnement anzuwenden, definieren Sie eine Filterrichtlinie mithilfe der JSON-Syntax. Diese Richtlinie legt die Bedingungen fest, die eine Nachricht erfüllen muss, um im Abonnement zugestellt zu werden. Filter können auf Nachrichtenattributen wie Nachrichtenattributen, Nachrichtenstruktur oder sogar Nachrichteninhalten basieren.

**Beziehung zwischen Rohnachrichtenzustellung und Abonnementfiltern**

Die Aktivierung der Zustellung von Rohnachrichten kann sich zwar darauf auswirken, wie Nachrichten von Abonnenten zugestellt und verarbeitet werden, ist jedoch keine Voraussetzung für die Verwendung von Abonnementfiltern. In Szenarien, in denen Abonnenten das ursprüngliche Nachrichtenformat ohne Änderungen benötigen, kann die Aktivierung der Rohnachrichtenzustellung jedoch zusammen mit Abonnementfiltern von Vorteil sein.

**Überlegungen zur effektiven Filterung**

Berücksichtigen Sie bei der Implementierung der Nachrichtenfilterung die spezifischen Anforderungen Ihrer Anwendung und Ihrer Abonnenten. Definieren Sie Filterrichtlinien, die den Kriterien für die Nachrichtenzustellung genau entsprechen, um eine effiziente und gezielte Nachrichtenverteilung zu gewährleisten.

**Wichtig**  
AWS Dienste wie IAM und Amazon SNS verwenden ein verteiltes Rechenmodell, das als Eventual Consistency bezeichnet wird. Hinzufügungen oder Änderungen einer Abonnementfilterrichtlinie dauern bis zu 15 Minuten, bis sie vollständig wirksam werden. 

## AWS-Managementkonsole
<a name="message-filtering-apply-console"></a>

1. Melden Sie sich bei der [Amazon SNS-Konsole](https://console.aws.amazon.com/sns/home) an.

1. Wählen Sie im Navigationsbereich **Subscriptions** (Abonnements) aus.

1. Wählen Sie ein Abonnement und dann **Edit** (Bearbeiten) aus.

1. Erweitern Sie auf der Seite **Edit** (Bearbeiten) den Abschnitt **Subscription filter policy** (Abonnementfilterrichtlinie).

1. Wählen Sie zwischen **attributbasierter Filterung** oder **nutzlastbasierter Filterung** aus.

1. Geben Sie im Feld **JSON editor** (JSON-Editor) den **JSON-Text** Ihrer Filterrichtlinie an.

1. Wählen Sie **Änderungen speichern ** aus.

   Amazon SNS wendet Ihre Filterrichtlinie auf das Abonnement an.

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

Um eine Filterrichtlinie mit dem AWS Command Line Interface (AWS CLI) anzuwenden, verwenden Sie den [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)Befehl, wie im folgenden Beispiel gezeigt. Wählen Sie für die Option `--attribute-name` den Wert `FilterPolicy`. Geben Sie für `--attribute-value` Ihre **JSON-Richtlinie** an. 

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

Um gültiges JSON für Ihre Richtlinie anzugeben, schließen Sie die Attributnamen und Werte in doppelte Anführungszeichen ein. Sie müssen auch das gesamte Richtlinienargument in Anführungszeichen einschließen. Um das Maskieren von Anführungszeichen zu vermeiden, können Sie die Richtlinie in einfache Anführungszeichen und die JSON-Namen und -Werte in doppelte Anführungszeichen setzen, wie im folgenden Beispiel gezeigt.

Wenn Sie von der attributbasierten (Standard) zur nutzlastbasierten Nachrichtenfilterung wechseln möchten, können Sie den Befehl ebenfalls verwenden. [set-subscription-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/set-subscription-attributes.html) Wählen Sie für die Option `--attribute-name` den Wert `FilterPolicyScope`. Legen Sie für `--attribute-value` die Option `MessageBody` fest. 

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

Um sicherzustellen, dass Ihre Filterrichtlinie angewendet wurde, verwenden Sie den Befehl `get-subscription-attributes`. Die Attribute in der Terminal-Ausgabe sollten Ihre Filterrichtlinie für den `FilterPolicy`-Schlüssel zeigen, wie im folgenden Beispiel:

```
$ 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>

Die folgenden Code-Beispiele zeigen, wie `SetSubscriptionAttributes` verwendet wird.

**Wichtig**  
Wenn Sie das Beispiel SDK for Java 2.x verwenden, ist die Klasse `SNSMessageFilterPolicy` nicht sofort verfügbar. Anweisungen zur Installation dieser Klasse finden Sie im [Beispiel](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/sns/src/main/java/com/example/sns/SNSMessageFilterPolicy.java) auf der GitHub Website.

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

**AWS CLI**  
**So legen Sie Abonnementattribute fest**  
Im folgenden Beispiel für `set-subscription-attributes` wird das `RawMessageDelivery`-Attribut auf ein SQS-Abonnement festgelegt.  

```
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}}
```
Mit diesem Befehl wird keine Ausgabe zurückgegeben.  
Im folgenden Beispiel für `set-subscription-attributes` wird ein `FilterPolicy`-Attribut auf ein SQS-Abonnement festgelegt.  

```
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\"] }"
```
Mit diesem Befehl wird keine Ausgabe zurückgegeben.  
Im folgenden Beispiel für `set-subscription-attributes` wird das `FilterPolicy`-Attribut von einem SQS-Abonnement entfernt.  

```
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 {{"{}"}}
```
Mit diesem Befehl wird keine Ausgabe zurückgegeben.  
+  Einzelheiten zur API finden Sie [SetSubscriptionAttributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/set-subscription-attributes.html)in der *AWS CLI Befehlsreferenz*. 

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

**SDK für Java 2.x**  
 Es gibt noch mehr dazu GitHub. Hier finden Sie das vollständige Beispiel und erfahren, wie Sie das [AWS -Code-Beispiel-](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples) einrichten und ausführen. 

```
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);
        }
    }
}
```
+  Einzelheiten zur API finden Sie [SetSubscriptionAttributes](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/SetSubscriptionAttributes)in der *AWS SDK for Java 2.x API-Referenz*. 

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

**SDK für Python (Boto3)**  
 Es gibt noch mehr dazu GitHub. Hier finden Sie das vollständige Beispiel und erfahren, wie Sie das [AWS -Code-Beispiel-](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sns#code-examples) einrichten und ausführen. 

```
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
```
+  Einzelheiten zur API finden Sie [SetSubscriptionAttributes](https://docs.aws.amazon.com/goto/boto3/sns-2010-03-31/SetSubscriptionAttributes)in *AWS SDK for Python (Boto3) API* Reference. 

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

**SDK für SAP ABAP**  
 Es gibt noch mehr dazu. GitHub Hier finden Sie das vollständige Beispiel und erfahren, wie Sie das [AWS -Code-Beispiel-](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples) einrichten und ausführen. 

```
    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.
```
+  Einzelheiten zur API finden Sie [SetSubscriptionAttributes](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)in der *API-Referenz zum AWS SDK für SAP ABAP*. 

------

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

Um eine Filterrichtlinie mit der Amazon SNS API anzuwenden, stellen Sie eine Anfrage an die [https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html)-Aktion. Setzen Sie den Parameter `AttributeName` auf `FilterPolicy`, und den Parameter `AttributeValue` auf das JSON Ihrer Filterrichtlinie.

Wenn Sie von der attributbasierten (Standard) zur nutzlastbasierten Nachrichtenfilterung wechseln möchten, können Sie auch die Aktion [https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html) verwenden. Legen Sie den `AttributeName`-Parameter auf `FilterPolicyScope` und den `AttributeValue`-Parameter auf `MessageBody` fest.

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

Um eine Filterrichtlinie anzuwenden CloudFormation, verwenden Sie eine JSON- oder YAML-Vorlage, um einen CloudFormation Stack zu erstellen. Weitere Informationen finden Sie unter der [`FilterPolicy`Eigenschaft](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-filterpolicy) der `AWS::SNS::Subscription` Ressource im *AWS CloudFormation Benutzerhandbuch* und in der [CloudFormation Beispielvorlage](https://github.com/aws-samples/aws-sns-samples/blob/master/templates/SNS-Subscription-Attributes-Tutorial-CloudFormation.template).

1. Melden Sie sich bei der [CloudFormation -Konsole](https://console.aws.amazon.com/cloudformation) an.

1. Wählen Sie **Stack erstellen** aus.

1. Wählen Sie auf der Seite **Select Template (Vorlage auswählen)** die Option **Upload a template to Amazon S3 (Eine Vorlage zu Amazon S3 hochladen)** aus. Wählen Sie dann Ihre Datei und **Next (Weiter)** aus.

1. Führen Sie auf der Seite **Specify DB Details (Festlegen von DB-Detail)** die folgenden Schritte aus:

   1. Geben Sie für **Stack name (Stack-Name)** `MyFilterPolicyStack` ein.

   1. Geben Sie zum **myHttpEndpoint**Beispiel den HTTP-Endpunkt ein, um Ihr Thema zu abonnieren.
**Tipp**  
Wenn Sie nicht über einen HTTP-Endpunkt verfügen, erstellen Sie einen.

1. Wählen Sie auf der Seite **Optionen** **Weiter** aus.

1. Klicken Sie auf der Seite **Review** auf **Create**.