Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

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

आप इस लिंक के माध्यम से प्रोजेक्ट के कार्यान्वयन तक पहुंच सकते हैं: URL Shortener

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

नोट: आउटपुट 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 शॉर्टनर फ्रंटएंड से जुड़ा होगा।

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस 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 फंक्शन बनाएं।

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

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 फाइल अपलोड करें, बिल्कुल मेरे जैसी।

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

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

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

अब, हम 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 होगा।

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

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

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

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

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

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

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

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

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

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

एक अंतिम कार्य शेष है: serverless-shortener-API गेटवे के माध्यम से Lambda फंक्शन को ट्रिगर करना।

shortener Lambda फंक्शन पर जाएं, Function overview सेक्शन के भीतर, Add Trigger बटन पर क्लिक करें।

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस URL शॉर्टनर बनाएं

जब आप दोनों फंक्शन में ट्रिगर जोड़ते हैं, तो हमारा सार्वजनिक 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 प्रॉम्प्ट किया जाएगा, जो यूजर को मूल वेबसाइट पर रीडायरेक्ट करेगा।

AWS Lambda, Python, और Upstash Redis के साथ सर्वरलेस 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 पर होस्ट करना।

पढ़ने के लिए धन्यवाद।

  1. रूबी में स्टैटिक एनालिसिस में महारत: पार्सर जेम के साथ मेथड्स और पैरामीटर्स निकालें रूबी में स्टैटिक एनालिसिस में महारत: पार्सर जेम के साथ मेथड्स और पैरामीटर्स निकालें

    मान लीजिए कि आप अपने सोर्स कोड को पार्स करके अपने सभी मेथड्स ढूंढना चाहते हैं, वे कहां परिभाषित हैं और वे कौन से तर्क लेते हैं। आप यह कैसे कर सकते हैं? आपका पहला विचार इसके लिए एक रेगेक्स लिखना हो सकता है… लेकिन क्या कोई बेहतर तरीका है? हाँ! स्टैटिक एनालिसिस एक तकनीक है जिसका उपयोग आप तब कर सकते है

  1. Tkinter में Messagebox के अंदर Entry बॉक्स कैसे प्राप्त करें? Tkinter में Messagebox के अंदर Entry बॉक्स कैसे प्राप्त करें?

    Tkinter में messagebox लाइब्रेरी के साथ विभिन्न मेथड्स और बिल्ट-इन फ़ंक्शन उपलब्ध हैं। मान लीजिए आप एक मैसेजबॉक्स प्रदर्शित करना चाहते हैं और Entry विजेट में उपयोगकर्ता से कुछ इनपुट लेना चाहते हैं। इस मामले में, आप simpledialog से askstring लाइब्रेरी का उपयोग कर सकते हैं। askstring लाइब्रेरी एक विंड

  1. JavaScript में HTML टेबल के हर एलिमेंट पर IF कंडीशन लागू करना JavaScript में HTML टेबल के हर एलिमेंट पर IF कंडीशन लागू करना

    इसके लिए, आप document.querySelectorAll.forEach() का उपयोग कर सकते हैं।उदाहरणकोड निम्न है:<!DOCTYPE html> <html lang=en> <head>    <meta charset=UTF-8>    <meta name=viewport content=width=device-width, initial-scale=1.0>    <title>Doc