我创建了一个新的S3存储桶,并将所有默认设置保留在原位。我正在尝试使用PutObject方法从lambda函数将对象写入存储桶。无论我采用何种策略或执行何种操作,都会对操作执行“拒绝访问”操作, 除非我编辑存储桶ACL并将其完全公开。显然,这不是一个很好的解决方案。我真的不知道发生了什么:我知道我之前没有做任何特殊设置就已经做到了。 Lambda和S3存储桶都在同一帐户中,分配给lambda的角色已附加AWSLambdaFullAccess策略。我快疯了,任何帮助将不胜感激。
答案 0 :(得分:1)
根据您分配给Lambda函数的权限集, AWSLambdaFullAccess 不会授予您对S3存储桶的访问权限。除了这些权限之外,您还需要允许访问S3。如果仅 PutObject 是您所需的权限,则可以将以下策略添加到Lambda角色。请记住,可以将这些权限进一步锁定到资源级别,但是您可以从以下开始:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1546988882992",
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
您可以根据需要添加或删除更多S3权限。
答案 1 :(得分:1)
不幸的是,"s3:PutObject"
不足以使其运行-您将不断收到403 Access denied
错误。
您应该将"s3:PutObjectAcl"
策略添加到Lambda角色中。
答案 2 :(得分:0)
我遇到了这个确切的问题。
解决方案
我解决该问题的方法是使用以下政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PetsS3Write",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<bucket name or wildcard if you want all buckets writable>/*"
}
]
}
评论
如果您在IAM控制台中查看了实际策略,您会发现这将使lambda对存储桶和任何对象具有写权限。这是IAM视图中资源标题下的样子:
BucketName | string like | auth0-test-hucket, ObjectPath | string like | All
。
最后没有通配符,它将无法将任何对象写入存储桶,因为它无法命名该对象,因为没有权限执行此操作。如果您编辑该策略,则会看到您可以指定Bucket name
和Object name
。
所以,我假设通配符可以替换为字符串,并且它将限制对该特定字符串的写访问。就像将通配符替换为“ oneObject”一样,您将只能在存储区中创建一个名为“ oneObject”的对象。我没有尝试过,但是似乎遵循上述规则。
答案 3 :(得分:0)
您应该更改 s3 存储桶的策略。 所以你可以使用下面的代码。
iamRoleStatements:
- Effect: 'Allow'
Action:
- 's3:PutObject'
- 's3:GetObject'
Resource: "arn:aws:s3:::*/*"
- Effect: 'Allow'
Action:
- 's3:ListBucket'
Resource: "arn:aws:s3:::*"
注意:您应该将 s3:PutObjecct
置于 Action 中。
希望对您有所帮助。