Amazon web services AWS:如何通过CloudFormation更新现有的S3存储桶策略?
我有一个现有的S3 bucketAmazon web services AWS:如何通过CloudFormation更新现有的S3存储桶策略?,amazon-web-services,amazon-s3,amazon-cloudformation,Amazon Web Services,Amazon S3,Amazon Cloudformation,我有一个现有的S3 bucket我的bucket 我正在编写一个新的cloudformation模板文件,它创建了一些新的AWS资源,这些资源与我的bucket交互。现在,我的业务用例要求我从cloudformation模板文件中为my bucket的bucket策略添加新的权限语句 问题是该bucket已经具有以下bucket策略,这些策略是由其他人在过去某个时候通过AWS控制台手动添加的。从商业角度来看,这是一项重要的桶政策,因此我无法摆脱它: { "Version&quo
我的bucket
我正在编写一个新的cloudformation模板文件,它创建了一些新的AWS资源,这些资源与我的bucket
交互。现在,我的业务用例要求我从cloudformation模板文件中为my bucket
的bucket策略添加新的权限语句
问题是该bucket已经具有以下bucket策略,这些策略是由其他人在过去某个时候通过AWS控制台手动添加的。从商业角度来看,这是一项重要的桶政策,因此我无法摆脱它:
{
"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/*"
}
]
}
因此,我想我唯一的选择是更新现有的bucket策略,以适应新的策略声明。问题是:如何通过cloudformation模板文件实现这一点
编辑:对于那些感兴趣的人,我最终通过编写一个AWS::IAM::Policy
而不是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
遗憾的是,您无法更新未由CloudFormation管理的现有策略 您唯一能做的就是使用CloudFormation通过重新创建策略来替换bucket中的策略 此外,现有的bucket策略不能导入到CloudFormation中。原因是资源不支持
AWS::S3::BucketPolicy
编辑:基于@Jeremythonpson
我验证了UpdateReplacePolicy:Retain
的使用
为此,我使用了我自己的桶和政策。两者都是在CloudFormation之外使用AWS控制台创建的
然后,我用AWS::S3::BucketPolicy创建了一个CFN模板。模板部署失败,有或没有UpdateReplacePolicy:Retain
,并显示错误消息:
The bucket policy already exists on bucket <bucket-name>.
bucket上已存在bucket策略。
这意味着您不能替换现有的bucket策略。必须在CloudFormation中重新创建策略。真的吗?如果您设置了
UpdateReplacePolicy:Retain
,那么您不能安全地替换S3存储桶策略吗@我的理解是OP希望添加或修改不受CloudFormation控制的现有策略。我是否误解了这个问题?我看着这个问题,认为这是可以做到的:@jeremythonpson我将使用我自己的桶和策略来再次检查它。现在我可以删除答案,直到那时。谢谢你让我知道:u)
The bucket policy already exists on bucket <bucket-name>.