¿Cómo se crea un bucket en S3 utilizando CloudFormation?
Para subir imágenes u objetos a S3 impementando un enfoque serverless, lo primero es crear un bucket en S3. Este bucket almacenará los objetos y firmará las URLs. Aunque no se requiere conexión directa con funciones Lambda al principio, es un recurso imprescindible de Amazon Web Services.
Ejemplo de creación del bucket en YAML
Creamos el bucket usando la sintaxis de CloudFormation, que nos permite crear recursos de AWS con YAML o JSON. Aquí mostramos cómo buscar un ejemplo y adaptarlo:
Busque ejemplos de CloudFormation para crear un bucket S3.
Seleccione un ejemplo de bucket de acceso público para ver las imágenes.
Es crucial que los buckets tengan un nombre globalmente único, similar a los nombres de dominio. Puede usar nombres aleatorios para asegurarse de su unicidad, como bucket-serverless-curso-12345.
¿Qué políticas de acceso necesita el bucket?
Un bucket S3 requiere una Policy que establezca si es públicamente accesible. Esto asegura que los objetos que almacene tengan el nivel de acceso adecuado.
Añadir un Bucket Policy
Para definir un Bucket Policy en CloudFormation sigue estos pasos:
Busque un ejemplo de "CloudFormation Bucket Policy".
Adapte el ejemplo, haciendo referencias al bucket creado.
Aquí tiene un fragmento de YAML para añadir a su archivo serverless.yml:
Este ejemplo permite la lectura pública de los objetos del bucket.
¿Cómo desplegar los recursos con Serverless Framework?
Con todos los elementos listos en su archivo YAML, el siguiente paso es desplegarlos usando Serverless Framework.
Pasos para desplegar con Serverless Framework
Execute sls deploy en su terminal.
CloudFormation detectará y aplicará los cambios necesarios para crear el bucket y la política.
Supervise el progreso de la implementación y asegúrese de corregir errores si ocurren.
Este proceso añadirá el bucket y el policy a su stack de CloudFormation, integrando estos recursos con su arquitectura existente.
¿Cómo confirmar que el bucket está bien configurado?
Después de implementar, es vital asegurarse de que el bucket se creó correctamente y es accesible como se esperaba.
Verifique que el bucket es accesible públicamente
Ingrese a AWS, navegue a S3 y busque su bucket.
Suba un archivo, como una imagen.
Consiga la URL pública del archivo subido y verifique el acceso público.
Si el bucket está configurado correctamente, la imagen debería ser accesible públicamente a través del URL proporcionado por Amazon.
Con estos pasos, ya tendrá su bucket de S3 listo para integrarse con una función Lambda que firme las URLs y entregue estas al usuario. Este es un procedimiento fundamental al construir aplicaciones serverless con AWS. ¡Siga explorando estas tecnologías para potenciar sus aplicaciones!
Para los que les marca error al darle deploy, debemos agregar estas propiedades a la definicipon de bucket,
PublicAccessBlockConfiguration:
BlockPublicAcls: false
BlockPublicPolicy: false
Con ésto será suficiente y tendrán su bucket de s3 listo para trabajar 😁
Debido a que los buckets de S3 son recursos globales y unicos, NO puede existir otro bucket con el mismo nombre en todo AWS.
Podemos resolver la definición de su nombre mediante la combinación de Reference Properties In serverless.yml, las funciones intrinsecas de AWS Cloudformation, en este caso la Fn::Sub, y por ultimo los Pseudo Parameters de AWS Clouformation, en este caso el AWS::AccountId.
De esta manera tenemos un nombre unico para nuestro bucket!
Hola!
Los recursos de Dynamo, S3 y S3 policy no sería mejor crearlos en un stack diferente? Me pregunto esto por temas de acoplamiento al momento de quizás solo editar una propiedad por ejemplo en Dynamo.
Gracias!
no necesariamente, muchas veces es mejor practica tener todo lo relacionado a la misma aplicacion en un mismo stack de cloudformation, asi es mas facil mantener multiples aplicaciones, sin embargo tampoco es bloqueante hacerlo separado y asociarlos mediante arn o nombre de recursos, en conclusion depente de como tu definas tu flujo de trabajo con la iac
Saludos, estoy siguiendo los pasos del video, pero me da este error:
Error:
CREATE_FAILED: S3Bucket (AWS::S3::Bucket)
Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting (Service: Amazon S3; Status Code: 400; Error Code: InvalidBucketAclWithObjectOwnership; Request ID: 0YAJY3Y4SGDMEVRC; S3 Extended Request ID: zThsaGqwEgWV+aB35SwdFFrcLyDN0Lb2EYPJPgXo3XFBCcQLuHcGRj6cY6gj8JfEvxzSSt32Eq8=; Proxy: null)
Hola Alvaro, veo un status code 400, parece que estamos haciendo referencia a un bucket sobre el cual no tenemos acceso. Puedes porfa dejarnos tu repo o codigo de ejemplo aca para darle un ojo.
✅
Es importante utilizar nombres únicos para los buckets S3, ya que son recursos globales y únicos en AWS. Una técnica útil para esto es emplear Fn::Sub y AWS::AccountId en CloudFormation, lo que asegura nombres únicos.
Además, para seguir las mejores prácticas de seguridad, limita los permisos de IAM roles para DynamoDB y S3. Esto incluye acciones específicas como 'GetItem', 'PutItem', y 'GetObject', entre otras. Finalmente, considera si es mejor crear recursos como DynamoDB y S3 en stacks separados según tu flujo de trabajo y la administración de la infraestructura como código.
A la fecha lo que me funciona es: (Me salía errores de al crear Bucket, BucketPolicy)