我在AWS中有一个Node 4.3 Lambda函数。我想能够将文本文件写入S3并阅读许多关于如何与S3集成的教程。然而,所有这些教程都是关于如何在写入到S3之后调用Lambda函数。
我该如何使用Node在Lambda中创建一个S3中的文本文件?是否可能?亚马逊的文档似乎没有涵盖这个问题。
我在AWS中有一个Node 4.3 Lambda函数。我想能够将文本文件写入S3并阅读许多关于如何与S3集成的教程。然而,所有这些教程都是关于如何在写入到S3之后调用Lambda函数。
我该如何使用Node在Lambda中创建一个S3中的文本文件?是否可能?亚马逊的文档似乎没有涵盖这个问题。
是的,绝对有可能!
var AWS = require('aws-sdk');
function putObjectToS3(bucket, key, data){
var s3 = new AWS.S3();
var params = {
Bucket : bucket,
Key : key,
Body : data
}
s3.putObject(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
}
请确保为您的Lambda函数选择或更新其执行的IAM角色,以便向目标S3存储桶/键路径授予所需的写入权限。
需要添加的IAM语句:
{
"Sid": "Stmt1468366974000",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket-name-goes-here/optional-path-before-allow/*"
]
}
更多阅读:
经历了漫长的沉默,一直出现“任务超时X秒”错误,但并没有什么好的错误信息。因此我回到了开始的地方,使用了亚马逊的默认模板示例,这个方法奏效了!
> Lambda > Functions > 创建函数 > 使用蓝图 > 过滤: s3。
这是我的修改版亚马逊示例:
const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
async function uploadFileOnS3(fileData, fileName){
const params = {
Bucket: "The-bucket-name-you-want-to-save-the-file-to",
Key: fileName,
Body: JSON.stringify(fileData),
};
try {
const response = await s3.upload(params).promise();
console.log('Response: ', response);
return response;
} catch (err) {
console.log(err);
}
};
serverless.com 的 IAM 语句 - 将写入 S3 到特定存储桶
service: YOURSERVICENAME
provider:
name: aws
runtime: nodejs8.10
stage: dev
region: eu-west-1
timeout: 60
iamRoleStatements:
- Effect: "Allow"
Action:
- s3:PutObject
Resource: "**BUCKETARN**/*"
- Effect: "Deny"
Action:
- s3:DeleteObject
Resource: "arn:aws:s3:::**BUCKETARN**/*"
aws-sdk在s3上上传文件。如果您使用的是IAM用户,则必须提供访问密钥和秘密密钥,并确保已向IAM用户提供必要的权限。
var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: "ACCESS_KEY",secretAccessKey: 'SECRET_KEY'});
var s3bucket = new AWS.S3({params: {Bucket: 'BUCKET_NAME'}});
function uploadFileOnS3(fileName, fileData){
var params = {
Key: fileName,
Body: fileData,
};
s3bucket.upload(params, function (err, res) {
if(err)
console.log("Error in uploading file on s3 due to "+ err)
else
console.log("File successfully uploaded.")
});
}
在这里,我为测试目的临时硬编码了AWS访问和秘密密钥。有关最佳实践,请参阅文档。
bucket
是来自于process.env.BUCKET_NAME
,但是key
路径和data
具体是什么呢?如果你先在Lambda中写入文件,然后再将其放入桶中,会怎样呢? - bildungsromankey
是指跟在您的存储桶名称之后的任何内容。例如,对于https://mybucket.s3.amazonaws.com/path/to/image.jpg
,键是path/to/image.jpg
。 - Drakinite