配置S3策略时出现MalformedPolicy: Policy has invalid action错误的原因?
报错根本原因
你把Kinesis服务专属的操作声明写到了S3桶策略中,S3桶策略仅支持识别s3:*格式的S3服务相关操作,你添加的kinesis:DescribeStream、kinesis:GetShardIterator、kinesis:GetRecords、kinesis:ListShards都属于Kinesis数据流服务的专属操作,S3无法识别这类非S3操作,因此直接返回Policy has invalid action的格式错误。
核心混淆点
官方文档给出的完整权限策略是Kinesis Data Firehose绑定的IAM服务角色的权限策略,并非用于S3桶的资源策略,两类策略的适用范围完全不同:
- Firehose的IAM角色权限:需要覆盖所有关联服务的操作权限,包括S3、Kinesis数据流、KMS、CloudWatch Logs、Lambda等,这部分权限直接附加给Firehose使用的IAM角色即可,不需要写到S3桶策略里。
- S3桶策略:仅需要开放Firehose角色对当前桶的S3操作权限,不需要包含其他服务的操作声明。
正确配置方案
- 先为Firehose创建专属的IAM服务角色,将官方给出的全量权限策略附加到该角色上,替换策略中所有区域、账号ID、资源名占位符为你的实际资源值。
- S3桶策略仅保留S3相关的权限声明即可,参考配置如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${account_id}:role/你的Firehose服务角色名称" }, "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::你的S3桶名", "arn:aws:s3:::你的S3桶名/*" ] } ] }
如果你不是当前S3桶的所有者,还需要在Action列表中额外添加s3:PutObjectAcl,给桶所有者开放投递对象的完全访问权限。
内容的提问来源于stack exchange,提问作者johncosta
相关产品推荐
相关产品推荐

