¿Cómo soluciono el error «Unable to validate the following destination configurations» en CloudFormation?

11 minutos de lectura
0

Me suscribí a un servicio de AWS y recibí el error «Unable to validate the following destination configurations» en AWS CloudFormation.

Resolución

Para resolver el mensaje de error, siga estos pasos de solución de problemas para la configuración.

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Errores de solución de problemas de la AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Problemas con la configuración de notificaciones de Lambda

Error: «notification lambda function not exist»

Este error se produce al crear o actualizar un bucket de Amazon Simple Storage Service (Amazon S3) que usa la propiedad LambdaConfigurations de AWS Lambda. Si el ARN de la función Lambda que está configurado en la plantilla de CloudFormation no existe o no es válido, es posible que reciba este mensaje de error.

Para comprobar si existe la propiedad LambdaConfigurations, ejecute el siguiente comando de la CLI de AWS:

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

Nota: Sustituya YOUR-FUNCTION-ARN-VALUE por el ARN de la función Lambda.

Si recibe un error en la salida del comando, significa que el ARN de la función Lambda no es válido o no existe. Actualice la plantilla para incluir el ARN correcto. A continuación, cree una pila nueva o actualice la pila existente.

La función Lambda no tiene permiso para invocar Amazon S3

Error: «The resource you requested does not exist»

Si recibe este error, significa que no hay ningún permiso asociado a la función Lambda.

Para resolver este problema, siga estos pasos:

  1. Ejecute el siguiente comando para comprobar los permisos de la función Lambda:

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

    **Nota:**Sustituya **YOUR-FUNCTION-ARN-VALUE ** por el ARN de la función Lambda y YOUR-REGION por su región de AWS.

  2. Adjunte el siguiente permiso a la plantilla de CloudFormation para permitir que la función Lambda invoque Amazon S3:

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

    **Nota:**Sustituya YOUR-FUNCTION-ARN-VALUE por el ARN de la función Lamba y el AccountID por el ID de su cuenta de AWS.

  3. Para asegurarse de que el bucket de S3 solo se cree después de conceder el permiso a la función Lambda, añada el atributo DependsOn:

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

Problemas con la configuración de notificaciones de Amazon SNS

Error: «SNS Topic does not exist or invalid»

Este error se produce cuando un bucket de S3 usa la propiedad TopicConfigurations y el tema de Amazon Simple Notification Service (Amazon SNS) no existe o no es válido. El formato y el valor del ARN deben coincidir con el ARN del tema de Amazon SNS.

Ejecute el comando list-topics de la CLI de AWS para comprobar que el ARN del tema de SNS existe en su cuenta:

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

**Nota:**Sustituya YOUR-REGION por su región y YOUR-TOPIC-ARN-VALUE por el ARN del tema de SNS.

Si no recibió ningún registro en el resultado del comando, significa que el tema SNS no existe o no es válido. Cree el tema de SNS y asegúrese de que el tema sea válido.

Problema con la política de acceso a temas de SNS

Si los temas configurados en la propiedad TopicConfigurations son válidos, compruebe la política de acceso adjunta al tema SNS.

Siga estos pasos:

  1. Ejecute el comando get-topic-attributes de la CLI de AWS para comprobar la política de acceso adjunta al tema de SNS:

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

    **Nota:**Sustituya YOUR-TOPIC-ARN-VALUE por su ARN y YOUR-REGION por su región.

  2. Si la política no tiene acceso al tema de SNS, reemplácela por la siguiente:

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

    **Nota:**Sustituya YOUR-TOPIC-ARN-VALUE por su ARN y YOUR-REGION por su región.

  3. Cree una pila nueva o actualice la pila existente.

Problema con la política de claves de AWS KMS asociada al tema SNS

Para resolver este problema, siga estos pasos:

  1. Ejecute el comando get-topic-attributes de la CLI de AWS para comprobar la política de AWS Key Management Service (AWS KMS) asociada a la propiedad NotificationConfiguration:

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

    **Nota:**Sustituya YOUR-TOPIC-ARN-VALUE por su ARN y YOUR-REGION por su región.

  2. Para comprobar los permisos de la política, ejecute el comando get-key-policy de la CLI de AWS:

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

    **Nota:**Sustituya YOUR-KMS-KEY-ARN por su ARN y YOUR-REGION por su región.

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

Problemas con la configuración de notificaciones de Amazon SQS

Error: «SQS queue does not exist»

Este error se produce cuando un bucket de S3 usa la propiedad QueueConfigurations y el ARN de Amazon SNS no existe o no es válido.

Para resolver este problema, siga estos pasos:

  1. Ejecute el comando list-queues de la CLI de AWS para comprobar que la cola de Amazon SQS existe en la cuenta:

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

    **Nota:**Sustituya YOUR-SQS-QUEUE-NAME por el nombre de la cola de Amazon SQS y YOUR-REGION por su región de AWS.

  2. Si la cola de Amazon SQS no existe, cree una nueva cola o actualice la plantilla con una cola existente.

La política de acceso de Amazon SQS no tiene permiso para el servicio S3

Si las colas de Amazon SQS configuradas en la propiedad QueueConfigurations son válidas, compruebe los permisos de la política de acceso.

Siga estos pasos:

  1. Ejecute el comando list-queues de la CLI de AWS para comprobar la política de colas de 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

    **Nota:**Sustituya YOUR-SQS-QUEUE-NAME, YOUR-REGION y YOUR-QUEUE-URL por sus valores de Amazon SQS.

  2. Si la política no tiene acceso a Amazon S3, sustitúyala por la siguiente:

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

    **Nota:**Sustituya YOUR-SQS-QUEUE-ARN-VALUE por su ARN.

  3. Crea o actualiza la pila.

Problema con la política de claves de AWS KMS asociada a la cola de SQS

  1. Ejecute el comando list-queues de la CLI de AWS para obtener la clave de AWS KMS que está configurada en la propiedad 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

    **Nota:**Sustituya YOUR-SQS-QUEUE-NAME, YOUR-REGION y YOUR-QUEUE-URL por sus valores de Amazon SQS.

  2. Ejecute el comando get-key-policy de la CLI de AWS para comprobar que el servicio Amazon S3 tiene acceso a la clave:

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

    **Nota:**Sustituya YOUR-KMS-KEY-ARN por su ARN y YOUR-REGION por su región.

  3. En el resultado, asegúrese de que la política de claves de AWS KMS tenga permiso para permitir que Amazon S3 utilice la clave:

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

    **Nota:**Sustituya YOUR-KMS-KEY-ARN por el ARN de la clave de AWS KMS.

Dependencia circular entre recursos

Debido a la forma en que CloudFormation gestiona el orden de dependencias, las notificaciones de eventos de Amazon S3 se definen como un atributo del bucket de S3. Estas notificaciones se establecen cuando crea el recurso de bucket de S3.

Para evitar un error, debe crear los recursos en el siguiente orden:

  • Creación del tema de SNS, ya que el bucket de S3 hace referencia al tema de SNS.
  • Creación del bucket de S3, ya que la política de temas de SNS hace referencia tanto al bucket de S3 como al tema de SNS.

Antes de suscribir un tema de SNS a las notificaciones de eventos de S3, debe especificar AWS::SNS::TopicPolicy con los permisos correctos. Esa política de temas debe existir antes de crear la suscripción.

Pruebe una de las siguientes estrategias para evitar el error «Unable to validate the following destination configurations»:

  • Especificar un valor para BucketName en la plantilla de CloudFormation.
  • Crear una pila y, a continuación, realizar una actualización de la pila.

Especificar un valor para BucketName en la plantilla de AWS CloudFormation

Utilice un nombre estático para el bucket de S3 especificando un valor para la propiedad BucketName en el recurso S3Bucket de la plantilla de AWS CloudFormation. Así se elimina la necesidad de incluir {"Ref": "paramBucketName"} en la política de temas de SNS. El nombre estático del valor del nombre del bucket de S3 elimina la dependencia intrínseca entre la política temática de SNS y Amazon S3.

El siguiente ejemplo de plantilla de CloudFormation especifica un valor codificado de forma rígida (-Bucket-Name-) para la propiedad 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"
            }
          ]
        }
      }
    }
  }
}

Nota: Sustituya -Bucket-Name- por el nombre de su bucket. El recurso S3Bucket tiene un atributo DependsOn explícito que se establece en SNSTopicPolicy. Este atributo especifica que la plantilla crea el recurso SNSTopicPolicy antes que el recurso S3Bucket.

Para usar la misma plantilla de CloudFormation para buckets de S3 con nombres diferentes, defina un parámetro para el nombre del bucket. Cuando pasa el nombre del bucket como parámetro durante la creación de la pila, puede usar la misma plantilla para diferentes nombres de bucket.

Para usar la siguiente plantilla de ejemplo, debe pasar el nombre del bucket como parámetro paramBucketName durante la creación de la pila:

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

Cree una pila y, a continuación, actualice la pila

Primero, cree la pila, pero no especifique la propiedad NotificationConfiguration en el recurso S3Bucket. Después, actualice la pila para añadir la notificación de eventos de S3.

  1. Cree todos los recursos, incluida la política de temas de 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. Actualice la pila para añadir la notificación de eventos de 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"
                }
              ]
            }
          }
        }
      }
    }

Información relacionada

Conceder permisos para publicar mensajes de notificación de eventos en un destino

¿Cómo puedo evitar el error «Unable to validate the following destination configurations» con las notificaciones de eventos de Lambda en CloudFormation?

Actualizaciones de pila de AWS CloudFormation

Configuración de notificaciones de Amazon SNS

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 6 meses