Warum kann ich ein Amazon-SNS-Thema nicht veröffentlichen oder abonnieren?

Letzte Aktualisierung: 04.11.2021

Ich kann kein Amazon-Simple-Notification-Service (Amazon SNS)-Thema veröffentlichen oder abonnieren. Wie kann dieses Problem behoben werden?

Kurzbeschreibung

Eine Ressource oder Identität von AWS Identity and Access Management (IAM) kann ohne die erforderlichen Berechtigungen kein Amazon-SNS-Thema veröffentlichen oder abonnieren.

Führen Sie basierend auf Ihrem Anwendungsfall einen der folgenden Schritte aus, um die IAM-Berechtigungen zu erteilen, die für die Veröffentlichung oder das Abonnieren eines Amazon-SNS-Themas erforderlich sind.

Hinweis: Amazon SNS verwendet IAM-identitätsbasierte und Amazon-SNS-ressourcenbasierte Zugriffsrichtlinien, um Zugriff auf SNS-Themen zu gewähren. Sie können eine IAM-Richtlinie verwenden, um den Benutzer- oder Rollenzugriff auf Amazon SNS-Aktionen und -Themen einzuschränken. Eine IAM-Richtlinie kann den Zugriff nur auf Benutzer in Ihrem AWS-Konto beschränken, nicht auf andere AWS-Konten. Weitere Informationen finden Sie in den Richtlinien von IAM und Amazon SNS zusammen.

Auflösung

So erteilen Sie einem anderen AWS-Service Berechtigungen für die Veröffentlichung in einem Amazon-SNS-Thema

Die ressourcenbasierte Richtlinie Ihres Amazon SNS-Themas muss es dem anderen AWS-Service ermöglichen, Nachrichten zum Thema zu veröffentlichen. Prüfen Sie die Zugriffsrichtlinien Ihres Themas, um sicherzustellen, dass es über die erforderlichen Berechtigungen verfügt, und fügen Sie sie bei Bedarf hinzu.

Um die erforderlichen Berechtigungen hinzuzufügen, bearbeiten Sie die Zugriffsrichtlinie Ihres Amazon SNS-Themas so, dass es die folgende Berechtigungserklärung enthält:

{
    "Sid": "Allow-AWS-Service-to-publish-to-the-topic",
    "Effect": "Allow",
    "Principal": {
        "Service": "service.amazonaws.com"
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName"
}

Wichtig: Mit diesen Berechtigungen kann jeder, der Zugriff auf den Amazon Resource Name (ARN) Ihres SNS-Themas hat, Nachrichten zum Thema über den Service-Endpunkt veröffentlichen. Sie können globale Bedingungsschlüssel hinzufügen, um die Veröffentlichungsberechtigungen auf bestimmte Ressourcen zu beschränken. Im folgenden Beispiel werden der arnLike-Bedingungsoperator und der globale Bedingungsschlüssel aws:SourceArn verwendet. Weitere Informationen finden Sie unter Beispielfälle für die Amazon SNS-Zugriffssteuerung.

Beispiel einer IAM-Richtlinie, die Amazon SNS-Veröffentlichungsberechtigungen auf bestimmte Ressourcen beschränkt

Wichtig: Ersetzen Sie <region> durch die AWS-Region der Ressource. Ersetzen Sie sie <account-id> durch Ihre Konto-ID. Ersetzen Sie <resource-name> durch den Namen der Ressource.

{
    "Sid": "Allow-AWS-Service-to-publish-to-the-topic",
    "Effect": "Allow",
    "Principal": {
        "Service": "service.amazonaws.com"  
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName",
    "Condition": {
        "ArnLike": {
            "aws:SourceArn": "arn:aws:<service>:<region>:<account-id>:<resource-type>:<resource-name>"
        }
    }
}

Wichtig: Amazon S3 unterstützt keine FIFO-SNS-Themen. Wenn die Themenrichtlinie einen S3-ARN enthält, stellen Sie sicher, dass es sich nicht um einen Pfad zu einem Bucket-Ordner handelt. Zum Beispiel: arn:aws:s3:*:*:mys3-bucket/*

So ermöglichen Sie einem IAM-Benutzer oder einer IAM-Rolle, ein Amazon-SNS-Thema zu abonnieren und zu veröffentlichen

Standardmäßig kann nur der Themenbesitzer ein Thema veröffentlichen oder abonnieren. Damit andere IAM-Entitäten Ihr Thema abonnieren und veröffentlichen können, muss die identitätsbasierte Richtlinie Ihres Themas die erforderlichen Berechtigungen erteilen.

Wichtig: Stellen Sie sicher, dass weder die Richtlinie der IAM-Entität noch die Zugriffsrichtlinie des SNS-Themas den Zugriff auf die SNS-Ressource explizit verweigern. Weitere Informationen finden Sie unter Der Unterschied zwischen expliziten und impliziten Ablehnung.

Wenn sich die IAM-Entität und das SNS-Thema in unterschiedlichen AWS-Konten befinden

Führen Sie beide der folgenden Schritte aus:

1.    Fügen Sie der IAM-Entität eine IAM-Richtlinienanweisung zu, die es der Entität ermöglicht, die Aktionen „sns:Subscribe“ und „sns:Publish“ auszuführen. Anweisungen finden Sie unter Hinzufügen und Entfernen von IAM-Identitätsberechtigungen.

Im Folgenden finden Sie ein Beispiel für eine IAM-Identitätsrichtlinie, die es einer IAM-Entität ermöglicht, ein SNS-Thema zu abonnieren und zu veröffentlichen:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish",
                "sns:Subscribe"
            ],
            "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName"
        }
    ]
}

2.    Fügen Sie der Zugriffsrichtlinie Ihres Themas eine SNS-Richtlinienanweisung hinzu, die es der IAM-Entität ermöglicht, die Aktionen „sns:Subscribe“ und „sns:Publish“ auszuführen. Anweisungen finden Sie unter Wie bearbeite ich die Zugriffsrichtlinie meines Amazon SNS-Themas?

Im Folgenden finden Sie ein Beispiel für eine Zugriffsrichtlinie für Amazon-SNS-Themen, die es einer IAM-Entität ermöglicht, ein SNS-Thema zu abonnieren und zu veröffentlichen:

{
    "Statement": [
        {
            "Sid": "Allow-SNS-Permission",
            "Effect": "Allow",
            "Principal": {
                "AWS": "111122223333"
            },
            "Action": [
                "sns:Publish",
                "sns:Subscribe"
            ],
            "Resource": "arn:aws:sns:your_region:123456789012:YourTopicName"
        }
    ]
}

Hinweis: Der Principal kann ein identitätsbasierter IAM-Benutzer oder eine Rolle oder eine AWS-Kontonummer sein. Weitere Informationen finden Sie unter AWS-JSON-Richtlinienelemente: Principal.

Wenn sich die IAM-Entität und das SNS-Thema im selben Konto befinden

Führen Sie einen der folgenden Schritte aus, aber nicht beides:

Fügen Sie der IAM-Entität eine IAM-Richtlinienanweisung zu, die es der Entität ermöglicht, die Aktionen „sns:Subscribe“ und „sns:Publish“ auszuführen.

-oder-

Fügen Sie der Zugriffsrichtlinie Ihres Themas eine SNS-Richtlinienanweisung hinzu, die es der IAM-Entität ermöglicht, die Aktionen „sns:Subscribe“ und „sns:Publish“ auszuführen.

Richtlinienerklärungen finden Sie beispielsweise im Abschnitt Wenn sich die IAM-Entität und das SNS in verschiedenen AWS-Konten befinden.

(Für Themen mit aktivierter serverseitiger Verschlüsselung (SSE)) Vergewissern Sie sich, dass Ihr Thema über die erforderlichen Berechtigungen für AWS Key Management (AWS KMS) verfügt

Wenn für Ihr Thema SSE aktiviert ist, muss Ihr Amazon-SNS-Thema einen vom Kunden verwalteten AWS-KMS-Schlüssel verwenden. Dieser KMS-Schlüssel muss eine benutzerdefinierte Schlüsselrichtlinie enthalten, die anderen AWS-Services ausreichende Berechtigungen zur Schlüsselnutzung gewährt.

Die folgenden Berechtigungen sind die Mindestanforderungen:
"kms:Decrypt"
"kms:GenerateDataKey*"

Gehen Sie wie folgt vor, um die erforderlichen AWS KMS-Berechtigungen einzurichten:

1.    Erstellen Sie einen neuen KMS-Schlüssel, der vom Kunden verwaltet wird und die erforderlichen Berechtigungen für den anderen AWS-Service enthält.

2.    Konfigurieren Sie SSE für Ihr Amazon SNS-Thema mithilfe des benutzerdefinierten KMS-Schlüssels, den Sie gerade erstellt haben.

3.    Konfigurieren Sie AWS-KMS-Berechtigungen, die es dem anderen AWS-Service ermöglichen, Nachrichten zu Ihrem verschlüsselten Thema zu veröffentlichen.

Beispiel einer IAM-Richtlinienanweisung, mit der ein anderer AWS-Service Nachrichten zu einem verschlüsselten SNS-Thema veröffentlichen kann

{
    "Sid": "Allow-a-service-to-use-this-key",
    "Effect": "Allow",
    "Principal": {
        "Service": "service.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*"
}