Por que não consigo publicar nem assinar um tópico do Amazon SNS?

Última atualização: 04/11/2021

Não consigo publicar nem assinar um tópico do Amazon Simple Notification Service (Amazon SNS). Como solucionar o problema?

Breve descrição

Um recurso ou uma identidade do AWS Identity and Access Management (IAM) não consegue publicar nem assinar um tópico do Amazon SNS sem as permissões necessárias.

Para conceder as permissões do IAM necessárias para publicar ou assinar um tópico do Amazon SNS, execute um destes procedimentos, de acordo com seu caso de uso.

Observação: o Amazon SNS usa políticas de acesso baseadas em identidade do IAM e baseadas em recursos do Amazon SNS de maneira conjunta para conceder acesso a tópicos do SNS. Você pode usar uma política do IAM para restringir o acesso de usuários ou funções a ações e tópicos do Amazon SNS. Uma política do IAM pode restringir o acesso somente aos usuários de sua conta da AWS, e não a usuários de outras contas da AWS. Para mais informações, consulte Políticas do IAM e do Amazon SNS juntas.

Resolução

Para conceder permissões para outro produto da AWS publicar em um tópico do Amazon SNS

A política baseada em recursos do tópico do Amazon SNS deve permitir que o outro produto da AWS publique mensagens no tópico. Analise a política de acesso de seu tópico e confirme se ela tem as permissões necessárias, adicionando-as, se necessário.

Para adicionar as permissões necessárias, edite a política de acesso do tópico do Amazon SNS de modo a incluir a seguinte declaração de permissões:

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

Importante: essas permissões permitem que qualquer pessoa que tenha acesso ao nome do recurso da Amazon (ARN) de seu tópico do SNS publique mensagens no tópico pelo endpoint de serviço. É possível adicionar chaves de condição global para restringir as permissões de publicação a recursos específicos. O exemplo a seguir usa o operador de condição arnLike e a chave de condição global aws:SourceArn. Para obter mais informações, consulte Exemplos de casos para controle de acesso do Amazon SNS.

Exemplo de política do IAM que restringe as permissões de publicação do Amazon SNS a recursos específicos

Importante: substitua <region>  pela região da AWS do recurso. Substitua <account-id> pelo ID de sua conta. Substitua <resource-name> pelo nome do recurso.

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

Observação: o Amazon S3 não é compatível com tópicos FIFO do SNS. Se houver um ARN do S3 na política de tópicos, verifique se não é um caminho para uma pasta de bucket. Por exemplo: arn:aws:s3:*:*:mys3-bucket/*

Para permitir que um usuário ou uma função do IAM assine e publique em um tópico do Amazon SNS

Por padrão, somente o proprietário do tópico pode publicar ou assinar o tópico. Para permitir que outras entidades do IAM assinem e publiquem em seu tópico, a política baseada em identidade do tópico deverá conceder as permissões necessárias.

Importante: verifique se nem a política da entidade do IAM nem a política de acesso do tópico do SNS nega explicitamente o acesso ao recurso do SNS. Para obter mais informações, consulte A diferença entre negações explícitas e implícitas.

Se a entidade do IAM e o tópico do SNS estiverem em contas da AWS diferentes

Siga estas duas etapas:

1.    Anexe uma declaração de política do IAM à entidade do IAM permitindo que a entidade execute as ações “sns:Subscribe” e “sns:Publish”. Para obter instruções, consulte Adicionar e remover permissões de identidade do IAM.

Veja a seguir um exemplo de política baseada em identidade do IAM que permite que uma entidade do IAM assine e publique em um tópico do SNS:

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

2.    Anexe uma declaração de política do SNS à política de acesso de seu tópico permitindo que a entidade do IAM execute as ações “sns:Subscribe” e “sns:Publish”. Para obter instruções, consulte Como editar a política de acesso de meu tópico do Amazon SNS?

Veja a seguir um exemplo de política de acesso do tópico do Amazon SNS que permite que uma entidade do IAM assine e publique em um tópico do SNS:

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

Observação: a Entidade pode ser um usuário ou função baseada em identidade do IAM ou um número de conta da AWS. Para mais informações, consulte Elementos de política JSON da AWS: entidade.

Se a entidade do IAM e o tópico do SNS estiverem na mesma conta

Siga uma destas opções, mas não ambas:

Anexe uma declaração de política do IAM à entidade do IAM permitindo que a entidade execute as ações “sns:Subscribe” e “sns:Publish”.

-ou-

Anexe uma declaração de política do SNS à política de acesso de seu tópico permitindo que a entidade do IAM execute as ações “sns:Subscribe” e “sns:Publish”.

Para obter exemplos de declarações de política, consulte a seção Se a entidade do IAM e o tópico do SNS estiverem em diferentes contas da AWS deste artigo.

(Para tópicos com criptografia no lado do servidor [SSE] ativada) Confirme se o tópico tem as permissões necessárias do AWS Key Management (AWS KMS)

Caso seu tópico esteja com o SSE ativado, o tópico do Amazon SNS deverá usar uma chave do AWS KMS gerenciada pelo cliente. A chave do KMS deverá incluir uma política de chave personalizada que conceda permissões de uso de chaves suficientes a outros produtos da AWS.

Os requisitos mínimos são estas permissões:
“kms:Decrypt”
“kms:GenerateDataKey*”

Para configurar as permissões necessárias do AWS KMS, faça o seguinte:

1.    Crie uma nova chave do KMS que seja gerenciada pelo cliente e inclua as permissões necessárias para o outro produto da AWS.

2.    Configure a SSE para seu tópico do Amazon SNS usando a chave personalizada do KMS que você acabou de criar.

3.    Configure as permissões do AWS KMS que permitem que o outro produto da AWS publique mensagens em seu tópico criptografado.

Exemplo de declaração de política do IAM que permite que outro produto da AWS publique mensagens em um tópico do SNS criptografado

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