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

如何从Lambda函数访问S3对象?

谢叶五
2023-03-14

我正在尝试访问存储在AWS3桶中的文本文件。目前,它只包含“测试”一词。

起初,我以为我的fs.readfile有问题,但现在我发现问题更根本。我根本无法访问该文件。node.js的AWS似乎根本无法看到该文件。

我正在使用以下Lambda函数:

const aws = require('aws-sdk');
const s3 = new aws.S3; //({ apiVersion: '2006-03-01' });

    exports.handler = async (event, context) => { 
    // Get the object from the event and show its content type
    const bucket = 's3://'+ event.Records[0].s3.bucket.name;
    const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    console.log('Bucket = ' + bucket);
    console.log('key = ' + key);

    var params = {Bucket: bucket, Key: key};
    console.log('Checking file existence');
    console.log(params);
    s3.getObject(params, function(err, data) {
        console.log('S3.getObject called');
        console.log('err = ' + err);
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data);           // successful response
    });
};

测试床函数包含以下代码:

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-1",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "wgtiplists",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::wgtiplists"
        },
        "object": {
          "key": "tiplist.txt",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}

结果如下所示(我删除了时间戳和请求ID文本):

INFO    Bucket = s3://wgtiplists
INFO    key = tiplist.txt
INFO    Checking file existence
INFO    { Bucket: 's3://wgtiplists', Key: 'tiplist.txt' }

由此,我得出结论,没有调用S3函数,尽管我可能弄错了。

我做错了什么?

共有1个答案

汲丰茂
2023-03-14

我相信你需要在这里加上括号:

const s3 = new aws.S3();

您不应该将s3:/添加到bucket名称中,只需执行以下操作:

const bucket = event.Records[0].s3.bucket.name;
 类似资料:
  • 我在Lambda函数上收到来自S3 AWS服务的acccess denied错误。 这是代码: 这是CloudWatch上的错误: 这是堆栈错误: 没有关于S3的任何其他描述或信息,桶权限允许每个人、放置、列表和删除。 我可以做什么来访问S3桶? PS:在Lambda事件属性上,主体是正确的,并且具有管理特权。

  • 我有一个lambda函数,它使用一个具有以下策略摘录的角色 我的桶策略如下所示 我在角色和bucket策略上都允许使用GetObject和ListBucket。但是,当我的函数运行时 我明白了 [错误]ClientError:调用GetObject操作时发生错误(AccessDenied):拒绝访问 我还需要添加哪些权限?对象就在那里,当我使用管理员角色在本地运行代码时,我可以得到它。 最新消息

  • 使用Java AWS SDK,我创建了一个lambda函数来从s3 bucket读取csv文件。我已经将bucket公之于众,可以从任何浏览器轻松访问它和文件。为了测试它,我使用lambda控制台上的test按钮。我正在使用hello world测试配置输入模板。 它失败的原因是: 错误消息:指定的桶无效。(服务:Amazon S3;状态代码:400;错误代码:InvalidBucketName;

  • lambda执行角色具有对51个函数的s3访问权限,包括ListBuckets和所有其他读操作。 我的S3 bucket有一个允许从lambda角色访问的策略。(反正是在同一个帐户中,所以我不认为这是必需的)。 我甚至只是为了好玩才让桶公共访问。 这是λ码。我不知道为什么bucket.objects.all()无法访问S3。 Lambda执行角色策略

  • 我们有一个Lambda函数,需要能够访问私有的S3桶。 该存储桶已启用“阻止所有公共访问”,并具有以下资源策略: 我还将AmazonS3FullAccess策略直接附加到Lambda使用的IAM角色。但是,当Lambda函数尝试访问S3存储桶时,会出现访问被拒绝错误: 使用IAM用户凭据连接到S3的外部系统在尝试访问存储桶时也会收到相同的错误。 有人知道是什么导致了这个错误吗? 以下是发生错误的L

  • 如何从AWS Lambda函数中读取Dynamodb记录? 我正试图通过以下方式调用get_item: 但是,当我通过Lambda测试工具运行测试时,它失败并出现错误: 尽管文档说get_item应该返回包含字典的对象,但它实际上返回: 为什么没有提供项目?如何从Dynamo检索记录?