Pourquoi ne puis-je pas publier ou m'abonner à une rubrique Amazon SNS ?

Date de la dernière mise à jour : 04/11/2021

Je ne parviens pas à publier ou à m'abonner à une rubrique Amazon Simple Notification Service (Amazon SNS). Comment résoudre ce problème ?

Brève description

Une ressource ou une identité AWS Identity and Access Management (IAM) ne peut pas publier ou s'abonner à une rubrique Amazon SNS sans les autorisations requises.

Pour accorder les autorisations IAM requises pour publier ou s'abonner à une rubrique Amazon SNS, effectuez l'une des opérations suivantes en fonction de votre cas d'utilisation.

Remarque : Amazon SNS utilise conjointement des stratégies d'accès basées sur l'identité IAM et basées sur les ressources Amazon SNS pour accorder l'accès aux rubriques SNS. Vous pouvez utiliser une stratégie IAM pour restreindre l'accès des utilisateurs ou des rôles aux actions et rubriques Amazon SNS. Une stratégie IAM peut restreindre l'accès uniquement aux utilisateurs de votre compte AWS, pas aux autres comptes AWS. Pour plus d'informations, consultez la section Stratégies IAM et Amazon SNS ensemble.

Solution

Pour accorder à un autre service AWS des autorisations de publication sur une rubrique Amazon SNS

La stratégie basée sur les ressources de votre rubrique Amazon SNS doit permettre aux autres services AWS de publier des messages sur la rubrique. Consultez la stratégie d'accès de votre sujet pour vérifier qu'il dispose des autorisations requises, et ajoutez-les si nécessaire.

Pour ajouter les autorisations requises, modifiez la stratégie d'accès de votre rubrique Amazon SNS afin qu'elle inclue la déclaration d'autorisations suivante :

{
    "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"
}

Important : ces autorisations permettent à toute personne ayant accès à l'Amazon Resource Name (ARN) de votre rubrique SNS de publier des messages sur la rubrique via le point de terminaison du service. Vous pouvez ajouter des clés de condition globales pour restreindre les autorisations de publication à des ressources spécifiques. L'exemple suivant utilise l'opérateur conditionnel arnLike et la clé de condition globale aws:SourceArn. Pour plus d'informations, veuillez consulter la rubrique Exemples de cas pour le contrôle d'accès à Amazon SNS.

Exemple de stratégie IAM qui limite les autorisations de publication Amazon SNS à des ressources spécifiques

Important : remplacez par<region>  par la région AWS de la ressource. Remplacez <account-id> par l'ID de votre compte. Remplacez<resource-name> par le nom de la 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>"
        }
    }
}

Important : Amazon S3 ne prend pas en charge les rubriques SNS FIFO. S'il existe un ARN S3 dans la stratégie de rubrique, assurez-vous qu'il ne s'agit pas d'un chemin d'accès à un dossier de compartiment. Par exemple : arn:aws:s3:*:*:mys3-bucket/*

Pour autoriser un utilisateur ou un rôle IAM à s'abonner et à publier sur une rubrique Amazon SNS

Par défaut, seul le propriétaire du sujet peut publier un sujet ou s'y abonner. Pour permettre à d'autres entités IAM de s'abonner et de publier sur votre rubrique, la stratégie basée sur l'identité de votre rubrique doit accorder les autorisations requises.

Important : vérifiez que ni la stratégie de l'entité IAM ni la stratégie d'accès de la rubrique SNS ne refusent explicitement l'accès à la ressource SNS. Pour plus d'informations, veuillez consulter la rubrique La différence entre les refus explicites et implicites.

Si l'entité IAM et la rubrique SNS se trouvent dans des comptes AWS différents

Suivez ces deux étapes :

1.    Attachez une déclaration de stratégie IAM à l'entité IAM qui permet à l'entité d'exécuter les actions « sns:Subscribe » et « sns:Publish ». Pour plus d'informations, consultez la section Ajout et suppression d'autorisations d'identité IAM.

Voici un exemple de stratégie basée sur l'identité IAM qui permet à une entité IAM de s'abonner et de publier dans une rubrique SNS :

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

2.    Attachez une déclaration de stratégie SNS à la stratégie d'accès de votre rubrique qui permet à l'entité IAM d'exécuter les actions « sns:Subscribe » et « sns:Publish ». Pour obtenir des instructions, veuillez consulter la rubrique Comment modifier la stratégie d'accès de ma rubrique Amazon SNS ?

Voici un exemple de stratégie d'accès à une rubrique Amazon SNS qui permet à une entité IAM de s'abonner et de publier sur une rubrique SNS :

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

Remarque : Le Principal peut être un utilisateur ou un rôle basé sur les identités IAM, ou un numéro de compte AWS. Pour plus d'informations, veuillez consulter la rubrique Éléments de politique AWS JSON : le mandataire.

Si l'entité IAM et la rubrique SNS se trouvent dans le même compte

Suivez l'une de ces étapes, mais pas les deux :

Attachez une déclaration de stratégie IAM à l'entité IAM qui permet à l'entité d'exécuter les actions « sns:Subscribe » et « sns:Publish ».

-ou-

Attachez une déclaration de stratégie SNS à la stratégie d'accès de votre rubrique qui permet à l'entité IAM d'exécuter les actions « sns:Subscribe » et « sns:Publish ».

Pour obtenir des exemples d'instructions de politique, consultez la section Si l'entité IAM et la rubrique SNS se trouvent dans des comptes AWS différents de cet article.

(Pour les rubriques avec le chiffrement côté serveur (SSE) activé) Vérifiez que votre rubrique dispose des autorisations AWS Key Management (AWS KMS) requises

Si le SSE est activé dans votre rubrique, votre rubrique Amazon SNS doit utiliser une clé AWS KMS gérée par le client. Cette clé KMS doit inclure une stratégie de clé personnalisée qui donne aux autres services AWS des autorisations d'utilisation de clé suffisantes.

Les autorisations suivantes constituent la configuration minimale requise :
"kms:Decrypt"
"kms:GenerateDataKey*"

Pour configurer les autorisations AWS KMS requises, procédez comme suit :

1.    Créez une clé KMS gérée par le client et qui comprend les autorisations requises pour l'autre service AWS.

2.    Configurez SSE pour votre rubrique Amazon SNS à l'aide de la clé KMS personnalisée que vous venez de créer.

3.    Configurez les autorisations AWS KMS qui permettent à l'autre service AWS de publier des messages dans votre rubrique chiffrée.

Exemple de déclaration de stratégie IAM qui permet à un autre service AWS de publier des messages dans une rubrique SNS chiffrée

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