我有一个AWS Lambda函数,它通过S3资源的URL(即https://s3-eu-west-1.amazonaws.com/bucketname/key).
我在S3 Bucket上添加了一个Bucket策略,允许我的Lambda函数访问S3 Bucket(通过Lambda函数IAM角色)。此桶策略如下所示:
{
"Version": "2012-10-17",
"Id": "Access control to S3 bucket",
"Statement": [
{
"Sid": "Allow Get and List Requests from IAM Role",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123412341234:role/role-name“
},
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::bucket-name”,
"arn:aws:s3:::bucket-name/*"
]
}
]
}
当Lambda函数被触发器“自动”激活时,这一切都很好。但是当我手动(通过AWS控制台)测试Lambda函数时,我得到一个403错误。
如果我将S3桶策略中的主体更改为"*",则解决403异常。
我的猜测是手动触发Lambda函数时使用了不同的主体,但我不知道这可能是什么。我尝试添加一个新的策略,让我的规范用户访问,但这不起作用。
有什么建议吗?
按照@JohnRotenstein的建议,我删除了bucket策略,而是实现了一个预签名的URL。现在一切正常。
在节点中生成预签名URL的示例。js(URL有效期为360秒):
s3.getSignedUrl('getObject', {Bucket: bucket, Key: filename, Expires: 360})
Java语言(有效期为1小时):
private URL createSignedURL(String s3Bucket, String s3Key){
AmazonS3 s3client = AmazonS3ClientBuilder.defaultClient();
// Set expiration to 1 hour
java.util.Date expiration = new java.util.Date();
long msec = expiration.getTime();
msec += 1000 * 60 * 60;
expiration.setTime(msec);
// Generate signed key
GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(s3Bucket, s3Key);
generatePresignedUrlRequest.setMethod(HttpMethod.GET);
generatePresignedUrlRequest.setExpiration(expiration);
// Return key
return s3client.generatePresignedUrl(generatePresignedUrlRequest);
}
如果您希望向特定的IAM用户/组/角色授予权限,那么您应该直接在该用户/组/角色上添加权限,而不是将其作为特殊情况添加到桶策略中。
这可以使您的bucket策略保持干净,减少特殊情况。
我建议:
以下是一个示例策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BucketAccess",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
实际上,这是过于允许的,因为它将允许Lambda函数在桶中做任何事情(例如删除桶),所以您应该只授予您知道Lambda函数需要的权限。
我遇到了类似的问题,问题是我的策略没有考虑Lambda在执行时承担角色这一事实。我将假定的角色添加到主体部分,一切都开始工作:
"Principal": {
"AWS": [
"arn:aws:sts::123412341234:assumed-role/role-name/function-name"
]
},
所以我就做了如下的桶策略: {“版本”:“2012-10-17”,“ID”:“HTTP引用策略示例”,“语句”:[{“SID”:“允许从www.example.com和example.com发起的get请求”,“Effect”:“Allow”,“Principal”:“”Action“:”S3:“,”Resource“:”arn:aws:s3:::exampleBucket/“,”Conditio
我搞不清这里出了什么问题。如有任何帮助,我们将不胜感激。
我已经读了很多文档,看了很多视频,但是我对IAM角色和Bucket策略仍然很困惑。让我困惑的是: 1)我创建了一个Bucket。那时我可以将它公有或私有。如果我将它公有,那么任何人或任何应用程序都可以“看到”Bucket中的对象。我认为可以将权限设置为添加/删除/获取/列出Bucket中的对象。如果是这样,那么为什么我需要为S3 Bucket添加任何IAM角色,或者添加任何Bucket策略(???
我发现,当我在IAM策略中使用NotResource作为掩码并将其附加到bucket时,受策略影响的资源是那个bucket中没有在NotResource子句中指定的所有资源。我需要指出一个文档,它清楚地表明情况是这样的。我一直在查看内联策略的文档,以及s3访问管理和策略的文档,但我很难找到这些特定的信息。文档中是否说明了在内联策略中指定资源的限制?
Ansible Playbooks 的集成测试 很多时候, 人们问, “我怎样才能最好的将 Ansible playbooks 和测试结合在一起?” 这有很多选择. Ansible 的设计实际上是一个”fail-fast”有序系统, 因此它可以很容易地嵌入到 Ansible playbooks. 在这一章节, 我们将讨论基础设施的集成测试及合适的测试等级. Note 这是一个关于测试你部署应用程序
这是我在这里的第一篇文章,我正在研究一个AWS CodePipeline,它创建新的AWS帐户并通过AWS SSO分配用户,AWS SSO具有特定托管IAM策略的权限集,并将内联策略作为用户组的权限边界集。我想使用一个测试管道来测试从出售的AWS帐户中的特定用户角色,并测试用户是否能够执行某些操作,如启用互联网访问、创建策略等,并根据结果进行进一步的管道步骤。 示例:在POC环境上运行的管道将创建