Saltar al contenido

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

13 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 error Unable to validate, toma las medidas de solución de problemas para tu configuración.

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

Problemas con la configuración de notificaciones de Lambda

El ARN de la función de Lambda no existe o no es válido

Si tu bucket de Amazon Simple Storage Service (Amazon S3) usa la propiedad LambdaConfigurations de AWS Lambda, es posible que recibas el error lambda function does not exist. Este error se produce si el ARN configurado para la función de Lambda en la plantilla de CloudFormation no existe o no es válido.

Para comprobar si la función de Lambda existe, ejecuta el comando get-function:

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

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

Si recibes un error en la salida del comando, significa que el ARN de la función no es válido o no existe. Actualiza la plantilla para incluir el ARN correcto. A continuación, crea una pila nueva con la plantilla actualizada o actualiza la pila existente.

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

Si recibes el error resource you requested does not exist, significa que a tu función de Lambda le falta el permiso necesario. Para resolver este problema, sigue estos pasos:

  1. Para comprobar los permisos de la función de Lambda, ejecuta el comando get-policy:
    aws lambda get-policy
    --function-name YOUR-FUNCTION-ARN-VALUE
    --region YOUR-REGION
    Nota: Sustituye ** FUNCTION-ARN-VALUE** por el ARN de la función YOUR-REGION por tu región de AWS.
  2. Para permitir que la función de Lambda invoque Amazon S3, actualiza la plantilla de CloudFormation para adjuntar los siguientes permisos:
    S3Permission:    
      Type: AWS::Lambda::Permission
      Properties:
        FunctionName: YOUR-FUNCTION-ARN-VALUE
        Action: lambda:InvokeFunction
        Principal: s3.amazonaws.com
        SourceAccount: !Ref 'AWS::AccountId'
    Nota: Sustituye FUNCTION-ARN-VALUE por el ARN de la función y AccountID por la cuenta de AWS propietaria de la función. Puedes usar el pseudoparámetro AWS::AccountID para reemplazar automáticamente el ID de la cuenta en el que CloudFormation crea la pila.
  3. Para asegurarte de que CloudFormation cree el bucket de S3 solo después de que la función de Lambda tenga los permisos necesarios, agrega el atributo DependsOn:
    S3Bucket:    
      Type: AWS::S3::Bucket
      DependsOn: "S3Permission"
      Properties:
        NotificationConfiguration:
          LambdaConfigurations:
            - Function: YOUR-FUNCTION-ARN-VALUE
                Event: "s3:ObjectCreated:Put"
    
    Nota: Sustituye FUNCTION-ARN-VALUE por el ARN de la función.

Problemas con la configuración de notificaciones de Amazon SNS

El ARN de Amazon SNS no existe o no es válido

Si tu bucket de S3 usa la propiedad TopicConfigurations, es posible que recibas el error Unable to validate the following destination configurations. Este error se produce cuando 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 SNS.

Para comprobar si el ARN del tema de SNS existe en tu cuenta, ejecuta el comando list-topics:

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

Nota: Sustituye YOUR-REGION por tu región e YOUR-TOPIC-ARN-VALUE por el ARN del tema.

Si no recibes ningún registro en el resultado del comando, significa que el tema de SNS no existe o no es válido. Para resolver este problema, crea el tema de SNS. Asegúrate de proporcionar un ARN de tema válido en la propiedad TopicConfigurations.

El tema de SNS no tiene una política de acceso obligatoria

Para verificar que el tema de SNS tenga la política de acceso necesaria, completa los siguientes pasos:

  1. Para comprobar la política de acceso adjunta al tema de SNS, ejecuta el comando get-topic-attributes:
    aws sns get-topic-attributes \
    --topic-arn YOUR-TOPIC-ARN-VALUE \
    --region YOUR-REGION \
    --query 'Attributes.Policy'
    Nota: Sustituye YOUR-TOPIC-ARN-VALUE por el ARN del tema y YOUR-REGION por la región.
  2. La política de acceso debe permitir que el servicio de Amazon S3 publique en el tema. Si la política no tiene esos permisos, edita la política de acceso del tema para incluir los siguientes permisos:
    {     
          "Sid": "S3AccessForNotification",      
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "SNS:Publish",
          "Resource": "YOUR-TOPIC-ARN-VALUE"
    }
    Nota: Sustituye YOUR-TOPIC-ARN-VALUE por el ARN del tema.
  3. Comprueba que ahora puedas crear una pila nueva o actualizar la pila existente.

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

La política de AWS Key Management Service (AWS KMS) debe permitir a Amazon S3 acceder a la clave de AWS KMS. Para ver la configuración de cifrado y la política mínima requerida, sigue estos pasos:

Para comprobar si el tema de SNS está cifrado con una clave de AWS KMS, ejecuta el comando get-topic-attributes:

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

Nota: Sustituye YOUR-TOPIC-ARN-VALUE por el ARN del tema y YOUR-REGION por la región. Si el tema de SNS está cifrado, el resultado del comando muestra el ARN de la clave de AWS KMS.

Para comprobar la política de claves de AWS KMS, ejecuta el 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: Sustituye YOUR-KMS-KEY-ARN por el ARN de la clave de AWS KMS e YOUR-REGION por la región. Para una mejor legibilidad, se recomienda utilizar el comando jq para mostrar el contenido de la política en formato JSON. Para obtener más información, consulta ./jq en el sitio web de jq.

El siguiente ejemplo de política muestra la política de claves de AWS KMS mínima requerida:

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

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

Si tu política no tiene los permisos necesarios, actualiza la política de claves de AWS KMS.

Problemas con la configuración de notificaciones de Amazon SQS

El ARN de Amazon SQS no existe o no es válido

Si tu bucket de S3 usa la propiedad QueueConfigurations, es posible que recibas el error SQS queue does not exist. Este error se produce cuando el ARN de Amazon Simple Queue Service (Amazon SQS) no existe o no es válido.

Para comprobar si la cola de Amazon SQS existe en la cuenta, ejecuta el comando list-queues:

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

Nota: Sustituye YOUR-SQS-QUEUE-NAME por el nombre de la cola de SQS y YOUR-REGION por tu región.

Si la cola de SQS no existe, crea una nueva cola o actualiza la plantilla con una cola existente:

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 cola de SQS no tiene la política de acceso obligatoria

Para comprobar que la cola de SQS tenga la política de acceso obligatoria, puedes utilizar la AWS CLI o la consola de CloudFormation.

Para usar la AWS CLI para verificar la política de acceso de la cola, sigue estos pasos:

  1. Para comprobar la política de la cola de SQS, ejecuta el comando get-queue-attributes:
    aws sqs get-queue-attributes \
    --queue-url YOUR-SQS-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names Policy | jq .
    Nota: Sustituye YOUR-SQS-QUEUE-NAME por el nombre de la cola de SQS, YOUR-REGION por tu región e YOUR-SQS-QUEUE-URL por el URL de la cola. Para una mejor legibilidad, se recomienda utilizar el comando jq para mostrar el contenido de la política en formato JSON. Para obtener más información, consulta ./jq en el sitio web de jq.
  2. Si tu política no tiene acceso a Amazon S3, crea una nueva política de acceso en un archivo 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:**Sustituye YOUR-SQS-QUEUE-ARN por el ARN de la cola.
  3. Para actualizar la política, ejecuta el comando set-queue-attributes:
    aws sqs set-queue-attributes
    --queue-url YOUR-SQS-QUEUE-URL
    --attributes file://sqs-policy.json
    Nota: Sustituye YOUR-SQS-QUEUE-URL por la URL de la cola y sqs-policy.json por el archivo JSON de la política.

Para usar la consola de CloudFormation para verificar la política de acceso de la cola, actualiza la plantilla de CloudFormation para incluir el siguiente recurso:

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: Sustituye YOUR-SQS-QUEUE-URL por la URL de la cola e YOUR-SQS-QUEUE-ARN por el ARN de la cola.

Después de crear o actualizar la política, comprueba que ahora puedas crear una pila nueva o actualizar la pila existente.

Para obtener más información, consulta ¿Qué permisos necesito para acceder a una cola de Amazon SQS? Si sigues teniendo problemas, consulta How do I troubleshoot the Amazon SQS error "Invalid value for the parameter policy"? (¿Cómo puedo solucionar el error de Amazon SQS «Invalid value for the parameter policy»?).

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

Para resolver problemas con la política de claves de AWS KMS, sigue estos pasos:

  1. Para obtener la URL de la cola de SQS, ejecuta el comando list-queues:
    aws sqs list-queues
    --queue-name-prefix YOUR-SQS-QUEUE-NAME
    --region YOUR-REGION
    Nota: Sustituye YOUR-SQS-QUEUE-NAME por el nombre de la cola de SQS y YOUR-REGION por la región.
  2. Para obtener el ID de clave de AWS KMS, ejecuta el comando get-queue-attributes:
    aws sqs get-queue-attributes \
    --queue-url YOUR-SQS-QUEUE-URL \
    --region YOUR-REGION \
    --attribute-names KmsMasterKeyId
    Nota: Sustituye YOUR-SQS-QUEUE-URL por la URL de la cola e YOUR-REGION por la región.
  3. Para obtener el ARN de la clave de AWS KMS, ejecuta el comando describe-key:
    aws kms describe-key --key-id YOUR-KMS-KEY-ID
    Nota: Sustituye YOUR-KMS-KEY-ID por el ID de la clave.
  4. Para ver la política de claves completa, ejecuta el comando get-key-policy:
    aws kms get-key-policy \
    --key-id YOUR-KMS-KEY-ARN \
    --policy-name default \
    --region YOUR-REGION
    Nota: Sustituye YOUR-KMS-KEY-ARN por el ARN de la clave de AWS KMS e YOUR-REGION por la región.
  5. En el resultado, comprueba que la política permita a Amazon S3 usar la clave de AWS KMS. Ejemplos de permisos:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "s3.amazonaws.com"
                },
                "Action": ["kms:GenerateDataKey*", "kms:Decrypt"],
                "Resource": "YOUR-KMS-KEY-ARN"
            }
        ]
    }
    Nota: Sustituye YOUR-KMS-KEY-ARN por el ARN de la clave de AWS KMS.

Si tu política no tiene los permisos necesarios, actualiza la política de claves.

Dependencia circular entre recursos

Importante: Antes de suscribir un tema de SNS a Notificaciones de eventos de S3, debes crear la política AWS::SNS::TopicPolicy con los permisos necesarios. Esa política de temas debe existir antes de crear la suscripción.

Para crear primero la política de temas, debes usar un atributo DependsOn en el recurso AWS::S3::Bucket. Este atributo crea la política de temas antes del bucket. O bien, puedes usar dos operaciones de pila para crear primero todos los recursos y, a continuación, actualizar el recurso S3Bucket para incluir la propiedad NotificationConfiguration. Realiza una de las siguientes acciones.

Especificación de un valor para BucketName en la plantilla de CloudFormation

Utiliza un nombre estático para tu bucket de S3 en la propiedad BucketName del recurso S3Bucket de tu plantilla de CloudFormation. Con un nombre de bucket de S3 estático, se elimina la dependencia intrínseca entre la política de temas de SNS y Amazon S3.

Importante: Los nombres de los buckets de S3 deben ser únicos en todo el mundo.

El siguiente ejemplo de plantilla de CloudFormation especifica un valor de -Bucket-Name- codificado de forma rígida 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: !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: Sustituye -Bucket-Name- por el nombre de tu 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.

Uso de un parámetro para BucketName

Los parámetros te permiten usar la misma plantilla de CloudFormation para buckets de S3 con nombres diferentes. Durante la creación de la pila, puedes establecer un valor para el parámetro paramBucketName. Ejemplo de política:

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: En el ejemplo anterior, el recurso S3Bucket tiene un atributo DependsOn explícito que se establece en SNSTopicPolicy.

Creación y posterior actualización de una pila

Nota: En este método, el recurso S3Bucket no incluye la propiedad BucketName. Como resultado, CloudFormation crea un nombre de bucket único para ti. Para evitar la dependencia circular, no utilices un atributo DependsOn.

En primer lugar, crea la pila sin la propiedad NotificationConfiguration en el recurso S3Bucket. Ejemplo:

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

Agrega la propiedad NotificationConfiguration al recurso S3Bucket y, a continuación, actualiza la pila. Ejemplo:

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

Información relacionada

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

Administrar los recursos de AWS como una sola unidad con pilas de AWS CloudFormation

Configuración de notificaciones de Amazon SNS

OFICIAL DE AWSActualizada hace 2 años