Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

471
Views
AWS: ¿Cómo actualizar una política de depósito S3 existente a través de CloudFormation?

Tengo un depósito de S3 my-bucket existente.

Estoy escribiendo un nuevo archivo de plantilla de CloudFormation que crea un nuevo recurso de AWS que interactúa con my-bucket . Ahora, mi caso de uso comercial requiere que agregue una nueva declaración de permiso a la política de depósito para my-bucket desde el archivo de plantilla de CloudFormation .

 SourceBucketBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: my-bucket PolicyDocument: Statement: - Effect: "Allow" Action: - 's3:PutBucketNotificationConfiguration' Resource: "arn:aws:s3:::my-bucket" Principal: AWS: !GetAtt MyLambdaExecutionRole.Arn

El problema es que el depósito ya tiene la siguiente política de depósito que otra persona agregó manualmente a través de la consola de AWS en algún momento del pasado. Es una política de depósito importante desde una perspectiva comercial, por lo que no puedo deshacerme de ella:

 { "Version": "2012-10-17", "Id": "S3-Policy", "Statement": [ { "Sid": "DataCraft-012345678901-S3-datacraft", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012345678901:user/datacraft" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-bucket/*" } ] }

Así que supongo que mi única opción es actualizar la política de depósito existente para acomodar adicionalmente mi nueva declaración de política. La pregunta es: ¿cómo puedo hacer eso a través del archivo de plantilla de CloudFormation?

EDITAR: para aquellos interesados, finalmente resolví el problema escribiendo una AWS::IAM::Policy en lugar de AWS::S3::BucketPolicy :

 SourceBucketNotificationConfigurationPolicy: Type: AWS::IAM::Policy Properties: PolicyDocument: Statement: - Action: s3:PutBucketNotification Effect: Allow Resource: "arn:aws:s3:::my-bucket" Version: '2012-10-17' PolicyName: BucketNotificationsRolePolicy Roles: - Ref: MyLambdaExecutionRole.Arn
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Lamentablemente, no puede actualizar una política existente que no esté administrada por CloudFormation.

Lo único que puede hacer es reemplazar la política en el depósito usando CloudFormation al volver a crearla.

Además, las políticas de depósito existentes no se pueden importar a CloudFormation. El motivo es que AWS::S3::BucketPolicy no es un recurso admitido para importar archivos .

Editar: Basado en el comentario de @JeremyThompson

Verifiqué el uso de UpdateReplacePolicy: Retain .

Para eso usé mi propio cubo y con política. Ambos se crearon fuera de CloudFormation, utilizando la consola de AWS.

Luego, creé una plantilla CFN con AWS::S3::BucketPolicy . La implementación de la plantilla falló , con o sin UpdateReplacePolicy: Retain con mensaje de error:

 The bucket policy already exists on bucket <bucket-name>.

Esto significa que no puede reemplazar la política de depósito existente. La política debe volver a crearse en CloudFormation.

over 4 years ago · Santiago Trujillo Report

0

También puede crear un CustomResource , donde implementa la lógica para actualizar una política de depósito existente. Asegúrese de implementar el manejo de todos los eventos de recursos: Crear, Actualizar, Eliminar.

Por ejemplo, aquí hay una implementación para crear carpetas en S3: https://aws.amazon.com/premiumsupport/knowledge-center/cloudformation-s3-custom-resources/

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!