परिचय: Rust Serverless के लिए आदर्श भाषा क्यों है
\n\nServerless-आर्किटेक्चर आधुनिक क्लाउड एप्लिकेशन के लिए मानक बन गया है। हालांकि, पारंपरिक भाषाएं (Python, Node.js) अक्सर धीमी कोल्ड स्टार्ट और उच्च मेमोरी खपत से ग्रस्त होती हैं। Rust इन समस्याओं को हल करता है: इसके कंपाइल किए गए बाइनरी मिलीसेकंड में शुरू होते हैं, और मेमोरी की खपत न्यूनतम होती है। इस लेख में, हम देखेंगे कि Rust पर AWS Lambda फ़ंक्शन कैसे बनाएं, डिप्लॉय करें और ऑप्टिमाइज़ करें — एनवायरनमेंट सेटअप से लेकर production-डिप्लॉय तक।
1. एनवायरनमेंट और टूल्स का सेटअप
\n\nRust और Cargo Lambda की स्थापना
\nAWS Lambda पर Rust के साथ काम करने के लिए आवश्यक:
\n- \n
- Rust (
rustupके माध्यम से स्थापना) \n - Cargo Lambda — बिल्ड और डिप्लॉय के लिए आधिकारिक टूल \n
- AWS CLI कॉन्फ़िगर किए गए credentials के साथ \n
# Rust की स्थापना\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n\n# Cargo Lambda की स्थापना\ncargo install cargo-lambda\n\n# जांच\ncargo lambda --version\n\nनया प्रोजेक्ट बनाना
\nCargo Lambda स्वचालित रूप से Lambda Runtime API के समर्थन के साथ एक टेम्पलेट उत्पन्न करता है:
\n\ncargo lambda new my-rust-lambda\ncd my-rust-lambda\n\nप्रोजेक्ट संरचना में lambda_runtime और serde निर्भरताओं के साथ Cargo.toml, साथ ही बेसिक हैंडलर फ़ंक्शन के साथ src/main.rs फ़ाइल शामिल है।
2. Rust पर पहला Serverless फ़ंक्शन लिखना
\n\nहैंडलर की बुनियादी संरचना
\nएक सरल Lambda-फ़ंक्शन पर विचार करें जो नाम के साथ JSON लेता है और अभिवादन लौटाता है:
\n\nuse lambda_runtime::{service_fn, LambdaEvent, Error};\nuse serde::{Deserialize, Serialize};\n\n#[derive(Deserialize)]\nstruct Request {\n name: String,\n}\n\n#[derive(Serialize)]\nstruct Response {\n message: String,\n request_id: String,\n}\n\nasync fn handler(event: LambdaEvent<Request>) -> Result<Response, Error> {\n let req = event.payload;\n let resp = Response {\n message: format!("नमस्ते, {}! तुम Rust पर हो!", req.name),\n request_id: event.context.request_id,\n };\n Ok(resp)\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n lambda_runtime::run(service_fn(handler)).await\n}\n\nमुख्य बिंदु:
\n- \n
service_fnएसिंक्रोनस फ़ंक्शन को हैंडलर में लपेटता है \n LambdaEventमें payload और कॉन्टेक्स्ट (request_id, deadline आदि) होता है \n serdeके माध्यम से सीरियलाइज़ेशन/डीसीरियलाइज़ेशन \n
लोकल टेस्टिंग
\nडिप्लॉय से पहले फ़ंक्शन को लोकल रूप से टेस्ट करें:
\n\ncargo lambda watch\n# दूसरे टर्मिनल में:\ncargo lambda invoke --data-ascii '{"name": "दुनिया"}'\n\nआपको उत्तर मिलना चाहिए: {"message":"नमस्ते, दुनिया! तुम Rust पर हो!","request_id":"..."}
3. AWS सेवाओं (S3, DynamoDB) के साथ काम करना
\n\nAWS SDK के माध्यम से S3 के साथ एकीकरण
\nCargo.toml में जोड़ें:
[dependencies]\naws-sdk-s3 = "1.0"\naws-config = "1.0"\n\nS3 से ऑब्जेक्ट पढ़ने वाले फ़ंक्शन का उदाहरण:
\n\nuse aws_sdk_s3::Client;\n\nasync fn handler(event: LambdaEvent<Request>) -> Result<Response, Error> {\n let config = aws_config::load_from_env().await;\n let s3_client = Client::new(&config);\n\n let bucket = "my-bucket";\n let key = &event.payload.name;\n\n let object = s3_client\n .get_object()\n .bucket(bucket)\n .key(key)\n .send()\n .await?;\n\n let body = object.body.collect().await?;\n let content = String::from_utf8(body.to_vec())?;\n\n Ok(Response {\n message: format!("फ़ाइल की सामग्री: {}", content),\n request_id: event.context.request_id,\n })\n}\n\nमें