【发布时间】:2019-09-29 00:06:35
【问题描述】:
对于上下文,我正在使用无服务器框架,所以发生了一些事情:
- 使用一些附加策略创建一个角色,一个 lambda 函数将其分配为执行角色。 S3 政策是(列出更多相关政策):
-
ListBucket到桶 ARN 作为资源 -
GetObject,PutObjectDeleteObjet作为以/*为前缀的资源到存储桶 ARN
-
- 我正在使用 Cloudformation 资源语法创建存储桶,并设置了公共读取策略,以便将其用作静态网站主机。
- 我还在 S3 存储桶策略中包含另一个策略语句,我在其中分配写入操作并将执行角色 ARN 设置为委托人。
我收到了以下iamRoleStatements 部分:
- Effect: "Allow"
Action:
- "s3:ListBucket"
Resource:
- Fn::Join:
- ""
- - "arn:aws:s3:::"
- Ref: StaticSiteBucket
- Effect: "Allow"
Action:
- "s3:GetObject"
- "s3:PutObject"
- "s3:DeleteObject"
- "s3:GetObjectVersionTagging"
- "s3:PutObjectVersionTagging"
Resource:
- Fn::Join:
- ""
- - "arn:aws:s3:::"
- Ref: StaticSiteBucket
- "/*"
我实际上可以确认它会为生成的角色生成以下策略:
{
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket-name-here"
],
"Effect": "Allow"
},
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObjectVersionTagging",
"s3:PutObjectVersionTagging"
],
"Resource": [
"arn:aws:s3:::bucket-name-here/*"
],
"Effect": "Allow"
}
有了这个,我运行了 lambda 函数以在该存储桶上执行 putObject。得到一个'Access denied error',所以我想如果存储桶本身需要允许写入怎么办,所以我在存储桶策略中包含了一条写入语句:
StaticSiteBucket:
Type: AWS::S3::Bucket
Properties:
AccessControl: PublicRead
BucketName: ${self:service}-static-site-${self:provider.stage}
WebsiteConfiguration:
IndexDocument: index.html
StaticSiteBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket:
Ref: StaticSiteBucket
PolicyDocument:
Statement:
- Sid: PublicReadGetObject
Effect: Allow
Principal: "*"
Action:
- s3:GetObject
Resource:
Fn::Join: [
"", [
"arn:aws:s3:::",
{
"Ref": "StaticSiteBucket"
},
"/*"
]
]
- Sid: AllowLambdaRoleWrite
Effect: Allow
Action:
- "s3:GetObject"
- "s3:PutObject"
- "s3:DeleteObject"
- "s3:GetObjectVersionTagging"
- "s3:PutObjectVersionTagging"
Principal:
AWS:
- Fn::GetAtt: [ IamRoleLambdaExecution, Arn ]
Resource:
Fn::Join:
- ""
- - "arn:aws:s3:::"
- Ref: StaticSiteBucket
- "/*"
在 S3 存储桶中生成以下策略:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name-here/*"
},
{
"Sid": "AllowLambdaRoleWrite",
"Effect": "Allow",
"Principal": {
"AWS": "<role-arn>"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObjectVersionTagging",
"s3:PutObjectVersionTagging"
],
"Resource": "arn:aws:s3:::bucket-name-here/*"
}
]
}
所以,我尝试了几句话:
- 允许角色有写权限,不走运
- 从存储桶策略将写入权限附加到该角色,没有运气
我错过了什么?
【问题讨论】:
标签: amazon-s3 amazon-cloudformation amazon-iam serverless-framework