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.ArnEl 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.ArnLamentablemente, 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.
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/