Por qué no puedo publicar o suscribirme a un tema de Amazon SNS?

Última actualización: 04/11/2021

No puedo publicar ni suscribirme a un tema de Amazon Simple Notification Service (Amazon SNS). ¿Cómo soluciono este problema?

Descripción corta

Un recurso o identidad de AWS Identity and Access Management (IAM) no puede publicar ni suscribirse a un tema de Amazon SNS sin los permisos necesarios.

Para conceder los permisos de IAM necesarios para publicar o suscribirse a un tema de Amazon SNS, realice una de las siguientes acciones en función de su caso de uso.

Nota: Amazon SNS utiliza políticas de acceso basadas en identidades de IAM y basadas en recursos de Amazon SNS conjuntamente para conceder acceso a temas de SNS. Puede utilizar una política de IAM para restringir el acceso de usuarios o roles a las acciones y los temas de Amazon SNS. Una política de IAM puede restringir el acceso únicamente a los usuarios de su cuenta de AWS, no a otras cuentas de AWS. Para obtener más información, consulte Políticas de IAM y Amazon SNS juntas.

Resolución

Para conceder a otro servicio de AWS permisos para publicar en un tema de Amazon SNS

La política basada en recursos de su tema de Amazon SNS debe permitir a CloudWatch publicar mensajes en el tema. Revisa la política de acceso de tu tema para confirmar que tiene los permisos requeridos y agrégalos si es necesario.

Para agregar los permisos requeridos, edite la política de acceso del tema de Amazon SNS para que incluya la siguiente declaración de permisos:

{
    "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: Estos permisos permiten que cualquier persona que tenga acceso al nombre de recurso de Amazon (ARN) del tema de SNS publique mensajes en el tema a través del punto de enlace del servicio. Puede agregar claves de condición globales para restringir los permisos de publicación a recursos específicos. En el siguiente ejemplo, se utiliza el operador de condición ARNLike y la clave de condición global aws:SourceARN. Para obtener más información, consulte Casos de ejemplo para el control de acceso de Amazon SNS.

Ejemplo de política de IAM que restringe los permisos de publicación de Amazon SNS a recursos específicos

Importante: <region>Reemplácelo por la región de AWS del recurso. Reemplázalo por el <account-id>ID de tu cuenta. <resource-name>Reemplácelo por el nombre del 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>"
        }
    }
}

Importante: Amazon S3 no es compatible con los temas de FIFO SNS. Si hay un ARN de S3 en la política de temas, asegúrese de que no sea una ruta a una carpeta de bucket. Por ejemplo: arn:aws:s3:*:*:mys3-bucket/*

Para permitir que un usuario o rol de IAM se suscriba y publique en un tema de Amazon SNS

De forma predeterminada, solo el propietario del tema puede publicar un tema o suscribirse a él. Para permitir que otras entidades de IAM se suscriban y publiquen en su tema, la política basada en la identidad de su tema debe otorgar los permisos necesarios.

Importante: Asegúrese de que ni la política de la entidad de IAM ni la política de acceso del tema SNS niegues explícitamente el acceso al recurso SNS. Para obtener más información, consulte La diferencia entre denegaciones explícitas e implícitas.

Si la entidad de IAM y el tema de SNS se encuentran en cuentas de AWS diferentes

Realice las dos acciones siguientes:

1.    Adjunte una declaración de política de IAM a la entidad de IAM que permita a la entidad ejecutar las acciones «SNS:Subscribe» y «SNS:Publish». Para obtener instrucciones, consulte Adición y eliminación de permisos de identidad de IAM.

A continuación se muestra un ejemplo de política basada en identidades de IAM que permite que una entidad de IAM se suscriba y publique en un tema de SNS:

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

2.    Adjunte una declaración de política de SNS a la política de acceso del tema que permita a la entidad de IAM ejecutar las acciones «SNS:Subscribe» y «SNS:Publish». Para obtener instrucciones, consulte ¿Cómo edito la política de acceso de mi tema de Amazon SNS?

A continuación se muestra un ejemplo de política de acceso a temas de Amazon SNS que permite que una entidad de IAM se suscriba y publique en un tema de SNS:

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

Nota: La entidad principal puede ser un usuario o rol basado en la identidad de IAM, o un número de cuenta de AWS. Para obtener más información, consulte Elemento de la política de JSON de AWS: principal.

Si la entidad de IAM y el tema de SNS están en la misma cuenta

Realice una de las siguientes acciones, pero no ambas:

Adjunte una declaración de política de IAM a la entidad de IAM que permita a la entidad ejecutar las acciones «SNS:Subscribe» y «SNS:Publish».

-o bien-

Adjunte una declaración de política de SNS a la política de acceso del tema que permita a la entidad de IAM ejecutar las acciones «SNS:Subscribe» y «SNS:Publish».

Por ejemplo, declaraciones de políticas, consulte la sección Si la entidad de IAM y el tema SNS se encuentran en cuentas de AWS diferentes de este artículo.

(Para temas con cifrado del lado del servidor [SSE] activado) Confirme que su tema tenga los permisos necesarios para AWS Key Management (AWS KMS)

Si su tema tiene activada la SSE, su tema de Amazon SNS debe usar una clave de AWS KMS administrada por el cliente. Esta clave de KMS debe incluir una política de claves personalizada que conceda a Amazon SNS permisos suficientes para el uso de claves.

Los siguientes permisos son los requisitos mínimos:
«KMS: descifrar»
«KMS: clave de generación de atos*»

Para configurar los permisos de AWS KMS necesarios, haga lo siguiente:

1.    Cree una nueva clave de KMS administrada por el cliente e incluya los permisos necesarios para CloudWatch.

2.    Configure SSE para su tema de Amazon SNS mediante la clave de KMS personalizada que acaba de crear.

3.    Configure los permisos de AWS KMS que permiten a CloudWatch publicar mensajes en su tema cifrado.

Ejemplo de declaración de política de IAM que permite que otro servicio de AWS publique mensajes en un tema de SNS cifrado

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