AWS SDK Lambda: Functions Invoke करा आणि Python, PHP, Node.js मध्ये Handlers लिहा
Lambda servers शिवाय code चालवतो. दोन्ही बाजू करू: Python, Node.js आणि PHP (Bref) मध्ये handlers लिहा, एक deploy करा, आणि तिन्ही SDKs मधून functions invoke करा — उत्तराची वाट पाहत, fire-and-forget, आणि logs वाचत. Example: Zurich मधल्या Hans आणि Bengaluru मधल्या Neha साठी currency converter.
या chapter मध्ये तुम्ही काय शिकाल
- Python, Node.js, PHP मध्ये handler
- Package करून function बनवा
- Sync invoke करून payload वाचा
- Async invoke
- Env vars आणि logs
1. मोठं चित्र: vending machine
हे का लागतं?
Button दाबलं की vending machine जागं होतं, coffee बनवतं, परत झोपतं. उभ्या machine चे नाही, प्रत्येक coffee चे पैसे. Lambda handler = recipe; invoke = button दाबणं; event = कोणतं button दाबलं.
हे काय आहे?
Handler ला event (JSON) आणि context (request ID, उरलेला वेळ) मिळतो आणि तो JSON परत देतो. RequestResponse invoke result ची वाट पाहतो; Event queue करून लगेच 202 देतो.
कसं करायचं (step by step)
2. तीन भाषांत handler
हे का लागतं?
Hans CHF मध्ये घड्याळं विकतो; Neha INR मध्ये prices दाखवते. एक छोटं function दोन्ही दुकानांसाठी amounts convert करतं.
हे काय आहे?
Python आणि Node.js managed runtimes. PHP Bref layer (provided.al2023) ने Lambda वर चालतो. तिन्हींमध्ये input व output सारखाच JSON.
कसं करायचं (step by step)
- Python handler: app.py.
# app.py
import json, os
RATES = json.loads(os.environ.get("RATES", '{"CHF_INR": 95.2, "EUR_INR": 90.1, "USD_INR": 83.9}'))
def handler(event, context):
pair = f'{event["from"]}_{event["to"]}'
amount = round(event["amount"] * RATES[pair], 2)
print(f"convert {event} -> {amount} req={context.aws_request_id}")
return {"pair": pair, "amount": amount}
अपेक्षित output:
(saved app.py)
- Node.js handler: index.mjs.
// index.mjs
const RATES = JSON.parse(process.env.RATES ?? '{"CHF_INR":95.2,"EUR_INR":90.1,"USD_INR":83.9}');
export const handler = async (event, context) => {
const pair = `${event.from}_${event.to}`;
const amount = Math.round(event.amount * RATES[pair] * 100) / 100;
console.log("convert", event, "->", amount, "req", context.awsRequestId);
return { pair, amount };
};
अपेक्षित output:
(saved index.mjs)
- Bref सह PHP handler: index.php.
<?php
// composer require bref/bref
// index.php
require __DIR__ . "/vendor/autoload.php";
return function (array $event, $context) {
$rates = json_decode(getenv("RATES") ?: '{"CHF_INR":95.2,"EUR_INR":90.1,"USD_INR":83.9}', true);
$pair = $event["from"] . "_" . $event["to"];
$amount = round($event["amount"] * $rates[$pair], 2);
error_log("convert $pair -> $amount");
return ["pair" => $pair, "amount" => $amount];
};
अपेक्षित output:
(saved index.php)
- Deploy आधी Python handler locally test करा.
python -c "import app,types;print(app.handler({'from':'CHF','to':'INR','amount':250},types.SimpleNamespace(aws_request_id='local')))"
अपेक्षित output:
convert {'from': 'CHF', 'to': 'INR', 'amount': 250} -> 23800.0 req=local
{'pair': 'CHF_INR', 'amount': 23800.0}
3. Code मधून function बनवा
हे का लागतं?
Function console वर click करून नाही, deploy script किंवा CI job ने बनवायला/update करायला हवं.
हे काय आहे?
CreateFunction ला name, runtime, handler, execution role ARN आणि zip bytes लागतात. नंतर UpdateFunctionCode code बदलतो. Function Active होईपर्यंत wait.
कसं करायचं (step by step)
- Python handler zip करा.
zip fx.zip app.py
unzip -l fx.zip | tail -1
अपेक्षित output:
412 1 file
- Python: create_function आणि wait.
import boto3
lam = boto3.client("lambda", region_name="eu-central-2")
with open("fx.zip", "rb") as f:
lam.create_function(
FunctionName="fx-convert", Runtime="python3.12", Handler="app.handler",
Role="arn:aws:iam::111122223333:role/lambda-basic-exec", Code={"ZipFile": f.read()},
Timeout=10, MemorySize=256, Environment={"Variables": {"RATES": '{"CHF_INR": 95.2, "EUR_INR": 90.1, "USD_INR": 83.9}'}},
)
lam.get_waiter("function_active_v2").wait(FunctionName="fx-convert")
print(lam.get_function(FunctionName="fx-convert")["Configuration"]["State"])
अपेक्षित output:
Active
- Node.js: नंतर code update.
import { LambdaClient, UpdateFunctionCodeCommand, waitUntilFunctionUpdatedV2 } from "@aws-sdk/client-lambda";
import { readFileSync } from "node:fs";
const lam = new LambdaClient({ region: "eu-central-2" });
const r = await lam.send(new UpdateFunctionCodeCommand({ FunctionName: "fx-convert", ZipFile: readFileSync("fx.zip") }));
await waitUntilFunctionUpdatedV2({ client: lam, maxWaitTime: 60 }, { FunctionName: "fx-convert" });
console.log("CodeSha256:", r.CodeSha256);
अपेक्षित output:
CodeSha256: q2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v=
- Verify.
aws lambda get-function-configuration --function-name fx-convert --region eu-central-2 --query "[Runtime,State,LastUpdateStatus]" --output text
अपेक्षित output:
python3.12 Active Successful
4. Sync invoke
हे का लागतं?
Neha च्या checkout page ला render आधी आत्ताच INR price हवी.
हे काय आहे?
RequestResponse StatusCode 200 आणि Payload देतो. Handler ने error टाकला तरी StatusCode 200 असतो पण FunctionError set होतो — नेहमी तपासा.
कसं करायचं (step by step)
- Python.
import boto3, json
lam = boto3.client("lambda", region_name="eu-central-2")
r = lam.invoke(FunctionName="fx-convert", Payload=json.dumps({"from": "CHF", "to": "INR", "amount": 250}))
if "FunctionError" in r:
raise RuntimeError(r["Payload"].read())
print(r["StatusCode"], json.loads(r["Payload"].read()))
अपेक्षित output:
200 {'pair': 'CHF_INR', 'amount': 23800.0}
- PHP.
<?php
require "vendor/autoload.php";
$lam = new Aws\Lambda\LambdaClient(["region" => "eu-central-2"]);
$r = $lam->invoke(["FunctionName" => "fx-convert", "Payload" => json_encode(["from" => "EUR", "to" => "INR", "amount" => 40])]);
if (!empty($r["FunctionError"])) { throw new RuntimeException((string) $r["Payload"]); }
echo $r["StatusCode"], " ", (string) $r["Payload"], PHP_EOL;
अपेक्षित output:
200 {"pair": "EUR_INR", "amount": 3604.0}
- Node.js: Uint8Array payload decode करा.
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";
const lam = new LambdaClient({ region: "eu-central-2" });
const r = await lam.send(new InvokeCommand({ FunctionName: "fx-convert", Payload: JSON.stringify({ from: "USD", to: "INR", amount: 19.99 }) }));
if (r.FunctionError) throw new Error(new TextDecoder().decode(r.Payload));
console.log(r.StatusCode, JSON.parse(new TextDecoder().decode(r.Payload)));
अपेक्षित output:
200 { pair: 'USD_INR', amount: 1677.16 }
- Verify: चुकीचा pair FunctionError दाखवतो.
aws lambda invoke --function-name fx-convert --region eu-central-2 --cli-binary-format raw-in-base64-out --payload '{"from":"GBP","to":"JPY","amount":1}' out.json --query FunctionError --output text
cat out.json
अपेक्षित output:
Unhandled
{"errorMessage": "'GBP_JPY'", "errorType": "KeyError", ...}
5. Async invoke आणि logs
हे का लागतं?
Order नंतर receipt पाठवणं background मध्ये होऊ शकतं. Customer ने त्याची वाट पाहू नये.
हे काय आहे?
InvocationType Event लगेच 202 देतो; error आला तर Lambda दोनदा retry करतो. Sync call वर LogType Tail शेवटचे 4 KB logs base64 मध्ये देतो.
कसं करायचं (step by step)
- Python: fire and forget.
import boto3, json
lam = boto3.client("lambda", region_name="eu-central-2")
r = lam.invoke(FunctionName="fx-convert", InvocationType="Event", Payload=json.dumps({"from": "CHF", "to": "INR", "amount": 99}))
print(r["StatusCode"])
अपेक्षित output:
202
- Node.js: एका call चे logs tail.
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";
const lam = new LambdaClient({ region: "eu-central-2" });
const r = await lam.send(new InvokeCommand({ FunctionName: "fx-convert", LogType: "Tail", Payload: JSON.stringify({ from: "EUR", to: "INR", amount: 10 }) }));
console.log(Buffer.from(r.LogResult, "base64").toString().split("\n").filter(l => l.startsWith("convert")));
अपेक्षित output:
[ "convert {'from': 'EUR', 'to': 'INR', 'amount': 10} -> 901.0 req=3f1c..." ]
- PHP: async invoke.
<?php
require "vendor/autoload.php";
$lam = new Aws\Lambda\LambdaClient(["region" => "eu-central-2"]);
$r = $lam->invoke(["FunctionName" => "fx-convert", "InvocationType" => "Event", "Payload" => json_encode(["from" => "USD", "to" => "INR", "amount" => 5])]);
echo $r["StatusCode"], PHP_EOL;
अपेक्षित output:
202
- Verify: logs मध्ये सगळे calls.
aws logs tail /aws/lambda/fx-convert --region eu-central-2 --since 10m | grep -c convert
अपेक्षित output:
5
6. हाच call Java, Go, .NET आणि CLI मध्ये
हे का लागतं?
Teams अनेकदा भाषा मिसळतात. Python, PHP आणि Node.js मध्ये call समजला की बाकीचे SDKs म्हणजे तोच API, फक्त syntax वेगळा.
हे काय आहे?
सगळे Invoke API call करतात. Terminal मधून पटकन test करायला CLI ओळ वापरा.
कसं करायचं (step by step)
| Stack | Code |
|---|---|
| AWS CLI | aws lambda invoke --function-name fx-convert --cli-binary-format raw-in-base64-out --payload '{"from":"CHF","to":"INR","amount":1}' out.json |
| Java v2 | InvokeResponse r = lambda.invoke(b -> b.functionName("fx-convert").payload(SdkBytes.fromUtf8String(json))); |
| Go v2 | out, _ := client.Invoke(ctx, &lambda.InvokeInput{FunctionName: aws.String("fx-convert"), Payload: []byte(json)}) |
| .NET | var r = await lambda.InvokeAsync(new InvokeRequest { FunctionName = "fx-convert", Payload = json }); |
7. काहीही खर्च चालू राहू नये म्हणून cleanup
हे का लागतं?
चालू ठेवलेले lab resources पैसे खातात आणि security risk बनतात.
हे काय आहे?
उलट्या क्रमाने delete करा: आधी children, मग parents.
कसं करायचं (step by step)
- Function आणि log group delete करा.
aws lambda delete-function --function-name fx-convert --region eu-central-2
aws logs delete-log-group --log-group-name /aws/lambda/fx-convert --region eu-central-2
अपेक्षित output:
(no output means success)
Ravindra Bagale's Tip
200 देणारा sync invoke सुद्धा failure असू शकतो. प्रत्येक भाषेत, प्रत्येक वेळी FunctionError तपासा.
8. मुलाखत प्रश्न आणि उत्तरं
प्र. RequestResponse vs Event?
Wait करून payload vs queue करून 202.
प्र. Handler error कसा ओळखायचा?
FunctionError field, StatusCode 200 असला तरी.
प्र. PHP Lambda वर कसा चालतो?
Bref custom runtime layer.
प्र. Clients handler बाहेर का?
Warm calls reuse, latency कमी.
प्र. एका invoke चे logs कसे?
LogType Tail किंवा CloudWatch.
घरी करून बघा
- Node.js handler fx-convert-node म्हणून deploy करून Python मधून invoke करा.
- UpdateFunctionConfiguration ने RATES मध्ये GBP_INR जोडून test करा.
थोडक्यात सांगायचं तर
- Handler = event in, JSON out.
- CreateFunction + waiter; UpdateFunctionCode.
- Sync invoke: FunctionError तपासा.
- Event invoke 202.
- Tail किंवा CloudWatch logs.
सराव Tasks
Aurangabad Pharma हा छत्रपती संभाजीनगर मधला औषधनिर्मिती व्यवसाय आहे. Dr. Farhan Shaikh त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे INR मध्ये मोजले जातात आणि AWS resources ap-south-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 12
सोपं Functions ची list
का: या Region मध्ये कोणते functions आहेत ते पाहा.
काय करायचं: ap-south-1 मधले Lambda functions दाखवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Function invoke करा
का: Invoke function आत्ता चालवतो व उत्तर file मध्ये ठेवतो.
काय करायचं: abadpharma-orders-fn invoke करा व response out.json मध्ये ठेवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Lambda role साठी trust policy
का: Trust policy role कोण घेऊ शकतो ते सांगते.
काय करायचं: lambda.amazonaws.com ला role assume करू देणारी trust policy लिहा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम Timeout व memory बदला
का: जास्त memory म्हणजे जास्त CPU; timeout अडकलेले runs थांबवतो.
काय करायचं: abadpharma-orders-fn चा timeout 30 seconds व memory 512 MB करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Function ला logs लिहू द्या
का: या actions शिवाय Lambda logs CloudWatch मध्ये दिसत नाहीत.
काय करायचं: फक्त arn:aws:logs:*:*:* वर logs:CreateLogGroup, logs:CreateLogStream, logs:PutLogEvents allow करा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम Logs live पाहा
का: aws logs tail --follow म्हणजे CloudWatch Logs साठी tail -f.
काय करायचं: /aws/lambda/abadpharma-orders-fn log group live follow करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Lambda function बनवा
का: Lambda ला code zip, runtime, handler नाव व execution role लागतो.
काय करायचं: abadpharma-orders-fn function बनवा: runtime python3.12, handler app.handler, role arn:aws:iam::112055250461:role/lambda-basic, code function.zip मध्ये.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Environment variables द्या
का: Table नावांसारख्या settings code बाहेर ठेवा.
काय करायचं: abadpharma-orders-fn वर environment variable TABLE=abadpharma-orders द्या.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड JSON payload सह invoke करा
का: CLI v2 मध्ये raw JSON साठी --cli-binary-format raw-in-base64-out लागतो.
काय करायचं: abadpharma-orders-fn ला payload {"orderId":"o-101"} (raw JSON) सह invoke करा व उत्तर out.json मध्ये.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Lambda GB-seconds
का: Lambda memory × time bill करतो.
काय करायचं: 1,000,000 invocations, 512 MB, प्रत्येकी 200 ms. किती GB-seconds?
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
अवघड SQS queue Lambda ला जोडा
का: Event source mapping मुळे Lambda queue poll करून batches मध्ये messages process करतो.
काय करायचं: Queue arn:aws:sqs:ap-south-1:112055250461:abadpharma-orders पासून abadpharma-orders-fn ला batch size 10 सह event source mapping बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड S3 ला function call करू द्या
का: S3 function invoke करण्याआधी resource-based permission लागते.
काय करायचं: abadpharma-orders-fn ला s3invoke permission statement द्या: s3.amazonaws.com ने bucket arn:aws:s3:::abadpharma-uploads कडून lambda:InvokeFunction करावं.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
उजळणी, तुलना आणि मुलाखत cards
हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.




अजून cards: Ravi Sir's Cards.