我有一个现有的S3存储桶my-bucket
。
我正在编写一个新的cloudformation模板文件,该文件创建了一些与my-bucket
进行交互的新AWS资源。现在,我的业务用例要求我从cloudformation模板文件中的my-bucket
的存储桶策略中添加新的权限声明。
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
问题是存储桶已经具有以下存储桶策略,该策略是其他人在过去某个时刻通过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/*"
}
]
}
所以我想我唯一的选择是更新现有的存储桶策略,以进一步适应我的新策略声明。问题是:如何通过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
答案 0 :(得分:3)
遗憾的是,您无法更新不受CloudFormation管理的现有策略。
您唯一可以做的就是通过重新创建CloudFormation在存储桶中替换策略。
此外,现有存储段策略无法导入到CloudFormation中。原因是importing不支持Server Sudo PPP Sambacry Specter_Meltdown
ajhn001 yes yes no yes
ajhg002 yes yes no no
的资源。
编辑:基于@JeremyThompson
我已验证使用AWS::S3::BucketPolicy
。
为此,我使用了自己的存储桶和策略。两者都是使用AWS控制台在CloudFormation之外创建的。
然后,我用UpdateReplacePolicy: Retain
创建了一个CFN模板。模板部署失败,带有或不带有AWS::S3::BucketPolicy
的错误消息:
UpdateReplacePolicy: Retain
这意味着您不能替换现有的存储桶策略。必须在CloudFormation中重新创建该策略。
答案 1 :(得分:1)
您还可以创建一个 CustomResource,在其中实施用于更新现有存储桶策略的逻辑。一定要实现所有资源事件的处理:创建、更新、删除。
例如,这是在 S3 中创建文件夹的实现: https://aws.amazon.com/premiumsupport/knowledge-center/cloudformation-s3-custom-resources/