इस ब्लॉग पोस्ट में, मैं आपको Upstash Redis, AWS Lambda (Python), और AWS API Gateway पर बने एक सर्वरलेस URL शॉर्टनर सेवा के निर्माण के माध्यम से मार्गदर्शन करूंगा। इस ब्लॉग पोस्ट का मुख्य उद्देश्य Python Lambda फंक्शन बनाने, इसे Redis से जोड़ने, और API के माध्यम से इसका उपभोग करने की प्रक्रिया को प्रदर्शित करना है।
आप इस लिंक के माध्यम से प्रोजेक्ट के कार्यान्वयन तक पहुंच सकते हैं: URL Shortener

नोट: आउटपुट URL केवल प्रदर्शन उद्देश्यों के लिए हैं; एक सक्रिय URL शॉर्टनर का डोमेन पता छोटा और सरल होगा, इसलिए हमारा ध्यान यहां कार्यक्षमता पर है।
प्रोजेक्ट विवरण
प्रोजेक्ट में Upstash Redis पर एक डेटाबेस, दो Python Lambda फंक्शन, और AWS पर एक API Gateway शामिल हैं। यूजर या तो वेब इंटरफेस या API का उपयोग करके शॉर्टनर सेवा का उपभोग कर सकते हैं।
shortener Lambda फंक्शन HTTP अनुरोध क्वेरी में प्रदान किए गए लंबे URL से एक छोटा URL कुंजी बनाता है। फिर यह छोटे URL कुंजी और उसके संबंधित लंबे URL मान को Upstash Redis में संग्रहीत करता है, और फिर छोटे URL को यूजर को वापस करता है।
redirector Lambda फंक्शन यूजर्स को एक छोटे URL से उसके संबंधित लंबे URL पर रीडायरेक्ट करता है। यह छोटे URL कुंजी का उपयोग करके Redis से लंबे URL को पुनर्प्राप्त करता है और यूजर के ब्राउज़र को HTTP 302 रीडायरेक्शन प्रतिक्रिया भेजता है। यह फंक्शन यूजर्स को लंबे URL को याद रखने या मैन्युअल रूप से दर्ज करने की आवश्यकता के बिना वांछित सामग्री तक पहुंचने में मदद करता है।
अंत में, हम Lambda फंक्शन का उपभोग करने के लिए एक API Gateway बनाएंगे। यह API हमारे बेसिक URL शॉर्टनर फ्रंटएंड से जुड़ा होगा।

Upstash Redis सेटअप करना
हम Upstash Console पर अपना Redis डेटाबेस बना सकते हैं। लॉग इन करने के बाद, Create Database बटन पर क्लिक करें। इसमें कुछ सेकंड लगेंगे, और आप पूरी तरह सेट हो जाएंगे। फिर, Details सेक्शन से UPSTASH_REDIS_REST_HOST, UPSTASH_REDIS_REST_PORT और UPSTASH_REDIS_REST_PASSWORD वेरिएबल को कॉपी करके एक फाइल में पेस्ट करें। हम इन कुंजियों का उपयोग AWS एनवायरनमेंट वेरिएबल में करेंगे।
AWS Lambda पर सर्वरलेस फंक्शन बनाना
अब, हम अपने सर्वरलेस Python फंक्शन बनाएंगे। AWS में लॉग इन करने के बाद, AWS Lambda पर जाएं। डैशबोर्ड से, Lambda फंक्शन बनाएं।

URL शॉर्टनिंग के लिए Lambda फंक्शन
पहली चीज़ एनवायरनमेंट वेरिएबल जोड़ना है। shortener फंक्शन अवलोकन से, Configuration > Environment variables > Edit > Add environment variable पर जाएं। फिर, Upstash Console से उनके संबंधित मानों के साथ UPSTASH_REDIS_REST_HOST, UPSTASH_REDIS_REST_PORT और UPSTASH_REDIS_REST_PASSWORD को कुंजी के रूप में टाइप करें।
अब हम कोडिंग शुरू कर सकते हैं। shortener फंक्शन के Code सेक्शन पर वापस जाएं, और नीचे दिया गया कोड पेस्ट करें। यह हमें Upstash Redis डेटाबेस से कनेक्शन प्रदान करेगा।
import random
import string
import json
import redis
# Redis क्लाइंट बनाएं
redis_client = redis.Redis(
host=UPSTASH_REDIS_REST_HOST,
port=UPSTASH_REDIS_REST_PORT,
password=UPSTASH_REDIS_REST_PASSWORD
)
फिर हम अपना मुख्य शॉर्टनर एल्गोरिदम लागू करेंगे। नीचे दिया गया कोड स्निपेट निम्न कार्य करता है:
- API अनुरोध URL से क्वेरी पैरामीटर
long_urlप्राप्त करना, - छोटे URL के लिए एक रैंडम 7 कैरेक्टर कुंजी जेनरेट करना,
- इस कुंजी का मान Upstash Redis पर लंबे URL पर सेट करना,
- प्रतिक्रिया के शरीर में हमारे पूर्ण छोटे URL के साथ HTTP 200 प्रतिक्रिया वापस करना।
Redis क्लाइंट निर्माण के ठीक नीचे, generate_short_url और lambda_handler फंक्शन जोड़ें।
def generate_short_url():
# छोटे URL जेनरेट करने के लिए कैरेक्टर सेट परिभाषित करें
CHARSET = string.ascii_letters + string.digits
# कैरेक्टर सेट का उपयोग करके एक रैंडम छोटा URL जेनरेट करें
short_url = ''.join(random.choice(CHARSET) for _ in range(7))
# जांचें कि छोटा URL पहले से Redis में मौजूद है या नहीं
if redis_client.exists(short_url):
# यदि हां, तो पुनरावर्ती रूप से एक नया छोटा URL जेनरेट करें
return generate_short_url()
# अन्यथा, नया छोटा URL वापस करें
return short_url
def lambda_handler(event, context):
long_url = event["queryStringParameters"]['long_url']
base_url = f"https://{event['headers']['Host']}/{event['requestContext']['stage']}/"
# एक यूनिक छोटा URL जेनरेट करें
short_url_key = generate_short_url()
# Redis में छोटे URL और लंबे URL के बीच मैपिंग संग्रहीत करें
redis_client.set(short_url_key, long_url)
# क्लाइंट को छोटा URL वापस करें
response_body = {
'short_url': base_url + short_url_key,
}
response = {
'statusCode': 200,
'headers': {'ContentType': 'application/json', "Access-Control-Allow-Origin": "*"},
'body': json.dumps(response_body)
}
return response
फिर Deploy पर क्लिक करें। भले ही कोड तैयार हैं; यदि आप अभी Lambda का परीक्षण करते हैं, तो आपको Lambda से नीचे दी गई प्रतिक्रिया मिलेगी:
Unable to import module 'lambda_function': No module named 'redis'
ऐसा इसलिए है क्योंकि बाहरी Python लाइब्रेरी का उपयोग करने के लिए, हमें अपने स्वयं के लाइब्रेरी को एक कस्टम पैकेज के रूप में बनाने की आवश्यकता है और फिर उस पैकेज को Lambda से जोड़ने का एक तरीका खोजने की आवश्यकता है। इसे हल करने के कई तरीके हैं, लेकिन मेरा पसंदीदा समाधान Lambda Layers का उपयोग करना होगा। इससे भ्रमित न हों, यह एक काफी सरल प्रक्रिया है।
Layer बनाना
सबसे पहले, हमें पैकेज बनाना और ज़िप करना होगा। अपने स्थानीय टर्मिनल पर जाएं और नीचे दिए गए कमांड टाइप करें। यह requirements-package.zip फाइल को पैकेज फोल्डर में Redis के साथ इंस्टॉल करके बनाएगा।
mkdir packages
cd packages
python3 -m venv venv
source venv/bin/activate
mkdir python
cd python
pip install redis -t .
rm -rf *dist-info
cd ..
zip -r requirements-package.zip python
फिर, AWS पर shortener फंक्शन पर वापस जाएं और साइडबार से Layers पर जाएं। Create layer पर क्लिक करें और आवश्यक कॉन्फिगरेशन भरें और requirements-package.zip फाइल अपलोड करें, बिल्कुल मेरे जैसी।

जब Layer बन जाए, तो हमें इस Layer को अपने shortener फंक्शन से जोड़ना होगा। फंक्शन के Layers सेक्शन पर जाएं और Add a layer बटन पर क्लिक करें।

अब, हम URL को छोटा करने में सक्षम होना चाहिए। शेष कार्य short_url कुंजी से लंबे URL को पुनर्प्राप्त करना और ब्राउज़र को उस URL पर रीडायरेक्ट करना है। इसके लिए, हम एक redirector Lambda फंक्शन बनाएंगे।
URL रीडायरेक्शन के लिए Lambda फंक्शन
redirector Lambda बनाने की प्रक्रिया ऊपर वर्णित के समान है। यहां चरण एक बार फिर दिए गए हैं:
- Lambda डैशबोर्ड से
redirectorनाम का एक Lambda फंक्शन बनाना। - एनवायरनमेंट वेरिएबल सेट करना।
- नीचे दिए गए कोड को टाइप करना।
requirements-package.zipफाइल के साथ एक Layer बनाना। (हम इस मामले में फिर सेredis-library-layerका उपयोग कर सकते हैं, आवश्यकताएं समान हैं।)- Lambda फंक्शन में Layer जोड़ना।
यहां redirector Lambda के लिए मुख्य एल्गोरिदम है।
import json
import redis
# Redis क्लाइंट बनाएं
redis_client = redis.Redis(
host=UPSTASH_REDIS_REST_HOST,
port=UPSTASH_REDIS_REST_PORT,
password=UPSTASH_REDIS_REST_PASSWORD
)
def lambda_handler(event, context):
# अनुरोध पथ से छोटा URL प्राप्त करें
short_url = event['pathParameters']['short_url']
# Redis में छोटे URL से जुड़े लंबे URL को देखें
long_url = redis_client.get(short_url).decode('utf-8').strip('"')
long_url = format_url_for_redirection(long_url)
# यदि छोटा URL मौजूद नहीं है, तो 404 त्रुटि वापस करें
if not long_url:
response = {
'statusCode': 404,
'body': json.dumps({'error': 'Short URL not found'})
}
return response
# अन्यथा, यूजर को लंबे URL पर रीडायरेक्ट करें
response = {
'statusCode': 302,
'headers': {'Location': long_url},
'body': ''
}
return response
def format_url_for_redirection(url):
if not url.startswith("https://") and not url.startswith("https://"):
url = "https://" + url
return url
बस, हमारे Lambda तैयार हैं! हालांकि यह कार्यात्मक है, इस URL शॉर्टनर को एक सुलभ सेवा बनाने के लिए, हमें अपने Lambda को चलाने का एक तरीका खोजना होगा। Lambda फंक्शन का उपभोग करने के कई तरीके हैं, लेकिन इस कार्यान्वयन के लिए हम AWS API Gateway का उपयोग करेंगे।
AWS पर API Gateway बनाना
सबसे पहले, AWS Console से API Gateway पर जाएं। डैशबोर्ड में, Create API बटन पर क्लिक करें और REST API बनाएं। बेसिक कॉन्फिगरेशन करने के बाद, हमारे पास कुछ ही सेकंड में हमारा API होगा।

फिर हमें API Gateway को अपने Lambda फंक्शन से जोड़ना होगा। Resources सेक्शन में, Actions > Create Resource पर जाएं। resource name और resource path दर्ज करें।

फिर Resources में /shortener पथ पर क्लिक करें और Actions > Create Method > Select GET > Confirm पर जाएं। यह भाग काफी महत्वपूर्ण है, यह कॉन्फिगरेशन हमें API Gateway से Lambda फंक्शन को अनुरोध डेटा ट्रांसफर करने में सक्षम बनाता है। सुनिश्चित करें कि वे सही हैं!

हमने शॉर्टनर फंक्शन को अपने API से जोड़ दिया है, इसलिए अब हम अपने URL को छोटा कर सकते हैं। हालांकि, हमारी सेवा को काम करने के लिए redirector Lambda फंक्शन को API से जोड़ने की आवश्यकता है। Resources में / पर क्लिक करें, Actions > Create Resource पर जाएं।

Resources सेक्शन में /{short_url} पर क्लिक करें, फिर Actions > Create Method > Choose GET > Confirm।

अंत में, हमारा API सेट हो गया है। अंतिम चरण API को डेप्लॉय करना है। Actions > Deploy API > Create New Stage पर जाएं। आवश्यक फ़ील्ड टाइप करें और डेप्लॉय करें। अब हमारे पास एक सार्वजनिक API है। Stages सेक्शन में, आप अपने API के लिए सार्वजनिक Invoke URL देख सकते हैं।
एक अंतिम कार्य शेष है: serverless-shortener-API गेटवे के माध्यम से Lambda फंक्शन को ट्रिगर करना।
shortener Lambda फंक्शन पर जाएं, Function overview सेक्शन के भीतर, Add Trigger बटन पर क्लिक करें।

जब आप दोनों फंक्शन में ट्रिगर जोड़ते हैं, तो हमारा सार्वजनिक API और Lambda फंक्शन उपभोग के लिए तैयार हैं। shortener फंक्शन के लिए, ट्रिगरिंग URL पथ इस प्रकार है:
<YOUR_INVOKE_URL>/shortener?long_url="<LONG_URL>"
redirector फंक्शन को ट्रिगर करने के लिए, आपको shortener फंक्शन से प्रतिक्रिया की आवश्यकता होगी। redirector के लिए ट्रिगरिंग URL की संरचना नीचे दी गई है:
<YOUR_INVOKE_URL>/<SHORT_URL_KEY>
जब आप इस पर क्लिक करते हैं या इस पर HTTP अनुरोध भेजते हैं, तो आप अपने लंबे URL पर रीडायरेक्ट हो जाएंगे। वास्तव में, हमारी सेवा तैयार है, लेकिन हम थोड़ी चमक के लिए एक वेब इंटरफेस बनाएंगे।
वेब इंटरफेस बनाना और फंक्शन उपयोग को संभालना
हम फ्रंटएंड के लिए HTML, Bootstrap और JavaScript का उपयोग करेंगे। जब यूजर एक URL टाइप करता है और Shorten बटन पर क्लिक करता है, तो एक URL प्रॉम्प्ट किया जाएगा, जो यूजर को मूल वेबसाइट पर रीडायरेक्ट करेगा।

यह कुछ तत्वों के साथ एक काफी सरल वेबसाइट है। सबसे पहले, HTML कोड के <head> ब्लॉक में निम्नलिखित लाइन जोड़ें ताकि Bootstrap सुविधाओं का उपयोग किया जा सके।
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"/>
<body> ब्लॉक के भीतर, हमारे पास मुख्य HTML तत्व होंगे।
<div class="container mt-5">
<h1 class="mb-4 text-center">URL Shortener</h1>
<div class="row justify-content-center">
<div class="col-md-6">
<div class="input-group mb-3">
<input type="text" class="form-control" id="url-input" placeholder="Enter URL to shorten" />
<div class="input-group-append">
<button class="btn btn-primary" type="button" id="shorten-btn"> Shorten </button>
</div>
</div>
<a id="short-url" class="d-none"></a>
</div>
</div>
</div>
तत्वों को जोड़ने के बाद, केवल API Gateway से डेटा प्राप्त करना शेष है। हम इसे JavaScript से संभालेंगे। <body> भाग के अंत से पहले, URL प्राप्त करने की कार्यक्षमता डालें। अपने AWS API Gateway से <INVOKE_URL> को बदलना न भूलें।
<!-- Add Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<!-- Add custom JS -->
<script>
const shortenBtn = document.getElementById("shorten-btn");
const urlInput = document.getElementById("url-input");
const urlOutput = document.getElementById("short-url");
shortenBtn.addEventListener("click", async function () {
let long_url = urlInput.value;
const apiUrl = `<INVOKE_URL>/shortener?long_url="${long_url}"`;
const response = await fetch(apiUrl);
const data = await response.json();
shortUrl = data.short_url;
urlOutput.innerHTML = shortUrl;
urlOutput.href = shortUrl;
urlOutput.classList.remove("d-none");
});
</script>
अंतिम शब्द और प्रोजेक्ट सुधार
हमने अपने सर्वरलेस URL शॉर्टनर प्रोजेक्ट के लिए मुख्य विशेषताओं को लागू किया है। मुझे आशा है कि यह Python Lambda फंक्शन बनाने और उनका उपभोग करने का एक स्पष्ट प्रदर्शन रहा होगा। यदि आप इस प्रोजेक्ट पर काम करते रहना चाहते हैं तो मेरे पास प्रोजेक्ट को बेहतर बनाने के कुछ सुझाव भी हैं।
- URL शॉर्टनर के लिए एक कस्टम डोमेन सेट करना। AWS द्वारा दिया गया
Invoke URLकाफी जटिल है। चूंकि इस प्रोजेक्ट का मुख्य उद्देश्य AWS Lambda और Upstash Redis को प्रदर्शित करना था, मैं इसे लंबा नहीं करना चाहता था। लेकिन अगर आप चाहें तो AWS API Gateway से URL को सरल और छोटा बना सकते हैं। - API के लिए Upstash Rate Limit लागू करना। मैंने इस प्रोजेक्ट के लिए फ्री टियर सेवाओं का उपयोग किया है, लेकिन यदि आप एक सक्रिय और सार्वजनिक सेवा बनाने का इरादा रखते हैं, तो अप्रत्याशित लागत से बचने के लिए अनुरोध सीमा सेट करने पर विचार करना चाहिए।
- इस प्रोजेक्ट को Vercel पर होस्ट करना।
पढ़ने के लिए धन्यवाद।