Perché non posso pubblicare o sottoscrivere un argomento di Amazon SNS?

Ultimo aggiornamento: 04-11-2021

Non riesco a pubblicare o a sottoscrivere un argomento Amazon Simple Notification Service (Amazon SNS). In che modo posso risolvere il problema?

Breve descrizione

Una risorsa o identità di AWS Identity and Access Management (IAM) non può pubblicare o sottoscrivere un argomento Amazon SNS senza le autorizzazioni richieste.

Per concedere le autorizzazioni IAM necessarie per pubblicare o sottoscrivere un argomento Amazon SNS, esegui una delle seguenti operazioni in base al tuo caso d'uso.

Nota: Amazon SNS utilizza insieme policy di accesso basate sull'identità IAM e basate sulle risorse di Amazon SNS per concedere l'accesso agli argomenti SNS. Puoi utilizzare una policy IAM per limitare l'accesso di utenti o ruoli alle azioni e agli argomenti di Amazon SNS. Una policy IAM può limitare l'accesso ai soli utenti all'interno del tuo account AWS, non ad altri account AWS. Per ulteriori informazioni, consulta Policy IAM e Amazon SNS insieme.

Risoluzione

Come concedere a un altro servizio AWS le autorizzazioni per la pubblicazione su un argomento Amazon SNS

La policy basata sulle risorse dell'argomento di Amazon SNS deve consentire all'altro servizio AWS di pubblicare messaggi nell'argomento. Rivedi la policy di accesso del tuo argomento per confermare che disponga delle autorizzazioni richieste e aggiungile se necessario.

Per aggiungere le autorizzazioni richieste, modifica la policy di accesso dell'argomento Amazon SNS in modo che includa la seguente istruzione di autorizzazione:

{
    "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: queste autorizzazioni consentono a chiunque abbia accesso all'Amazon Resource Name (ARN) dell'argomento SNS di pubblicare messaggi sull'argomento tramite l'endpoint del servizio. È possibile aggiungere chiavi di condizione globali per limitare le autorizzazioni di pubblicazione a risorse specifiche. Nell'esempio seguente vengono utilizzati l'operatore di condizione arnLike e la chiave di condizione globale aws:SourceArn. Per maggiori informazioni, consulta Esempi di casi per il controllo degli accessi di Amazon SNS.

Esempio di policy IAM che limita le autorizzazioni di pubblicazione di Amazon SNS a risorse specifiche

Importante: sostituisci <region> con la regione AWS della risorsa. Sostituisci <account-id> con il tuo ID account. Sostituisci <resource-name> con il nome della risorsa.

{
    "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 non supporta gli argomenti SNS FIFO. Se è presente un ARN S3 sulla policy dell'argomento, assicurati che non sia un percorso di una cartella bucket. Ad esempio: arn:aws:s3:*:*:mys3-bucket/*

Come consentire a un utente o un ruolo IAM di iscriversi e pubblicare su un argomento Amazon SNS

Per impostazione predefinita, solo il proprietario dell'argomento può pubblicare o sottoscrivere un argomento. Per consentire ad altre entità IAM di iscriversi e pubblicare sul tuo argomento, la policy basata sull'identità dell'argomento deve concedere le autorizzazioni richieste.

Importante: assicurati che né la policy dell'entità IAM né la policy di accesso dell'argomento SNS neghino esplicitamente l'accesso alla risorsa SNS. Per ulteriori informazioni, consulta La differenza tra negazioni esplicite e implicite.

Se l'entità IAM e l'argomento SNS si trovano in account AWS diversi

Completa entrambe le operazioni seguenti:

1.    Allega una istruzione di policy IAM all'entità IAM che consenta all'entità di eseguire le operazioni "sns:Subscribe" e "sns:Publish". Per le istruzioni, consulta Aggiunta e rimozione di autorizzazioni di identità IAM.

Di seguito è riportato un esempio di policy basata sull'identità IAM che consente a un'entità IAM di iscriversi e pubblicare su un argomento SNS:

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

2.    Allega una istruzione di policy SNS alla policy di accesso del tuo argomento che consenta all'entità IAM di eseguire le operazioni "sns:Subscribe" e "sns:Publish". Per istruzioni, consulta Come posso modificare la policy di accesso dell'argomento Amazon SNS?

Di seguito è riportato un esempio di policy di accesso dell’argomento di Amazon SNS che consente a un'entità IAM di iscriversi e pubblicare su un argomento 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: il principale può essere un utente o un ruolo basato sull'identità IAM o un numero di account AWS. Per maggiori informazioni, consulta Elementi della policy AWS JSON: principale.

Se l'entità IAM e l'argomento SNS si trovano nello stesso account

Completa una delle seguenti operazioni, ma non entrambe:

Allega una istruzione di policy IAM all'entità IAM che consenta all'entità di eseguire le operazioni "sns:Subscribe" e "sns:Publish".

-oppure-

Collega una istruzione di policy SNS alla policy di accesso del tuo argomento che consenta all'entità IAM di eseguire le operazioni "sns:Subscribe" e "sns:Publish".

Ad esempio, consulta la sezione Se l’entità IAM e l’argomento SNS si trovano in account AWS diversi di questo articolo.

(Per argomenti con crittografia lato server (SSE) attivata) Verifica che l'argomento disponga delle autorizzazioni richieste per AWS Key Management (AWS KMS)

Se il tuo argomento ha SSE attivato, l'argomento Amazon SNS deve utilizzare una chiave AWS KMS gestita dal cliente. Questa chiave KMS deve includere una policy delle chiavi personalizzata che conferisca agli altri servizi AWS autorizzazioni sufficienti per l'utilizzo delle chiavi.

Le seguenti autorizzazioni sono i requisiti minimi:
"kms:Decrypt"
"kms:GenerateDataKey*"

Per configurare le autorizzazioni AWS KMS richieste, procedi come segue:

1.    Crea una nuova chiave KMS gestita dal cliente e che includa le autorizzazioni necessarie per l’altro servizio AWS.

2.    Configura SSE per il tuo argomento Amazon SNS utilizzando la chiave KMS personalizzata appena creata.

3.    Configura le autorizzazioni di AWS KMS che consentono all'altro servizio AWS di pubblicare messaggi nel tuo argomento crittografato.

Esempio di istruzione di policy IAM che consente a un altro servizio AWS di pubblicare messaggi su un argomento SNS crittografato

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