簡體   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