web-dev-qa-db-ja.com

ラムダ関数を使用してAWS s3からテキストファイルの内容を取得する方法は?

新しいテキストファイルがs3バケットにアップロードされるたびにトリガーされる、AWSのラムダ関数を設定できるかどうか疑問に思いました。関数では、テキストファイルの内容を取得して、何らかの方法で処理したいと思います。これが可能かどうか疑問に思っていました...?

たとえば、foobarbazの内容でfoo.txtをアップロードした場合、ラムダ関数でfoobarbazを取得したいので、それを使って何かをすることができます。 getObjectまたは同様のメソッドからメタデータを取得できることを知っています。

ありがとう!

46
jstnchng

S3オブジェクトキーとバケット名は、eventパラメーターを介してLambda関数に渡されます。その後、S3からオブジェクトを取得し、その内容を読み取ることができます。

Lambda eventからバケットとオブジェクトキーを取得する基本的なコードは次のとおりです。

exports.handler = function(event, context, callback) {
   var src_bkt = event.Records[0].s3.bucket.name;
   var src_key = event.Records[0].s3.object.key;
};

バケットとキーを取得したら、getObjectを呼び出してオブジェクトを取得できます。

var AWS = require('aws-sdk');
var 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
    var src_bkt = event.Records[0].s3.bucket.name;
    var src_key = event.Records[0].s3.object.key;

    // Retrieve the object
    s3.getObject({
        Bucket: src_bkt,
        Key: src_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);
        }
    });
};

多くのポスターが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";
        }
    }
}
50
jarmod

テキストファイルがASCII形式でエンコードされていると仮定すると、data.Body.toString('ascii')を使用してテキストファイルの内容を取得できます。他のエンコードタイプを関数に渡すこともできます。詳細については Node-Buffer をご覧ください。

14
jaywalker

python 3.6環境でラムダ関数を使用しています。以下のコードは、バケット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)
6
Shubham Bansal