Como faço para corrigir o erro “Não é possível validar as seguintes configurações de destino” no AWS CloudFormation?
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:
-
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.
-
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.
-
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:
-
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.
-
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.
-
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:
-
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.
-
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:
-
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.
-
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:
-
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.
-
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.
-
Crie ou atualize a pilha.
Problema com a política de chaves do AWS KMS associada à fila do SQS
-
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.
-
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.
-
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.
-
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" } } } }
-
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
Vídeos relacionados
Conteúdo relevante
- AWS OFICIALAtualizada há um mês
- AWS OFICIALAtualizada há um ano