当前位置: 首页 > 知识库问答 >
问题:

手动测试Lambda功能时AWS S3存储桶策略不起作用

赵俊侠
2023-03-14

我有一个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函数时使用了不同的主体,但我不知道这可能是什么。我尝试添加一个新的策略,让我的规范用户访问,但这不起作用。

有什么建议吗?

共有3个答案

阎德宇
2023-03-14

按照@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); 
}
秦安宁
2023-03-14

如果您希望向特定的IAM用户/组/角色授予权限,那么您应该直接在该用户/组/角色上添加权限,而不是将其作为特殊情况添加到桶策略中。

这可以使您的bucket策略保持干净,减少特殊情况。

我建议:

  • 删除已显示的bucket策略
  • 向Lambda函数使用的IAM角色添加一个内嵌策略(针对一次性情况)

以下是一个示例策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BucketAccess",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}

实际上,这是过于允许的,因为它将允许Lambda函数在桶中做任何事情(例如删除桶),所以您应该只授予您知道Lambda函数需要的权限。

汪凌
2023-03-14

我遇到了类似的问题,问题是我的策略没有考虑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环境上运行的管道将创建