การเรียกใช้งานและเรียกใช้ฟังก์ชัน Lambda
บทนี้จะอธิบายรายละเอียดเกี่ยวกับกระบวนการเรียกใช้และเรียกใช้ฟังก์ชันแลมด้าและขั้นตอนที่เกี่ยวข้อง
AWS Lambda Execution Model
การดำเนินการของ AWS ขึ้นอยู่กับรายละเอียดการกำหนดค่าที่เพิ่มสำหรับฟังก์ชัน AWS Lambda เมื่อสร้างฟังก์ชันขึ้นมาจะมีไฟล์memory และ time allottedซึ่งใช้สำหรับการทำงานของฟังก์ชัน AWS Lambda
ด้วยความช่วยเหลือของรายละเอียดการกำหนดค่า AWS Lambda จะสร้างบริบทการดำเนินการ บริบทการดำเนินการคือสภาพแวดล้อมรันไทม์ชั่วคราวซึ่งจัดทำขึ้นพร้อมกับการอ้างอิงภายนอกใด ๆ เช่นการเชื่อมต่อฐานข้อมูลจุดสิ้นสุด http ไลบรารีของบุคคลที่สามเป็นต้นหากมี
เมื่อเรียกใช้ฟังก์ชัน AWS Lambda เป็นครั้งแรกหรือหากมีการอัปเดตฟังก์ชันแลมบ์ดาจะมีการเพิ่มเวลาแฝงเล็กน้อยเนื่องจากการตั้งค่าบริบทการดำเนินการ อย่างไรก็ตามการโทรที่ตามมาจะเร็วกว่าเมื่อเทียบกับการโทรครั้งแรก AWS Lambda พยายามใช้บริบทการดำเนินการซ้ำอีกครั้งหากเรียกใช้ฟังก์ชัน Lambda โดยใช้เวลาน้อยกว่า
การนำบริบทการดำเนินการกลับมาใช้ใหม่มีผลกระทบดังต่อไปนี้ -
หากมีการเชื่อมต่อฐานข้อมูลใด ๆ สำหรับการเรียกใช้ Lambda การเชื่อมต่อนั้นจะยังคงอยู่เพื่อใช้ซ้ำ ดังนั้นรหัสแลมบ์ดาจึงต้องมีการตรวจสอบการเชื่อมต่อก่อน - หากมีอยู่และนำมาใช้ใหม่ มิฉะนั้นเราจะต้องทำการเชื่อมต่อใหม่สด
บริบทการดำเนินการรักษาพื้นที่ดิสก์ 500MB ใน /tmpไดเรกทอรี ข้อมูลที่ต้องการถูกแคชไว้ในไดเร็กทอรีนี้ คุณสามารถตรวจสอบรหัสเพิ่มเติมเพื่อดูว่ามีข้อมูลอยู่หรือไม่
หากการเรียกกลับหรือกระบวนการพื้นหลังบางอย่างไม่สมบูรณ์เมื่อเรียกใช้ฟังก์ชันแลมบ์ดาการเรียกใช้จะเริ่มต้นเมื่อเรียกใช้ฟังก์ชันแลมบ์ดาอีกครั้ง ในกรณีที่คุณไม่ต้องการให้สิ่งนั้นเกิดขึ้นตรวจสอบให้แน่ใจว่ากระบวนการทั้งหมดของคุณสิ้นสุดลงอย่างถูกต้องเมื่อการเรียกใช้ฟังก์ชันเสร็จสมบูรณ์
คุณควรใช้บริบทการดำเนินการและข้อมูลที่จัดเก็บในไดเรกทอรี tmp คุณจะต้องเพิ่มการตรวจสอบที่จำเป็นในโค้ดเพื่อดูว่ามีข้อมูลที่ต้องการหรือไม่ก่อนที่จะสร้างใหม่ใหม่ วิธีนี้จะช่วยประหยัดเวลาในระหว่างการดำเนินการและทำให้เร็วขึ้น
เรียกใช้ฟังก์ชัน AWS Lambda
เราสามารถเรียกใช้ AWS ด้วยตนเองโดยใช้ aws cli. เราได้เห็นวิธีการสร้างและปรับใช้ AWS Lambda โดยใช้แล้วcli. ที่นี่เราจะสร้างฟังก์ชันโดยใช้aws cli และเรียกสิ่งเดียวกัน
การสร้างฟังก์ชัน AWS Lambda โดยใช้ AWS CLI
คุณสามารถใช้คำสั่งต่อไปนี้เพื่อสร้างฟังก์ชัน AWS Lambda โดยใช้ aws cli -
Commands
create-function
--function-name <value>
--runtime <value>
--role <value>
--handler <value>
[--code <value>]
[--description <value>]
[--timeout <value>]
[--memory-size <value>]
[--environment <value>]
[--kms-key-arn <value>]
[--tags <value>]
[--zip-file <value>]
[--cli-input-json <value>]
Command with values
aws lambda create-function
--function-name "lambdainvoke"
--runtime "nodejs8.10"
--role "arn:aws:iam::625297745038:role/lambdaapipolicy"
--handler "index.handler"
--timeout 5
--memory-size 256
--zip-file "fileb://C:\nodeproject\index.zip"
ผลลัพธ์ดังแสดงด้านล่าง -
ฟังก์ชั่นที่สร้างขึ้นในคอนโซล AWS มีดังที่แสดงด้านล่าง -
ตอนนี้คุณสามารถเรียกใช้ฟังก์ชันโดยใช้คำสั่ง:invoke
--function-name <value>
[--invocation-type <value>]
[--log-type <value>]
[--client-context <value>]
[--payload <value>]
[--qualifier <value>]
outfile <value>
Options
--function-name − ระบุชื่อของฟังก์ชันที่คุณต้องการเรียกใช้
--invocation-type(string) − โดยค่าเริ่มต้นประเภทการเรียกใช้คือ requestresponse. ค่าที่สามารถใช้ได้กับประเภทการเรียกใช้คือRequestResponse, Event และ DryRun.
ประเภทการเรียกใช้เหตุการณ์จะถูกใช้สำหรับการตอบสนองแบบไม่ซิงค์
DryRun ใช้เมื่อคุณต้องการตรวจสอบฟังก์ชัน Lambda โดยไม่จำเป็นต้องดำเนินการ
--log-type − มันจะเป็น Tailถ้าประเภทการเรียกใช้คือ RequestResponse มันให้ข้อมูลบันทึกที่เข้ารหัส 4KB base64 ล่าสุด ค่าที่เป็นไปได้คือTail และ None.
--client-context −คุณสามารถส่งรายละเอียดเฉพาะไคลเอ็นต์ไปยังฟังก์ชัน Lambda บริบทไคลเอนต์ต้องอยู่ในรูปแบบ json และเข้ารหัส base64 ขนาดไฟล์สูงสุดคือ 3583 ไบต์
--payload − อินพุตรูปแบบ json ให้คุณฟังก์ชั่น lambda
--qualifier −คุณสามารถระบุเวอร์ชันฟังก์ชัน Lambda หรือชื่อนามแฝง หากคุณส่งผ่านเวอร์ชันของฟังก์ชันที่เกินกว่า API จะใช้ฟังก์ชัน arn ที่มีคุณสมบัติเหมาะสมเพื่อเรียกใช้ฟังก์ชัน Lambda หากคุณระบุชื่อนามแฝง api จะใช้นามแฝง ARN เพื่อเรียกใช้ฟังก์ชัน Lambda
outfile − นี่คือชื่อไฟล์ที่จะบันทึกเนื้อหา
Command with values
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail C:\nodeproject\outputfile.txt
คุณสามารถใช้ตัวเลือก payload เพื่อส่งเหตุการณ์จำลองไปยังฟังก์ชัน lambda ในรูปแบบ json ดังที่แสดงด้านล่าง
รหัส AWS Lambda ที่เกี่ยวข้องมีดังนี้ -
exports.handler = async (event, callback) => {
console.log("Hello => "+ event.name);
console.log("Address =>"+ event.addr);
callback(null, 'Hello '+event.name +" and address is "+ event.addr);
};
สังเกตว่าในโค้ดเรามีคอนโซล event.name และ event.addr. ตอนนี้ให้เราใช้ตัวเลือก payload ใน aws cli เพื่อส่งเหตุการณ์พร้อมชื่อและที่อยู่ดังนี้ -
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt
จากนั้น Payload รับอินพุตเป็น filepath ซึ่งมีอินพุต json ดังที่แสดง -
{"name":"Roy Singh", "addr":"Mumbai"}
ผลลัพธ์ที่สอดคล้องกันดังแสดงด้านล่าง -
ผลลัพธ์จะถูกเก็บไว้ในไฟล์ C:\clioutput\outputfile.txt ดังต่อไปนี้ -
"Hello Roy Singh and address is Mumbai"
ตัวอย่างเหตุการณ์
คุณสามารถทดสอบฟังก์ชัน AWS Lambda ได้โดยส่งผ่านเหตุการณ์ตัวอย่าง ส่วนนี้จะให้ตัวอย่างเหตุการณ์สำหรับ AWS Services คุณสามารถใช้ไฟล์invokeคำสั่งเพื่อทดสอบเอาต์พุตเมื่อทริกเกอร์ด้วยบริการใด ๆ สังเกตรหัสที่กำหนดสำหรับเหตุการณ์ตัวอย่างที่เกี่ยวข้องด้านล่าง -
Amazon S3 ใส่เหตุการณ์ตัวอย่าง
{
"Records": [{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"SourceIPAddress": "127.0.0.1"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901",
"key": "HappyFace.jpg",
"size": 1024
},
"bucket": {
"arn": bucketarn,
"name": "Sourcebucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "EXAMPLE123456789"
},
"awsRegion": "us-east-1",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"eventSource": "aws:s3"
}]
}
เพื่อรับไฟล์ details of the file from the s3 put eventคุณสามารถใช้คำสั่งต่อไปนี้ -
event.Records[0].s3.object.key //will display the name of the file
ถึง get the bucket nameคุณสามารถใช้คำสั่งต่อไปนี้ -
event.Records[0].s3.bucket.name //will give the name of the bucket.
ถึง see the EventNameคุณสามารถใช้คำสั่งต่อไปนี้ -
event.Records[0].eventName // will display the eventname
Amazon S3 ลบเหตุการณ์ตัวอย่าง
{
"Records": [{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"SourceIPAddress": "127.0.0.1"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"sequencer": "0A1B2C3D4E5F678901",
"key": "HappyFace.jpg"
},
"bucket": {
"arn": bucketarn,
"name": "Sourcebucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "EXAMPLE123456789"
},
"awsRegion": "us-east-1",
"eventName": "ObjectRemoved:Delete",
"userIdentity": {
"principalId": "EXAMPLE"
},
"eventSource": "aws:s3"
}]
}
Amazon DynamoDB
Amazon DynamoDB อาจเป็นเหตุการณ์บน AWS Lambda เมื่อมีการเปลี่ยนแปลงบนตาราง DynamoDB เราสามารถดำเนินการเช่นเพิ่มรายการอัปเดตและลบระเบียนจากตาราง DynamodDB
ตัวอย่างเหตุการณ์สำหรับเหตุการณ์การเพิ่มแทรกและลบ DynamoDB แสดงอยู่ที่นี่ -
{
"Records": [{
"eventID": "1",
"eventVersion": "1.0",
"dynamodb": {
"Keys": {
"Id": {
"N": "101"
}
},
"NewImage": {
"Message": {
"S": "New item!"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES",
"SequenceNumber": "111",
"SizeBytes": 26
},
"awsRegion": "us-west-2",
"eventName": "INSERT",
"eventSourceARN": eventSourcearn,
"eventSource": "aws:dynamodb"
},
{
"eventID": "2",
"eventVersion": "1.0",
"dynamodb": {
"OldImage": {
"Message": {
"S": "New item!"
},
"Id": {
"N": "101"
}
},
"SequenceNumber": "222",
"Keys": {
"Id": {
"N": "101"
}
},
"SizeBytes": 59,
"NewImage": {
"Message": {
"S": "This item has changed"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES"
},
"awsRegion": "us-west-2",
"eventName": "MODIFY",
"eventSourceARN": Sourcearn,
"eventSource": "aws:dynamodb"
},
{
"eventID": "3",
"eventVersion": "1.0",
"dynamodb": {
"Keys": {
"Id": {
"N": "101"
}
},
"SizeBytes": 38,
"SequenceNumber": "333",
"OldImage": {
"Message": {
"S": "This item has changed"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES"
}, "awsRegion": "us-west-2",
"eventName": "REMOVE",
"eventSourceARN": Sourcearn,
"eventSource": "aws:dynamodb"
}]
}
บริการแจ้งเตือนแบบง่ายของ Amazon
AWS Lambda มีประโยชน์ในการประมวลผลการแจ้งเตือนที่สร้างขึ้นใน Simple Notification Service (SNS). เมื่อใดก็ตามที่มีการเผยแพร่ข้อความใน SNS ฟังก์ชันแลมบ์ดาสามารถทริกเกอร์ด้วยเหตุการณ์ SNS ซึ่งมีรายละเอียดของข้อความ ข้อความนี้สามารถประมวลผลได้ภายในฟังก์ชัน Lambda และสามารถส่งต่อไปยังบริการอื่น ๆ ได้ตามความต้องการ
เมื่อป้อนข้อความแล้ว SNS จะทริกเกอร์ฟังก์ชัน Lambda หากข้อผิดพลาดใด ๆ พยายามเรียกใช้ฟังก์ชัน Lambda SNS จะลองเรียกฟังก์ชันแลมบ์ดาอีกครั้งไม่เกินสามครั้ง
เหตุการณ์ตัวอย่างของ Amazon SNS
ตัวอย่างเหตุการณ์ที่มีรายละเอียดทั้งหมดที่มีอยู่ในฟังก์ชัน AWS Lambda เพื่อดำเนินการตามขั้นตอนต่อไปแสดงไว้ด้านล่าง -
{
"Records": [{
"EventVersion": "1.0",
"EventSubscriptionArn": eventsubscriptionarn,
"EventSource": "aws:sns",
"Sns": {
"SignatureVersion": "1",
"Timestamp": "1970-01-01T00:00:00.000Z",
"Signature": "EXAMPLE",
"SigningCertUrl": "EXAMPLE",
"MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
"Message": "Hello from SNS!",
"MessageAttributes": {
"Test": {
"Type": "String",
"Value": "TestString"
},
"TestBinary": {
"Type": "Binary",
"Value": "TestBinary"
}
},
"Type": "Notification",
"UnsubscribeUrl": "EXAMPLE",
"TopicArn": topicarn,
"Subject": "TestInvoke"
}
}]
}
Amazon Simple Mail Service
สามารถใช้ Amazon Simple Mail Service เพื่อส่งข้อความและรับข้อความ สามารถเรียกใช้ฟังก์ชัน AWS Lambda บน Simple Mail Service เมื่อได้รับข้อความ
ตัวอย่างเหตุการณ์การรับอีเมลของ Amazon SES
รายละเอียดของเหตุการณ์ SES เมื่อใช้ภายใน AWS Lambda แสดงไว้ด้านล่าง -
{
"Records": [{
"eventVersion": "1.0",
"ses": {
"mail": {
"commonHeaders": {
"from": [
"Jane Doe <[email protected]>"
],
"to": [
"[email protected]"
],
"returnPath": "[email protected]",
"messageId": "<0123456789Source.com>",
"date": "Wed, 7 Oct 2015 12:34:56 -0700",
"subject": "Test Subject"
},
"example": "[email protected]",
"timestamp": "1970-01-01T00:00:00.000Z",
"destination": [
"[email protected]"
],
"headers": [{
"name": "Return-Path",
"value": "<[email protected]>"
},
{
"name": "Received",
"value": "from mailer.example.com (mailer.example.com [203.0.113.1]) by inbound-smtp.us-west-2.amazonaws.com with SMTP id o3vrnil0e2ic for [email protected]; Wed, 07 Oct 2015 12:34:56 +0000 (UTC)"
},
{
"name": "DKIM-Signature",
"value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=example; h=mime-version:from:date:message-id:subject:to:content-type; bh=jX3F0bCAI7sIbkHyy3mLYO28ieDQz2R0P8HwQkklFj4=; b=sQwJ+LMe9RjkesGu+vqU56asvMhrLRRYrWCbV"
},
{
"name": "MIME-Version",
"value": "1.0"
},
{
"name": "From",
"value": "Jane Doe <[email protected]>"
},
{
"name": "Date",
"value": "Wed, 7 Oct 2015 12:34:56 -0700"
},
{
"name": "Message-ID",
"value": "<0123456789example.com>"
},
{
"name": "Subject",
"value": "Test Subject"
},
{
"name": "To",
"value": "[email protected]"
},
{
"name": "Content-Type",
"value": "text/plain; charset=UTF-8"
}],
"headersTruncated": false,
"messageId": "o3vrnil0e2ic28tr"
},
"receipt": {
"recipients": [
"[email protected]"
],
"timestamp": "1970-01-01T00:00:00.000Z",
"spamVerdict": {
"status": "PASS"
},
"dkimVerdict": {
"status": "PASS"
},
"processingTimeMillis": 574,
"action": {
"type": "Lambda",
"invocationType": "Event",
"functionArn": "arn:aws:lambda:us-west-2:012345678912:function:example"
},
"spfVerdict": {
"status": "PASS"
},
"virusVerdict": {
"status": "PASS"
}
}
},
"eventexample": "aws:ses"
}]
}
บันทึก Amazon Cloudwatch
AWS Lambda สามารถเรียกใช้จาก Amazon CloudWatch Logs โดยใช้ไฟล์ CloudWatch Logs Subscriptions. การสมัครใช้งาน CloudWatch Logs มีข้อมูลแบบเรียลไทม์เกี่ยวกับบันทึกซึ่งสามารถประมวลผลและวิเคราะห์ภายใน AWS Lambda หรืออาจใช้เพื่อโหลดไปยังระบบอื่น ๆ
เหตุการณ์ตัวอย่างบันทึกของ Amazon CloudWatch
{
"awslogs": {
"data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
DQiMdxRQEAAA=="
}
}
Amazon API Gateway
สามารถเรียกใช้ฟังก์ชัน AWS Lambda ได้ httpsurl. สามารถทำได้บนGET, POST, PUT. เมื่อเรียกใช้ https url ฟังก์ชัน AWS Lambda จะถูกทริกเกอร์เช่นกันและข้อมูลที่ส่งไปยัง https โดยใช้ get / post สามารถทำให้พร้อมใช้งานภายใน AWS Lambda เพื่อใช้ในการแทรกใน DynamoDB หรือเพื่อส่งอีเมลเป็นต้น
เหตุการณ์คำขอพร็อกซี API เกตเวย์
{
"path": "/test/hello",
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, lzma, sdch, br",
"Accept-Language": "en-US,en;q=0.8",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
"X-Forwarded-For": "192.168.100.1, 192.168.1.1",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"pathParameters": {
"proxy": "hello"
},
"requestContext": {
"accountId": "123456789012",
"reexampleId": "us4z18",
"stage": "test",
"requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
"identity": {
"cognitoIdentityPoolId": "",
"accountId": "",
"cognitoIdentityId": "",
"caller": "",
"apiKey": "",
"exampleIp": "192.168.100.1",
"cognitoAuthenticationType": "",
"cognitoAuthenticationProvider": "",
"userArn": "",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"user": ""
},
"reexamplePath": "/{proxy+}",
"httpMethod": "GET",
"apiId": "wt6mne2s9k"
},
"reexample": "/{proxy+}",
"httpMethod": "GET",
"queryStringParameters": {
"name": "me"
},
"stageVariables": {
"stageVarName": "stageVarValue"
}
}
เหตุการณ์ตอบสนองพร็อกซีของ API เกตเวย์
{
"statusCode": 200,
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, lzma, sdch, br",
"Accept-Language": "en-US,en;q=0.8",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
"X-Forwarded-For": "192.168.100.1, 192.168.1.1",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"body": "Hello World"
}