Pra*_*nde 5 java eclipse json amazon-web-services aws-lambda
我正在编写一个 AWS Lambda,它将处理来自 CloudWatch 的日志流。我正在用Java实现它。我正在努力解决几个问题:
import json
import base64
import zlib
def stream_gzip_decompress(stream):
dec = zlib.decompressobj(32 + zlib.MAX_WBITS) # offset 32 to skip the header
foo=''
for chunk in stream:
rv = dec.decompress(chunk)
if rv:
foo += rv
return foo
def lambda_handler(event, context):
# Decode and decompress the AWS Log stream to extract json object
stream=json.dumps(event['awslogs']['data'])
payload=json.loads(stream_gzip_decompress(stream.decode('base64')))
print(payload)
Run Code Online (Sandbox Code Playgroud)
如何在Java中实现类似的功能?
错误:
{“errorMessage”:“加载类 UpdateCurrentNotificationStatus 时出错:org/json/JSONException”,
“errorType”:“class java.lang.NoClassDefFoundError”}
以下是我正在编写的示例代码:
Run Code Online (Sandbox Code Playgroud)import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.json.JSONException; import org.json.JSONObject; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; import com.amazonaws.services.lambda.runtime.Context; public class UpdateCurrentNotificationStatus implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { int letter; while((letter = inputStream.read()) != -1) { //outputStream.write(Character.toUpperCase(letter)); JSONObject json = new JSONObject(letter); try { String stream = json.getString("awslogs"); System.out.println(stream); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
有人可以帮我解决这个问题吗?
谢谢你,
普拉萨德
您需要做的就是接受 CloudWatchLogsEvent 作为输入参数。
public class Testing implements RequestHandler<CloudWatchLogsEvent, String> {
public String handleRequest(CloudWatchLogsEvent request, Context context){
context.getLogger().log(request.toString());
String timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(Calendar.getInstance().getTime());
context.getLogger().log("Invocation started: " + timeStamp);
context.getLogger().log(request.toString());
timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(Calendar.getInstance().getTime());
context.getLogger().log("Invocation completed: " + timeStamp);
return "completed";
}
}
Run Code Online (Sandbox Code Playgroud)
请记住,这将打印编码的 Base 64 字符串,该字符串也经过 gzip 压缩。您必须对其进行解码和解压缩。网上有关于如何执行此操作的示例,因此我不会深入探讨。例如,这里是解码 Base64 编码的 ZIP 存档 (GZIP)。