Dwi*_*ute 2 java lambda amazon-s3 amazon-web-services aws-lambda
我当前的 AWS 设置是一个 lambda 函数,每当我将对象放入 S3 存储桶时就会触发该函数。我用 Java 实现了 lambda 的处理函数。我想要做的只是访问已上传的文件并触发 lambda 函数的执行。例如,如果我上传sample.json到存储桶,我想在处理函数中访问该文件的内容。
我知道我可以做这样的事情:
public Void handleRequest(S3Event input, Context context) {
  for (S3EventNotificationRecord record : input.getRecords()) {
    String key = record.getS3().getObject().getKey();
    String bucket = record.getS3().getBucket().getName();
    AmazonS3 s3Client = new AmazonS3Client(credentials);
    try {
      S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucket, key));
      InputStream input = s3Object.getObjectContent();
      BufferedReader reader = new BufferedReader(new InputStreamReader(input));
      while (true) {
        String line = reader.readLine();
        if (line == null) break;
        // Do something with line...
      }
// ...
问题是我不允许使用访问密钥。因此,我无法创建一个s3Client来下载文件的文件。换句话说,我必须从我的处理程序方法采用的参数中获取对象,即S3Event input。我该怎么做呢?
如果您的 Lambda 函数配置了适当的 IAM 角色(允许s3:GetObject相关的 S3 对象),则您无需在代码中显式提供凭证。
以下是获取对象以响应对象上传 Lambda 事件的示例 Java 代码:
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 = AmazonS3ClientBuilder.defaultClient();
            String body = s3Client.getObjectAsString(bkt, key);
            System.out.println("Body: " + body);
            return "ok";
        } catch (Exception e) {
            System.err.println("Exception: " + e);
            return "error";
        }
    }
}
进口:
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.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
| 归档时间: | 
 | 
| 查看次数: | 3954 次 | 
| 最近记录: |