授予 Lambda 访问私有 S3 存储桶的权限

时间:2021-05-13 16:30:43

标签: amazon-s3 aws-lambda amazon-iam

我们有一个需要能够访问私有 S3 存储桶的 Lambda 函数。

存储桶已启用“阻止所有公共访问”和以下资源策略:

{
    "Version": "2012-10-17",
    "Id": "Policy1620740846405",
    "Statement": [
        {
            "Sid": "Stmt1620740843181",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::'''''':role/integrations-shopifyBucketOrdersFunctionRole-*****",
                    "arn:aws:iam::'''''':root",
                    "arn:aws:iam::''''''':user/transalisS3"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket/*",
                "arn:aws:s3:::bucket"
            ]
        }
    ]
}

我还将 AmazonS3FullAccess 策略直接附加到 Lambda 使用的 IAM 角色。 但是,当 Lambda 函数尝试访问 S3 存储桶时,它会给出访问被拒绝的错误:

AccessDenied: Access Denied

使用 IAM 用户凭证连接到 S3 的外部系统在尝试访问存储桶时也会出现相同的错误。

有人知道可能导致此错误的原因吗?

以下是出错的 Lambda 代码:

const AWS = require('aws-sdk');
const s3 = new AWS.S3();

exports.bucketOrders = async (event, context) => {
    let response = {};
    let eventBucket = event.Records[0].s3.bucket.name;
    let eventFile = event.Records[0].s3.object.key;

    let decodedKey = decodeURIComponent(eventFile);

    try {
        let objectData = await s3.getObject({
            Bucket: eventBucket,
            Key: decodedKey,
        }).promise();

1 个答案:

答案 0 :(得分:1)

在创建 Lambda 应用程序时,有一个选项可以自动生成 IAM 角色,该角色有一个权限边界,附加了无效资源 - 导致一切失败。