es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear un bucket de S3 que envíe notificaciones a un tema de SNS.

Estoy tratando de crear un bucket de S3 que envíe una notificación a un tema de SNS cada vez que se deposita un objeto en el bucket de S3. Mi bucket de S3 se llama foo-bucket y mi tema de SNS se llama foo-topic. Sé cómo configurar esto en la consola de AWS, pero tengo problemas al intentar hacerlo a través de CloudFormation.

Este es el código que tengo actualmente:

Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: foo-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:
      BucketName: foo-bucket 
      AccessControl: BucketOwnerFullControl
      NotificationConfiguration:
        TopicConfigurations:
        - Topic:
            Ref: SNSTopic
          Event: s3:ObjectCreated:Put

Intento implementar lo anterior y CloudFormation hace un rollback debido al siguiente error:

No se puede validar las siguientes configuraciones de destino (Servicio: Amazon S3; Código de estado: 400; Código de error: InvalidArgument; ID de solicitud: fooooo; ID de solicitud extendido de S3: foooid; Proxy: null)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el error, debes cambiar la propiedad Resource en SNSTopicPolicy a SNSTopic en lugar de S3Bucket. Además, debes agregar una propiedad DependsOn a S3Bucket para garantizar que el bucket de S3 se cree primero antes de que se utilice en SNSTopicPolicy. El código corregido de CloudFormation debería verse así:

    Resources:
      SNSTopic:
        Type: AWS::SNS::Topic
        Properties:
          TopicName: foo-topic
      SNSTopicPolicy:
        Type: AWS::SNS::TopicPolicy
        DependsOn: S3Bucket
        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:
          BucketName: foo-bucket
          AccessControl: BucketOwnerFullControl
          NotificationConfiguration:
            TopicConfigurations:
              - Topic:
                  Ref: SNSTopic
                Event: s3:ObjectCreated:Put
    

    Después de realizar estos cambios, deberías poder implementar con éxito la plantilla de CloudFormation y recibir notificaciones en tu tema de SNS cada vez que se agregue un objeto en el bucket de S3.

Comments are closed.