I am writing a AWS Lambda that will process log stream from CloudWatch. I am implementing it in Java. I am struggling with couple of issues:
- How to decode and decompressed the logs that are received. In Python following code works:
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)
How to implement similar functionality in Java?
- Also when I try to add external jar org.json for parsing input JSON data. I am getting following error although I tried most of the things that are given on stackoverflow
Error:
{ "errorMessage": "Error loading class UpdateCurrentNotificationStatus: org/json/JSONException",
"errorType": "class java.lang.NoClassDefFoundError" }
Following is the sample code that I am writing:
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(); } } } }
Can somebody help me with this?
Thank You,
Prasad