AWS Lambda - 访问被拒绝错误 - GetObject

Posted

技术标签:

【中文标题】AWS Lambda - 访问被拒绝错误 - GetObject【英文标题】:AWS Lambda - Access Denied Error - GetObject 【发布时间】:2021-06-27 23:05:45 【问题描述】:

我是 AWS Lambda 的新手。我正在尝试来自https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html 的教程。当用户将 jpg 文件上传到名为 greetingsproject 的 S3 存储桶时,会触发 lambda 函数。

错误:9a62ff86-3e24-491d-852e-ded2e2cf5d94 信息:获取对象时出错 = AccessDenied:访问被拒绝

我在以下代码 sn-p 中收到拒绝访问错误:

try 
        console.log("srcBucket=" + srcBucket);
        console.log("srcKey=" + srcKey);
        const params = 
            Bucket: srcBucket,
            Key: srcKey
        ;
        var origimage = await s3.getObject(params).promise();

     catch (error) 
        console.log("error while getting object = " + error);
        return;
      

我的角色政策:


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogGroup",
                "logs:CreateLogStream"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        ,
        
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        ,
        
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::greetingsproject"
        ,
        
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::greetingsproject",
                "arn:aws:s3:::greetingsproject/*"
            ]
        ,
        
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::greetingsproject",
                "arn:aws:s3:::greetingsproject/*"
            ]
        
    ]

不确定我需要向策略添加哪些其他权限。

【问题讨论】:

lambda函数和s3桶在同一个aws账户吗? “角色策略” - 哪个角色? Lambda 执行角色? 【参考方案1】:

Marcin 关于 Lambda 执行角色的评论让我走上了正轨。 我之前按照以下步骤操作:

    创建了一个名为 greetingsProjectPolicy 的策略(具有上述权限) 将此政策附加到 greetingsProjectRole。 将 greetingsProjectRole 分配给我的 lambda 函数。 我认为就是这样,并且该策略应该可用于我的 lambda 函数。 但是,当我将 greetingsProjectRole 分配给该函数时,AWS 在内部创建了一个名为 greetingsProject-role-zhcbt61o 的执行角色。 当我点击这个角色时,我惊讶地发现它唯一的角色是 AWSLambdaBasicExecutionRole,而 greetingsProjectPolicy 不见了。 我必须将 greetingsProjectPolicy 作为内联策略添加到 greetingsProject-role-zhcbt61o。现在我不再收到拒绝访问错误。

不确定,这是 AWS 的工作方式还是我遗漏了什么。

【讨论】:

您已将 greetingsProjectPolicy 附加到 greetingsProjectRole。您可以检查角色中的受信任实体吗?对于 lambda,它应该是 lambda.amazonaws.com。我认为您让 Lambda 创建执行角色而不是选择您的角色(或者您的角色没有 lambda.amazonaws.com 是 Truested 实体) greetingsProjectRole 的受信任实体为 lambda.amazonaws.com。但是(如上所述)当我分配了 greetingsProjectRole 时,AWS 创建了一个 greetingsProject-role-zhcbt61o 并将其设为默认值。但是,我可以单击“编辑”按钮并将其更改为我的原始角色 (greetingsProjectRole),并且不再出现拒绝访问错误。

以上是关于AWS Lambda - 访问被拒绝错误 - GetObject的主要内容,如果未能解决你的问题,请参考以下文章

terraform/aws lambda 函数访问在 s3 上被拒绝

在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝

AWS Lambda S3 访问被拒绝

如何在使用 lambda@edge 调整图像大小时修复访问被拒绝错误

AWS Lambda 函数无法访问 AppSync GraphQL API - 权限被拒绝

在 AWS Lambda 中担任角色,在 SSM 调用时拒绝访问