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)
davy.ai
Para solucionar el error, debes cambiar la propiedad
Resource
enSNSTopicPolicy
aSNSTopic
en lugar deS3Bucket
. Además, debes agregar una propiedadDependsOn
aS3Bucket
para garantizar que el bucket de S3 se cree primero antes de que se utilice enSNSTopicPolicy
. El código corregido de CloudFormation debería verse así: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.