![](/img/trans.png)
[英]AWS S3 Lambda event - get, update, then put JSON file from same bucket
[英]How to get contents of a text file from AWS s3 using a lambda function?
我想知道我是否可以为 AWS 设置 lambda function,只要将新文本文件上传到 s3 存储桶中就会触发。 在 function 中,我想获取文本文件的内容并以某种方式对其进行处理。 我想知道这是否可能......?
例如,如果我上传 foo.txt,内容为 foobarbaz,我想以某种方式在我的 lambda function 中获取 foobarbaz,以便我可以用它做一些事情。 我知道我可以从 getObject 或类似方法中获取元数据。
谢谢!
S3 对象键和存储桶名称通过事件参数传递到您的 Lambda 函数中。 然后,您可以从 S3 获取对象并读取其内容。
从 Lambda event
检索存储桶和对象键的基本代码如下:
exports.handler = function(event, context, callback) {
const bkt = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
};
获得存储桶和密钥后,您可以调用 getObject 来检索对象:
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = function(event, context, callback) {
// Retrieve the bucket & key for the uploaded S3 object that
// caused this Lambda function to be triggered
const Bucket = event.Records[0].s3.bucket.name;
const Key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
// Retrieve the object
s3.getObject({ Bucket, Key }, function(err, data) {
if (err) {
console.log(err, err.stack);
callback(err);
} else {
console.log("Raw text:\n" + data.Body.toString('ascii'));
callback(null, null);
}
});
};
这是一个使用 ES6 样式代码和 promise 的更新 JavaScript 示例,减去错误处理:
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event, context) => {
const Bucket = event.Records[0].s3.bucket.name;
const Key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
const data = await s3.getObject({ Bucket, Key }).promise();
console.log("Raw text:\n" + data.Body.toString('ascii'));
};
许多海报要求 Java 中的等价物,所以这里有一个例子:
package example;
import java.net.URLDecoder;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.S3Event;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
public class S3GetTextBody implements RequestHandler<S3Event, String> {
public String handleRequest(S3Event s3event, Context context) {
try {
S3EventNotificationRecord record = s3event.getRecords().get(0);
// Retrieve the bucket & key for the uploaded S3 object that
// caused this Lambda function to be triggered
String bkt = record.getS3().getBucket().getName();
String key = record.getS3().getObject().getKey().replace('+', ' ');
key = URLDecoder.decode(key, "UTF-8");
// Read the source file as text
AmazonS3 s3Client = new AmazonS3Client();
String body = s3Client.getObjectAsString(bkt, key);
System.out.println("Body: " + body);
return "ok";
} catch (Exception e) {
System.err.println("Exception: " + e);
return "error";
}
}
}
您可以使用data.Body.toString('ascii')
来获取文本文件的内容,假设文本文件是使用 ascii 格式编码的。 您还可以将其他编码类型传递给函数。 查看节点缓冲区以获取更多详细信息。
我在 python 3.6 环境中使用 lambda 函数。 下面的代码将读取存储桶 my_s3_bucket 中文件 main.txt 的内容。 确保根据您的需要替换存储桶名称和文件名。
def lambda_handler(event, context):
# TODO implement
import boto3
s3 = boto3.client('s3')
data = s3.get_object(Bucket='my_s3_bucket', Key='main.txt')
contents = data['Body'].read()
print(contents)
新的 AWS SDK v3 意味着文件被读回为可读的 stream。 从现在开始,您也需要考虑到这一点。
https://carova.io/snippets/read-data-from-aws-s3-with-nodejs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.