簡體   English   中英

如何使用 lambda function 從 AWS s3 獲取文本文件的內容?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM