Como faço para corrigir o erro “Não é possível validar as seguintes configurações de destino” no AWS CloudFormation?

11 minuto de leitura
0

Eu me inscrevi em um serviço da AWS e recebi o erro “Não é possível validar as seguintes configurações de destino” no AWS CloudFormation.

Resolução

Para resolver a mensagem de erro, siga estas etapas de solução de problemas para sua configuração.

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Troubleshoot AWS CLI errors. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Problemas com a configuração de notificação do Lambda

Erro: “A função lambda de notificação não existe”

Esse erro ocorre quando você cria ou atualiza um bucket do Amazon Simple Storage Service (Amazon S3) que usa a propriedade LambdaConfigurations do AWS Lambda. Se o ARN da função do Lambda configurado no modelo do CloudFormation não existir ou não for válido, você poderá receber essa mensagem de erro.

Para verificar se a propriedade LambdaConfigurations existe, execute o seguinte comando da AWS CLI:

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

Observação: substitua YOUR-FUNCTION-ARN-VALUE pelo ARN da função do Lambda.

Se você receber um erro na saída do comando, o ARN da função do Lambda não é válido ou não existe. Atualize o modelo para incluir o ARN correto. Em seguida, crie uma nova pilha ou atualize a pilha existente.

A função do Lambda não tem permissão para invocar o Amazon S3

Erro: “O recurso que você solicitou não existe”

Se você receber esse erro, a permissão não será anexada à função do Lambda.

Para solucionar esse problema, realize as etapas a seguir:

  1. Execute o comando a seguir para verificar as permissões da função do Lambda:

    aws lambda get-policy --function-name YOUR-FUNCTION-ARN-VALUE --region YOUR-REGION

    Observação: substitua YOUR-FUNCTION-ARN-VALUE pelo ARN da função do Lambda e YOUR-REGION pela sua região da AWS.

  2. Anexe a seguinte permissão no modelo do CloudFormation para permitir que a função do Lambda invoque o Amazon S3:

    S3Permission:
        Type: AWS::Lambda::Permission
        Properties:
         FunctionName: YOUR-FUNCTION-ARN-VALUE
         Action: lambda:InvokeFunction
         Principal: s3.amazonaws.com
         SourceAccount: !Ref 'AWS::AccountId'

    Observação: substitua YOUR-FUNCTION-ARN-VALUE pelo ARN e AccountID da função do Lamba pelo ID da sua conta da AWS.

  3. Para garantir que o bucket do S3 seja criado somente após a permissão ser concedida à função do Lambda, adicione o atributo DependsOn:

    S3Bucket:
        Type: AWS::S3::Bucket
        DependsOn:
             - "S3Permission"
        Properties:
         NotificationConfiguration:
           LambdaConfigurations:
            - Function: <<FUNCTION-ARN-VALUE>>
              Event: "s3:ObjectCreated:Put"

Problemas com a configuração de notificação do Amazon SNS

Erro: “O tópico do SNS não existe ou é inválido”

Esse erro ocorre quando um bucket do S3 usa a propriedade TopicConfigurations e o tópico Amazon Simple Notification Service (Amazon SNS) não existe ou não é válido. O formato e o valor do ARN devem corresponder ao ARN do tópico do Amazon SNS.

Execute o comando list-topics da AWS CLI para verificar se o ARN do tópico SNS existe em sua conta:

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

Observação: substitua YOUR-REGION pela sua região e YOUR-TOPIC-ARN-VALUE pelo ARN do tópico do SNS.

Se você não recebeu nenhum registro na saída do comando, o tópico SNS não existe ou não é válido. Crie o tópico do SNS e verifique se o tópico é válido.

Problema com a política de acesso ao tópico do SNS

Se os tópicos configurados na propriedade TopicConfigurations forem válidos, verifique a política de acesso anexada ao tópico do SNS.

Conclua as seguintes etapas:

  1. Execute o comando get-topic-attributes da AWS CLI para verificar a política de acesso anexada ao tópico do SNS:

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

    Observação: substitua YOUR-TOPIC-ARN-VALUE pelo seu ARN e YOUR-REGION pela sua região.

  2. Se a política não tiver acesso ao tópico do SNS, substitua a política pela seguinte:

    {
          "Sid": "S3AccessForNotification",
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "SNS:Publish",
          "Resource": "YOUR-TOPIC-ARN-VALUE"
     }

    Observação: substitua YOUR-TOPIC-ARN-VALUE pelo seu ARN e YOUR-REGION pela sua região.

  3. Crie uma nova pilha ou atualize a pilha existente.

Problema com a política de chaves do AWS KMS associada ao tópico do SNS

Para solucionar esse problema, realize as etapas a seguir:

  1. Execute o comando get-topic-attributes da AWS CLI para verificar a política do AWS Key Management Service (AWS KMS) associada à propriedade NotificationConfiguration:

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

    Observação: substitua YOUR-TOPIC-ARN-VALUE pelo seu ARN e YOUR-REGION pela sua região.

  2. Para verificar as permissões da política, execute o comando get-key-policy da AWS CLI:

    aws kms get-key-policy \
    --key-id YOUR-KMS-KEY-ARN \
    --policy-name default \
    --region YOUR-REGION

    Observação: substitua YOUR-KMS-KEY-ARN pelo seu ARN e YOUR-REGION pela sua região.

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

Problemas com a configuração de notificação do Amazon SQS

Erro: “A fila do SQS não existe”

Esse erro ocorre quando um bucket do S3 usa a propriedade QueueConfigurations e o ARN do Amazon SNS não existe ou não é válido.

Para solucionar esse problema, realize as etapas a seguir:

  1. Execute o comando list-queues da AWS CLI para verificar se a fila do Amazon SQS existe na conta:

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

    Observação: substitua YOUR-SQS-QUEUE-NAME pelo nome da fila do Amazon SQS e YOUR-REGION pela sua região da AWS.

  2. Se a fila do Amazon SQS não existir, crie uma nova fila ou atualize o modelo com uma fila existente.

A política de acesso do Amazon SQS não tem permissão para o serviço S3

Se as filas do Amazon SQS configuradas na propriedade QueueConfigurations forem válidas, verifique as permissões da política de acesso.

Conclua as seguintes etapas:

  1. Execute o comando list-queues da AWS CLI para verificar a política de filas do Amazon SQS:

    aws sqs list-queues --queue-name-prefix YOUR-SQS-QUEUE-NAME --region YOUR-REGION
    
    aws sqs get-queue-attributes \
    --queue-url YOUR-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names Policy

    Observação: substitua YOUR-SQS-QUEUE-NAME, YOUR-REGION e YOUR-QUEUE-URL pelos valores do Amazon SQS.

  2. Se a política não tiver acesso ao Amazon S3, substitua a política pela seguinte:

    {
          "Sid": "S3AccessForNotification",
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "SQS:SendMessage",
          "Resource": "YOUR-SQS-QUEUE-ARN-VALUE"
     }

    Observação: substitua YOUR-SQS-QUEUE-ARN-VALUE pelo seu ARN.

  3. Crie ou atualize a pilha.

Problema com a política de chaves do AWS KMS associada à fila do SQS

  1. Execute o comando list-queues da AWS CLI para obter a chave do AWS KMS que está configurada na propriedade NotificationConfiguration:

    aws sqs list-queues --queue-name-prefix YOUR-SQS-QUEUE-NAME --region YOUR-REGION
    
    aws sqs get-queue-attributes \
    --queue-url YOUR-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names KmsMasterKeyId

    Observação: substitua YOUR-SQS-QUEUE-NAME, YOUR-REGION e YOUR-QUEUE-URL pelos valores do Amazon SQS.

  2. Execute o comando get-key-policy da AWS CLI para verificar se o serviço Amazon S3 tem acesso à chave:

    aws kms get-key-policy \
    --key-id YOUR-KMS-KEY-ARN \
    --policy-name default \
    --region YOUR-REGION

    Observação: substitua YOUR-KMS-KEY-ARN pelo seu ARN e YOUR-REGION pela sua região.

  3. Na saída, certifique-se de que a política de chaves do AWS KMS tenha permissão para permitir que o Amazon S3 use a chave:

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

    Observação: substitua YOUR-KMS-KEY-ARN pelo ARN da chave do AWS KMS.

Dependência circular entre recursos

Devido à forma como o AWS CloudFormation lida com a ordenação de dependências, as notificações de eventos do Amazon S3 são definidas como um atributo do bucket do S3. Essas notificações são estabelecidas quando o recurso de bucket do S3 é criado.

Para evitar um erro, você deve criar recursos na seguinte ordem:

  • Crie o tópico do SNS, porque o bucket do S3 faz referência a esse tópico.
  • Crie o bucket do S3, porque a política de tópicos do SNS faz referência ao bucket do S3 e ao tópico do SNS.

Antes de inscrever um tópico do SNS nas notificações de eventos do S3, você deve especificar AWS::SNS::TopicPolicy com as permissões corretas. Essa política de tópico deve existir antes de você criar a assinatura.

Para evitar o erro “Não é possível validar as seguintes configurações de destino”, use um dos seguintes métodos:

  • Especificar um valor para BucketName em seu modelo do AWS CloudFormation.
  • Criar uma pilha e, em seguida, executar uma atualização da pilha.

Especificar um valor para BucketName em seu modelo do AWS CloudFormation

Especifique um valor para a propriedade BucketName no recurso S3Bucket do seu modelo do CloudFormation para usar um nome estático para seu bucket do S3. Você não precisa mais incluir {"Ref": "paramBucketName"} na política de tópicos do SNS. O nome estático do valor do nome do bucket do S3 remove a dependência intrínseca entre a política de tópicos do SNS e o Amazon S3.

O exemplo de modelo do AWS CloudFormation a seguir especifica um valor codificado (-Bucket-Name-) para a propriedade 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": {
                    "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"
            }
          ]
        }
      }
    }
  }
}

Observação: substitua -Bucket-Name- pelo nome do seu bucket. O recurso S3Bucket tem um atributo DependsOn explícito definido como SNSTopicPolicy. O atributo especifica que o modelo cria o recurso SNStopicPolicy antes do recurso S3Bucket.

Para usar o mesmo modelo do AWS CloudFormation para buckets S3 com nomes diferentes, defina um parâmetro para o nome do bucket. Ao passar o nome do bucket como parâmetro durante a criação da pilha, você pode usar o mesmo modelo para diferentes nomes de bucket.

Para usar o modelo de exemplo a seguir, você deve passar o nome do bucket como parâmetro paramBucketName durante a criação da pilha:

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

Crie uma pilha e, em seguida, atualize-a

Primeiro, crie a pilha, mas não especifique a propriedade NotificationConfiguration no recurso S3Bucket. Em seguida, atualize a pilha para adicionar a notificação de evento do S3.

  1. Crie todos os recursos, incluindo a política de tópicos do SNS:

    {
      "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. Atualize a pilha para adicionar a notificação de evento do S3:

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

Informações relacionadas

Conceder permissões para publicar mensagens de notificação de eventos em um destino

Como evito o erro “Não é possível validar as seguintes configurações de destino” com as notificações de eventos do Lambda no CloudFormation?

Atualizações da pilha do AWS CloudFormation

Configuração de notificações do Amazon SNS

AWS OFICIAL
AWS OFICIALAtualizada há 7 meses