使用Java中的Lambda将CloudWatch中的AWS S3事件发送到我的服务器

Ihs*_*kal 5 java amazon-s3 amazon-cloudwatch apache-httpclient-4.x aws-lambda

我正在尝试使用Lambda在我的存储桶中触发对象级别API调用(上传,下载等)的情况下,向AWS外部的服务器发送S3事件日志,但是当我运行它时,它返回超时,但未提及任何错误。我怀疑可能是因为它无法使用HttpClient将其发送到我的服务器,但不能完全确定。

这是我的Lambda函数:

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;

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.event.S3EventNotification;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;

public class S3EventProcessor implements RequestHandler<S3Event, String> {

    public String handleRequest(S3Event s3event, Context context) {
        S3EventNotificationRecord record = s3event.getRecords().get(0);
        String event = record.toString();
        String url = "http://myexampleserver.com";



HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);
        StringEntity entity = null;
        try {
            entity = new StringEntity(event);
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        entity.setContentType("text/plain");
        post.setEntity(entity);
        context.getLogger().log("Setting up post request");

        HttpResponse response = null;
        try {
             response = client.execute(post);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        context.getLogger().log(Integer.toString(response.getStatusLine().getStatusCode()));
        String a = "Event: " +  s3event.getRecords().get(0).getRequestParameters().getSourceIPAddress();
        return a;
    }

}
Run Code Online (Sandbox Code Playgroud)

我的Lambda函数正确吗?

这是我的日志和错误消息:

START RequestId: bea1b956-3f9b-11e7-93c8-5503fb925252 Version: $LATEST
Setting up post requestEND RequestId: bea1b956-3f9b-11e7-93c8-5503fb925252
REPORT RequestId: bea1b956-3f9b-11e7-93c8-5503fb925252  Duration: 30001.43 ms   Billed Duration: 30000 ms   Memory Size: 512 MB Max Memory Used: 73 MB  
2017-05-23T09:40:21.181Z bea1b956-3f9b-11e7-93c8-5503fb925252 Task timed out after 30.00 seconds
 "errorMessage": "2017-05-23T09:40:21.181Z bea1b956-3f9b-11e7-93c8-5503fb925252 Task timed out after 30.00 seconds"
Run Code Online (Sandbox Code Playgroud)

这是我在Lambda中的VPC配置,正如我从此处此处遵循的那样: 在此处输入图片说明

Moh*_*gam 1

我不执行你的 lambda 函数。但你的 lambda 函数看起来是正确的。

不仅仅是您无法触发下载对象的事件。

以下事件适用

RRSObjectLost、放置、发布、复制、完成分段上传、删除、已创建删除标记、ObjectCreate(全部)、ObjectDelete(全部)。

通过从 lambda 控制台传递测试数据 S3 put 事件来测试您的 lambda。