繁体   English   中英

使用 aws lambda 函数中的节点 js 在其中创建 s3 存储桶和文件夹

[英]creating s3 bucket and folders inside it using node js in aws lambda function

我是 Node js 和 AWS 的新手。 我正在尝试使用 lambda 函数中的节点 js 在 S3 中创建一个存储桶。 因此,我试图在这个 S3 存储桶中创建文件夹。

我遵循了之前回答的所有问题并尝试了不同的代码迭代,但似乎没有一个有效。 以下是我的代码,它在没有出现任何问题的情况下执行,但没有创建存储桶和文件夹。

const AWS = require('aws-sdk');

let s3Client = new AWS.S3({
  accessKeyId: '<access_key_id>',
  secretAccessKey: '<secret_access_key>'
});

var params = {
  Bucket : 'pshycology06'
};

exports.handler = async (event, context, callback) => {

// call spaces to create the bucket
    s3Client.createBucket(params, function(err, data) {
      if (err) {
        console.log("\r\n[ERROR] : ", err);
      } else {
        console.log("\r\n[SUCCESS] : data = ",data);
      }
    });
};

在 Lambda 函数中创建文件夹的代码如下——

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
var s3Client = new AWS.S3({apiVersion: '2006-03-01'});

exports.handler = async (event, context) => {

    let params1 = { Bucket: 'travasko', Key: '2/dir1/dir2', Body:'body does not matter' };

    s3Client.putObject(params1, function (err, data) {
        if (err) {
            console.log("Error creating the folder: ", err);
        } else {
            console.log("Successfully created a folder on S3");
        }
    });

他们两个都不起作用。 我阅读了很多关于这个问题的文件和之前提出的答案,但没有一个对我有用。

lambda 函数的超时时间为 1 分钟。 它对 IAM 角色具有以下策略 - 1. AmazonRDSFullAccess 2. AmazonS3FullAccess 3. AWSLambdaVPCExecutionRole

VPC 安全组是默认的。

此外,当我尝试使用以下 AWS CLI 命令创建相同的存储桶时,它会创建存储桶。

aws s3api create-bucket --bucket psychology06 --region us-east-1

我不确定,我在哪里犯了错误。

确保不存在同名的存储桶。如果可能,请共享日志。

您需要将.promise()方法链接到您的aws-sdk调用并await它们,因为您正在创建async函数。

await s3Client.createBucket(params).promise();
await s3Client.putObject(params1).promise();

此外,S3 不适用于目录,尽管当您将/添加到文件名时,您可能会被 S3 控制台的外观所迷惑。 你可以在这里阅读更多关于它的信息

因为你是新手,总是尝试 aws cli(不推荐),然后在实现时搜索等效的 sdk 函数。由于它(你的代码)是异步的,它不会等到回调函数执行,所以你可以尝试一些东西如下所示。(这不是实际的解决方案,它只是告诉如何等待回调完成它的工作。)

    'use strict'

    var AWS = require('aws-sdk');
    AWS.config.region = 'us-east-1';
    var s3Client = new AWS.S3({ apiVersion: '2006-03-01' });

    exports.handler = async (event, context) => {
        let params1 = { Bucket: 'travasko', Key: '2/dir1/dir2', Body: 'body does not matter' };
        try {
            let obj = await something(params1);
            callback(null, obj);
        }
        catch (err) {
            callback('error', err)
        }
    }

    async function something(params1) {
        return new Promise(async (resolve, reject) => {
            await s3Client.putObject(params1, function (err, data) {
                if (err) {
                    console.log('Error creating the folder:', err);
                    reject('error during putObject');
                } else {
                    console.log('success' + JSON.stringify(data));
                    resolve('success');
                }
            });
        });
    }

对于您在评论中的问题:嗨,Vinit,让我给您介绍一些背景知识,您提出的问题非常笼统。 首先,VPC 是您创建的东西,您将在其中拥有用于运行您的 ec2 或任何托管服务(aws 的非托管服务)的组织私有和公共子网。 但是由于 lambda 是托管服务,它在 aws vpc 中运行,它们通常采用您的代码和 lambda 配置并执行代码。 vpc,否则不要使用它)然后正如我们讨论的 lambda 在 aws vpc 中运行,因此在冷启动期间它创建了一个 ENI(将其视为弹性 IP)并尝试与您的 VPC 通信。 在重新发明之前,为每个 lambda 创建了一个 ENI,这是第一次需要时间的原因,而 lambda 曾经超时,即使您的执行时间较短。 现在重新发明后,每个安全组的每个子网都创建了 EIP。 因此,当您附加 vpc 时,现在来回答您的问题,如果 lambda 执行需要更多时间或未按预期工作,那么您必须查看您的 vpc(configs、routes、subnets) 是如何设置的,并且很难回答除非我们调试,否则涉及这么多参数。 因此,如果您的函数(代码)不需要与您自己在 vpc 中的任何托管实例(通常是私有子网)等进行通信,请不要附加 vpc。

因为,您正在使用异步功能。 因此,您必须在调用“s3Client.createBucket”时使用 await。 然后解决收到的承诺。

要创建文件夹,请使用尾随的“/”。 例如“pshycology06/travasko/”。

如果这些不起作用,请发布错误日志。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM