Ravindra BagaleCourses & study guides English

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)

Code पासून result पर्यंतHandler लिहाZip करून role सह create-functionInvoke (RequestResponse किंवा Event)Payload / StatusCode वाचाCloudWatch logs पाहा
Clients handler च्या बाहेर बनवा म्हणजे warm invocations ते reuse करतात.

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)

  1. 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)
  1. 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)
  1. 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)
  1. 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)

  1. Python handler zip करा.
zip fx.zip app.py
unzip -l fx.zip | tail -1

अपेक्षित output:

      412                     1 file
  1. 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
  1. 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=
  1. 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)

  1. 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}
  1. 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}
  1. 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 }
  1. 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)

  1. 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
  1. 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..." ]
  1. 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
  1. 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)

StackCode
AWS CLIaws lambda invoke --function-name fx-convert --cli-binary-format raw-in-base64-out --payload '{"from":"CHF","to":"INR","amount":1}' out.json
Java v2InvokeResponse r = lambda.invoke(b -> b.functionName("fx-convert").payload(SdkBytes.fromUtf8String(json)));
System.out.println(r.payload().asUtf8String());
Go v2out, _ := client.Invoke(ctx, &lambda.InvokeInput{FunctionName: aws.String("fx-convert"), Payload: []byte(json)})
fmt.Println(string(out.Payload))
.NETvar r = await lambda.InvokeAsync(new InvokeRequest { FunctionName = "fx-convert", Payload = json });
Console.WriteLine(Encoding.UTF8.GetString(r.Payload.ToArray()));

7. काहीही खर्च चालू राहू नये म्हणून cleanup

हे का लागतं?

चालू ठेवलेले lab resources पैसे खातात आणि security risk बनतात.

हे काय आहे?

उलट्या क्रमाने delete करा: आधी children, मग parents.

कसं करायचं (step by step)

  1. 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.

घरी करून बघा

  1. Node.js handler fx-convert-node म्हणून deploy करून Python मधून invoke करा.
  2. UpdateFunctionConfiguration ने RATES मध्ये GBP_INR जोडून test करा.

थोडक्यात सांगायचं तर

  1. Handler = event in, JSON out.
  2. CreateFunction + waiter; UpdateFunctionCode.
  3. Sync invoke: FunctionError तपासा.
  4. Event invoke 202.
  5. Tail किंवा CloudWatch logs.

सराव Tasks

या scenario बद्दल

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 दाखवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम Function invoke करा

का: Invoke function आत्ता चालवतो व उत्तर file मध्ये ठेवतो.

काय करायचं: abadpharma-orders-fn invoke करा व response out.json मध्ये ठेवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम Lambda role साठी trust policy

का: Trust policy role कोण घेऊ शकतो ते सांगते.

काय करायचं: lambda.amazonaws.com ला role assume करू देणारी trust policy लिहा.

कसं करायचं:
  1. { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
  2. प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
  3. Task ला लागेल तेवढंच द्या (least privilege).
  4. Double quotes व commas नीट वापरा. Check answer दाबा.

मध्यम Timeout व memory बदला

का: जास्त memory म्हणजे जास्त CPU; timeout अडकलेले runs थांबवतो.

काय करायचं: abadpharma-orders-fn चा timeout 30 seconds व memory 512 MB करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम Function ला logs लिहू द्या

का: या actions शिवाय Lambda logs CloudWatch मध्ये दिसत नाहीत.

काय करायचं: फक्त arn:aws:logs:*:*:* वर logs:CreateLogGroup, logs:CreateLogStream, logs:PutLogEvents allow करा.

कसं करायचं:
  1. { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
  2. प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
  3. Task ला लागेल तेवढंच द्या (least privilege).
  4. Double quotes व commas नीट वापरा. Check answer दाबा.

मध्यम Logs live पाहा

का: aws logs tail --follow म्हणजे CloudWatch Logs साठी tail -f.

काय करायचं: /aws/lambda/abadpharma-orders-fn log group live follow करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. 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 मध्ये.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड Environment variables द्या

का: Table नावांसारख्या settings code बाहेर ठेवा.

काय करायचं: abadpharma-orders-fn वर environment variable TABLE=abadpharma-orders द्या.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. 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 मध्ये.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड Lambda GB-seconds

का: Lambda memory × time bill करतो.

काय करायचं: 1,000,000 invocations, 512 MB, प्रत्येकी 200 ms. किती GB-seconds?

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. 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 बनवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. 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 करावं.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

उजळणी, तुलना आणि मुलाखत cards

हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.

Lambda handlers. Event in, JSON out. Python def handler(event, context). Node export const handler = async. PHP Bref layer ने.
उजळणी card: Lambda handlers · PNG download करा · Card page उघडा
Lambda invoke. RequestResponse wait करतो. 200 असला तरी FunctionError तपासा. Event 202 देतो. LogType Tail: शेवटचे 4 KB.
उजळणी card: Lambda invoke · PNG download करा · Card page उघडा
RequestResponse vs Event. हो, payload. / नाही, 202.
तुलना: RequestResponse vs Event · PNG download करा · Card page उघडा
Invoke 200 पण fail?. Handler ने error टाकला. FunctionError set असतो. Code मध्ये नेहमी तपासा.
मुलाखत card: Invoke 200 पण fail? · PNG download करा · Card page उघडा

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