我在AWS中有一个Node 4.3 Lambda函数。我希望能够将文本文件写入S3,并阅读了许多关于如何与S3集成的教程。但是,所有这些都是关于如何在写入S3后调用Lambda函数,如下所示:
http://docs.aws.amazon.com/lambda/latest/dg/with-s3.html
如何使用节点从Lambda在S3中创建文本文件?这可能吗?亚马逊的文档似乎并没有涵盖它。
答案 0 :(得分:66)
是的,这绝对是可能的!
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角色,确保为Lambda函数提供对目标s3存储桶/密钥路径所需的写入权限。
要添加的IAM声明:
{
"Sid": "Stmt1468366974000",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket-name-goes-here/optional-path-before-allow/*"
]
}
进一步阅读:
AWS JavaScript SDK: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html
具体的“Put Object”细节: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
答案 1 :(得分:4)
您可以使用
在s3上传文件AWS-SDK
如果您使用 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访问和密钥用于测试目的。最佳实践请参考下面的链接。
https://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html
答案 2 :(得分:0)
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**/*"
答案 3 :(得分:0)
经过很长一段时间的静音失败后,“任务在X之后超时”而没有任何好的错误消息,我又回到了开头,回到了Amazon默认模板示例,并且成功了!
> Lambda>函数>创建函数>使用蓝图>过滤器: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);
}
};