Come faccio a correggere l'errore "Unable to validate the following destination configurations" in AWS CloudFormation?

5 minuti di lettura
0

Mi iscrivo a un argomento di Amazon Simple Notification Service (Amazon SNS) o una funzione AWS Lambda alle notifiche di eventi di Amazon Simple Storage Service (Amazon S3). Ricevo il seguente errore: "Unable to validate the following destination configurations." Quando provo a impostare una dipendenza sulla policy degli argomenti SNS dal bucket S3 nel mio modello, visualizzo un errore di convalida delle dipendenze circolare.

Breve descrizione

A causa del modo in cui AWS CloudFormation gestisce l'ordinamento delle dipendenze, le notifiche degli eventi di Amazon S3 sono definite come un attributo del bucket S3. Queste notifiche vengono stabilite quando viene creata la risorsa bucket S3.

Per evitare errori, devi creare le risorse nel seguente ordine:

  1. Crea l'argomento SNS, perché il bucket S3 fa riferimento all'argomento SNS.
  2. Crea il bucket S3, perché la policy degli argomenti SNS fa riferimento sia al bucket S3 che all'argomento SNS.

Prima di iscrivere un argomento SNS alle notifiche degli eventi S3, devi specificare una policy sull'argomento (AWS::SNS::TopicPolicy) con le autorizzazioni appropriate. Tale politica sull'argomento deve esistere prima di creare l'iscrizione.

Prova una delle seguenti strategie per evitare l'errore "Unable to validate the following destination configurations":

  • Specifica un valore per BucketName nel tuo modello AWS CloudFormation
  • Crea uno stack e quindi esegui un aggiornamento dello stack

Risoluzione

Specifica un valore per BucketName nel tuo modello AWS CloudFormation

Usa un nome statico per il tuo bucket S3 specificando un valore per la proprietà BucketName nella risorsa S3Bucket del tuo modello AWS CloudFormation. In questo modo si elimina la necessità di includere {"Ref": "paramBucketName"} nella politica sugli argomenti del SNS. In questo modo si rimuove la dipendenza intrinseca tra la policy tematica del SNS e Amazon S3.

L'esempio seguente di modello AWS CloudFormation specifica un valore codificato (-Bucket-Name-) per la proprietà BucketName. Nel tuo modello, sostituisci tutte le istanze di -Bucket-Name- con il nome del tuo bucket.

{
  "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": {
                    "Fn::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: la risorsa S3Bucket ha un valore DependsOn esplicito impostato su SNSTopicPolicy. Questo attributo specifica che il modello crea la risorsa SNSTopicPolicy prima della risorsa S3Bucket.

Per utilizzare lo stesso modello AWS CloudFormation per bucket S3 con nomi diversi, definisci un parametro per il nome del bucket. Il parametro consente di utilizzare lo stesso modello per nomi di bucket diversi passando il nome del bucket come parametro durante la creazione dello stack.

Per utilizzare il seguente modello di esempio, è necessario passare il nome del bucket come parametro paramBucketName durante la creazione dello stack.

{
  "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": {
                    "Fn::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"
            }
          ]
        }
      }
    }
  }
}

Crea uno stack e quindi esegui un aggiornamento dello stack

Dividi la creazione dello stack in due fasi. Innanzitutto, crea lo stack, ma non specificare la proprietà NotificationConfiguration nella risorsa S3Bucket. Quindi, esegui un aggiornamento dello stack per aggiungere la notifica dell'evento S3. In questo modo si evita di impostare la notifica degli eventi S3 prima della creazione della policy degli argomenti del SNS.

1.    Crea tutte le risorse, inclusa la politica sugli argomenti del SNS. Ad 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": {
                    "Fn::Join": [
                      "",
                      [
                        "arn:aws:s3:::",
                        {
                          "Ref": "S3Bucket"
                        }
                      ]
                    ]
                  }
                }
              }
            }
          ]
        },
        "Topics": [
          {
            "Ref": "SNSTopic"
          }
        ]
      }
    },
    "S3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "AccessControl": "BucketOwnerFullControl"
      }
    }
  }
}

2.    Aggiorna lo stack per aggiungere la notifica dell'evento S3. Ad 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": {
                    "Fn::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"
            }
          ]
        }
      }
    }
  }
}

Nota: puoi usare AWS CloudFormation Template Flip per convertire i tuoi modelli AWS CloudFormation tra formati JSON e YAML.


Informazioni correlate

How do I avoid the "Unable to validate the following destination configurations" error with Lambda event notifications in AWS CloudFormation?

Aggiornamenti dello stack di AWS CloudFormation

Configurazione delle notifiche Amazon SNS

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa