Come faccio a correggere l'errore "Unable to validate the following destination configurations" (Impossibile convalidare le configurazioni di destinazione seguenti) in CloudFormation?

12 minuti di lettura
0

Mi sono abbonato a un servizio AWS e ho ricevuto l'errore “Unable to validate the following destination configurations” in AWS CloudFormation.

Risoluzione

Per risolvere l'errore Unable to validate (Impossibile convalidare), esegui le operazioni di risoluzione dei problemi relativi alla configurazione.

Nota: se si verificano errori durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta Troubleshooting errors for the AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Problemi di configurazione delle notifiche Lambda

L'ARN della funzione Lambda non esiste o non è valido

Se il bucket Amazon Simple Storage Service (Amazon S3) utilizza la proprietà AWS Lambda LambdaConfigurations, potresti ricevere l'errore lambda function does not exist (Funzione Lambda inesistente). Questo errore si verifica se l'ARN configurato per la funzione Lambda nel modello CloudFormation non esiste o non è valido.

Per verificare se la funzione Lambda esiste, esegui il comando get-function:

aws lambda get-function
--function-name YOUR-FUNCTION-ARN-VALUE

Nota: sostituisci YOUR-FUNCTION-ARN-VALUE con l'ARN della funzione.

Se ricevi un errore nell'output del comando, l'ARN della funzione non è valido o non esiste. Aggiorna il modello includendo l'ARN corretto. Quindi crea un nuovo stack con il modello aggiornato o aggiorna lo stack esistente.

La funzione Lambda non ha l'autorizzazione per invocare Amazon S3

Se ricevi l'errore the resource you requested does not exist (Risorsa richiesta inesistente), significa che la funzione Lambda non dispone di un'autorizzazione necessaria. Per risolvere questo problema, completa i passaggi seguenti:

  1. Per verificare le autorizzazioni della funzione Lambda, esegui il comando get-policy:
    aws lambda get-policy
    --function-name YOUR-FUNCTION-ARN-VALUE
    --region YOUR-REGION
    Nota: sostituisci FUNCTION-ARN-VALUE con l'ARN della funzione e YOUR-REGION con la tua regione AWS.
  2. Per consentire alla funzione Lambda di invocare Amazon S3, aggiorna il modello CloudFormation collegando l'autorizzazione seguente:
    S3Permission:    
      Type: AWS::Lambda::Permission
      Properties:
        FunctionName: YOUR-FUNCTION-ARN-VALUE
        Action: lambda:InvokeFunction
        Principal: s3.amazonaws.com
        SourceAccount: !Ref 'AWS::AccountId'
    Nota: sostituisci FUNCTION-ARN-VALUE con l'ARN della funzione e AccountID con l'account AWS proprietario della funzione. Puoi utilizzare lo pseudoparametro AWS::AccountId per sostituire automaticamente l'ID dell'account dove CloudFormation crea lo stack.
  3. Per assicurarti che CloudFormation crei il bucket S3 solo quando la funzione Lambda avrà le autorizzazioni richieste, aggiungi l'attributo dependsOn:
    S3Bucket:    
      Type: AWS::S3::Bucket
      DependsOn: "S3Permission"
      Properties:
        NotificationConfiguration:
          LambdaConfigurations:
            - Function: YOUR-FUNCTION-ARN-VALUE
                Event: "s3:ObjectCreated:Put"
    
    Nota: sostituisci FUNCTION-ARN-VALUE con l'ARN della funzione.

Problemi di configurazione delle notifiche Amazon SNS

L'ARN di Amazon SNS non esiste o non è valido

Se il bucket S3 utilizza la proprietà TopicConfigurations, potresti ricevere l'errore Unable to validate the following destination configurations (Impossibile convalidare le configurazioni di destinazione seguenti). Questo errore si verifica quando il topic Amazon Simple Notification Service (Amazon SNS) non esiste o non è valido. Il formato e il valore dell'ARN devono corrispondere all'ARN del topic SNS.

Per verificare se l'ARN del topic SNS esiste nel tuo account, esegui il comando list-topics:

aws sns list-topics \
--region YOUR-REGION \
--query "Topics[?TopicArn=='YOUR-TOPIC-ARN-VALUE']"

Nota: sostituisci YOUR-REGION con la tua regione e YOUR-TOPIC-ARN-VALUE con l'ARN del topic.

Se il comando non restituisce alcun record, il topic SNS non esiste o non è valido. Per risolvere il problema, crea il topic SNS. Assicurati di fornire un ARN valido del topic nella proprietà TopicConfigurations.

Il topic SNS non ha la policy di accesso necessaria

Per verificare che il topic SNS abbia la policy di accesso necessaria, completa i passaggi seguenti:

  1. Per verificare la policy di accesso collegata al topic SNS, esegui il comando get-topic-attributes:
    aws sns get-topic-attributes \
    --topic-arn YOUR-TOPIC-ARN-VALUE \
    --region YOUR-REGION \
    --query 'Attributes.Policy'
    Nota: sostituisci YOUR-TOPIC-ARN-VALUE con l'ARN del tuo topic e YOUR-REGION con la tua regione.
  2. La policy di accesso deve consentire al servizio Amazon S3 di pubblicare sul topic. Se la policy non ha queste autorizzazioni, modifica la policy di accesso del topic includendo le autorizzazioni seguenti:
    {     
          "Sid": "S3AccessForNotification",      
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "SNS:Publish",
          "Resource": "YOUR-TOPIC-ARN-VALUE"
    }
    Nota: sostituisci YOUR-TOPIC-ARN-VALUE con l'ARN del tuo topic.
  3. Verifica di poter ora creare un nuovo stack o aggiornare lo stack esistente.

Problema nella policy della chiave AWS KMS associata al topic SNS

La policy del Servizio AWS di gestione delle chiavi (AWS KMS) deve consentire ad Amazon S3 di accedere alla chiave AWS KMS. Per visualizzare la configurazione della crittografia e la policy minima richiesta, completa i passaggi seguenti:

Per verificare se il topic SNS è crittografato con una chiave AWS KMS, esegui il comando get-topic-attributes:

aws sns get-topic-attributes \
--topic-arn YOUR-TOPIC-ARN-VALUE \
--region YOUR-REGION \
--query "Attributes.KmsMasterKeyId"

Nota: sostituisci YOUR-TOPIC-ARN-VALUE con l'ARN del tuo topic e YOUR-REGION con la tua regione. Se il topic SNS è crittografato, l'output del comando mostrerà l'ARN della chiave AWS KMS.

Per verificare la policy della chiave AWS KMS, esegui il comando get-key-policy:

aws kms get-key-policy \
--key-id YOUR-KMS-KEY-ARN \
--policy-name default \
--region YOUR-REGION | jq -r '.Policy' | jq .

Nota: sostituisci YOUR-KMS-KEY-ARN con l'ARN della chiave AWS KMS e YOUR-REGION con la tua regione. Per una migliore leggibilità, è consigliabile utilizzare il comando jq per visualizzare il contenuto della policy in formato JSON. Per ulteriori informazioni, vedi ./jq sul sito web jq.

Nell'esempio seguente è mostrata la policy della chiave AWS KMS minima richiesta:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": ["kms:GenerateDataKey*", "kms:Decrypt"],
            "Resource": "YOUR-KMS-KEY-ARN"
        }
    ]
}

Nota: sostituisci YOUR-KMS-KEY-ARN con l'ARN della chiave AWS KMS.

Se la tua policy non dispone delle autorizzazioni richieste, aggiorna la policy della chiave AWS KMS.

Problemi di configurazione delle notifiche Amazon SQS

L'ARN di Amazon SQS non esiste o non è valido

Se il bucket S3 utilizza la proprietà QueueConfigurations, potresti ricevere l'errore SQS queue does not exist (Coda SQS inesistente). Questo errore si verifica quando l'ARN di Amazon Simple Queue Service (Amazon SQS) non esiste o non è valido.

Per verificare se la coda Amazon SQS esiste nell'account, esegui il comando list-queues:

aws sqs list-queues
--queue-name-prefix YOUR-SQS-QUEUE-NAME
--region YOUR-REGION

Nota: sostituisci YOUR-SQS-QUEUE-NAME con il nome della tua coda SQS e YOUR-REGION con la tua Regione.

Se la coda SQS non esiste, crea una nuova coda o aggiorna il modello con una coda esistente:

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref S3Bucket
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: BucketOwnerFullControl

La coda SQS non ha la policy di accesso richiesta

Per verificare che la coda SQS abbia la policy di accesso richiesta, puoi utilizzare AWS CLI o la console CloudFormation.

Per utilizzare AWS CLI per verificare la policy di accesso della coda, completa i passaggi seguenti:

  1. Per verificare la policy della coda SQS, esegui il comando get-queue-attributes:
    aws sqs get-queue-attributes \
    --queue-url YOUR-SQS-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names Policy | jq .
    Nota: sostituisci YOUR-SQS-QUEUE-NAME con il nome della coda SQS, YOUR-REGION con la tua regione e YOUR-SQS-QUEUE-URL con l'URL della coda. Per una migliore leggibilità, è consigliabile utilizzare il comando jq per visualizzare il contenuto della policy in formato JSON. Per ulteriori informazioni, vedi ./jq sul sito web jq.
  2. Se la tua policy non ha accesso ad Amazon S3, crea una nuova policy di accesso in un file JSON:
    {"Policy": "{\"Version\":\"2012-10-17\",\"Statement\":
    [{\"Sid\":\"S3AccessForNotification\",\"Effect\":\"Allow\",\"Principal\":
    {\"Service\":\"s3.amazonaws.com\"},\"Action\":\"SQS:SendMessage\",\"Resource\":\"YOUR-SQS-QUEUE-ARN\"}]}"}
    Nota: sostituisci YOUR-SQS-QUEUE-ARN con l'ARN della coda.
  3. Per aggiornare la policy, esegui il comando set-queue-attributes:
    aws sqs set-queue-attributes
    --queue-url YOUR-SQS-QUEUE-URL
    --attributes file://sqs-policy.json
    Nota: sostituisci YOUR-SQS-QUEUE-URL con l'URL della coda e sqs-policy.json con il file JSON della policy.

Per utilizzare la console CloudFormation per verificare la policy di accesso della coda, aggiorna il modello CloudFormation includendo la risorsa seguente:

SampleSQSPolicy:
  Type: AWS::SQS::QueuePolicy
  Properties:
    Queues:
      - YOUR-SQS-QUEUE-URL
    PolicyDocument:
      Statement:
        -
          Action:
            - "SQS:SendMessage"
          Effect: "Allow"
          Resource: YOUR-SQS-QUEUE-ARN
          Principal:  
            Service:
              - "s3.amazonaws.com"

Nota: sostituisci YOUR-SQS-QUEUE-URL con l'URL della coda e YOUR-SQS-QUEUE-ARN con l'ARN della coda.

Dopo aver creato o aggiornato la policy, verifica di poter ora creare un nuovo stack o aggiornare lo stack esistente.

Per ulteriori informazioni, consulta Quali autorizzazioni occorrono per accedere alla coda Amazon SQS? Se i problemi persistono, consulta How do I troubleshoot the Amazon SQS error "Invalid value for the parameter policy"?

Problema nella policy della chiave AWS KMS associata alla coda SQS

Per risolvere problemi relativi alla policy della chiave AWS KMS, completa i passaggi seguenti:

  1. Per ottenere l'URL della coda SQS, esegui il comando list-queues:
    aws sqs list-queues
    --queue-name-prefix YOUR-SQS-QUEUE-NAME
    --region YOUR-REGION
    Nota: sostituisci YOUR-SQS-QUEUE-NAME con il nome della tua coda SQS e YOUR-REGION con la tua regione.
  2. Per ottenere l'ID della chiave AWS KMS, esegui il comando get-queue-attributes:
    aws sqs get-queue-attributes \
    --queue-url YOUR-SQS-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names KmsMasterKeyId
    Nota: sostituisci YOUR-SQS-QUEUE-URL con l'URL della coda e YOUR-REGION con la tua regione.
  3. Per ottenere l'ARN della chiave AWS KMS, esegui il comando describe-key:
    aws kms describe-key --key-id YOUR-KMS-KEY-ID
    Nota: sostituisci YOUR-KMS-KEY-ID con l'ID della chiave.
  4. Per visualizzare la policy completa della chiave, esegui il comando get-key-policy:
    aws kms get-key-policy \
    --key-id YOUR-KMS-KEY-ARN \
    --policy-name default \
    --region YOUR-REGION
    Nota: sostituisci YOUR-KMS-KEY-ARN con l'ARN della chiave AWS KMS e YOUR-REGION con la tua regione.
  5. Nell'output, verifica che la policy consenta ad Amazon S3 di utilizzare la chiave AWS KMS. Autorizzazioni di esempio:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "s3.amazonaws.com"
                },
                "Action": ["kms:GenerateDataKey*", "kms:Decrypt"],
                "Resource": "YOUR-KMS-KEY-ARN"
            }
        ]
    }
    Nota: sostituisci YOUR-KMS-KEY-ARN con l'ARN della chiave AWS KMS.

Se la tua policy non dispone delle autorizzazioni richieste, aggiorna la policy della chiave.

Dipendenza circolare tra risorse

Importante: prima di sottoscrivere un topic SNS alle notifiche degli eventi S3, devi creare AWS::SNS::TopicPolicy con le autorizzazioni necessarie. La policy del topic deve esistere prima della creazione della sottoscrizione.

Per creare prima la policy del topic, usa un attributo DependsOn sulla risorsa AWS::S3::Bucket. Questo attributo crea la policy del topic prima del bucket. In alternativa, puoi usare due operazioni dello stack per creare prima tutte le risorse e quindi aggiornare la risorsa S3Bucket includendo la proprietà NotificationConfiguration. Esegui una delle operazioni seguenti.

Specifica un valore per BucketName nel modello CloudFormation

Usa un nome statico per il bucket S3 nella proprietà BucketName nella risorsa S3Bucket del modello CloudFormation. Un nome di bucket S3 statico rimuove la dipendenza intrinseca tra la policy del topic SNS e Amazon S3.

Importante: i nomi dei bucket S3 devono essere univoci a livello globale.

L'esempio seguente di modello CloudFormation specifica il valore -Bucket-Name- codificato per la proprietà BucketName:

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - '-Bucket-Name-'
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    DependsOn:
      - SNSTopicPolicy
    Properties:
      AccessControl: BucketOwnerFullControl
      BucketName: "-Bucket-Name-"
      NotificationConfiguration:
        TopicConfigurations:
          - Topic: !Ref SNSTopic
            Event: s3:ObjectCreated:Put

Nota: sostituisci -Bucket-Name- con il nome del tuo bucket. La risorsa S3Bucket ha un attributo DependsOn esplicito impostato su SNSTopicPolicy. L'attributo specifica che il modello crea la risorsa SNSTopicPolicy prima della risorsa S3Bucket.

Usa un parametro per BucketName

I parametri consentono di utilizzare lo stesso modello CloudFormation per bucket S3 con nomi diversi. Durante la creazione dello stack, puoi impostare un valore per il parametro paramBucketName. Policy di esempio:

Parameters:
  paramBucketName:
    Type: String
    Description: Bucket Name
Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref paramBucketName
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    DependsOn:
      - SNSTopicPolicy
    Properties:
      AccessControl: BucketOwnerFullControl
      BucketName: !Ref paramBucketName
      NotificationConfiguration:
        TopicConfigurations:
          - Topic: !Ref SNSTopic
            Event: s3:ObjectCreated:Put

Nota: nell'esempio precedente, la risorsa S3Bucket ha un attributo DependsOn esplicito impostato su SNSTopicPolicy.

Crea uno stack e poi aggiornalo

Nota: con questo metodo, la risorsa S3Bucket non include la proprietà BucketName. Di conseguenza, CloudFormation crea automaticamente un nome di bucket univoco. Per evitare la dipendenza circolare, non usare l'attributo DependsOn.

Crea prima lo stack senza la proprietà NotificationConfiguration nella risorsa S3Bucket. Esempio:

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref S3Bucket
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: BucketOwnerFullControl

Aggiungi la proprietà NotificationConfiguration nella risorsa S3Bucket, quindi aggiorna lo stack. Esempio:

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid: Statement-id
            Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: "SNS:Publish"
            Resource: !Ref SNSTopic
            Condition:
              ArnLike:
                aws:SourceArn: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref S3Bucket
      Topics:
        - !Ref SNSTopic
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: BucketOwnerFullControl
      NotificationConfiguration:
        TopicConfigurations:
          - Topic: !Ref SNSTopic
            Event: s3:ObjectCreated:Put

Informazioni correlate

Granting permissions to publish event notification messages to a destination

Come faccio a evitare l'errore "Unable to validate the following destination configurations" con le notifiche degli eventi Lambda in CloudFormation?

Managing AWS resources as a single unit with AWS CloudFormation stacks

Setting up Amazon SNS notifications

AWS UFFICIALE
AWS UFFICIALEAggiornata un mese fa