কম্পিউটার টিউটোরিয়াল

AWS Lambda, Python এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

এই ব্লগ পোস্টে, আমি আপনাকে আপস্ট্যাশ রেডিস, AWS Lambda (Python), এবং AWS API Gateway-র ওপর নির্মিত একটি সার্ভারলেস URL শর্টনার সার্ভিস তৈরির প্রক্রিয়ায় গাইড করব। এই পোস্টের মূল উদ্দেশ্য হলো একটি Python Lambda ফাংশন তৈরি করা, সেটিকে রেডিসের সাথে সংযোগ করা, এবং API-এর মাধ্যমে এটি ব্যবহার করা প্রক্রিয়াটি প্রদর্শন করা।

প্রজেক্টের একটি বাস্তবায়ন পেতে পারেন: URL Shortener

AWS Lambda, Python এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

দ্রষ্টব্য: আউটপুট URLগুলো প্রদর্শন উদ্দেশ্যে; একটি সক্রিয় URL শর্টনারের সংক্ষিপ্ত এবং সহজ ডোমেইন ঠিকানা থাকবে, তাই আমরা এখানে ফাংশনালিটির ওপর ফোকাস করছি।

প্রজেক্ট বিবরণ

প্রজেক্টটি আপস্ট্যাশ রেডিসে একটি ডেটাবেস, দুটি Python Lambda ফাংশন, এবং AWS-এ একটি API Gateway নিয়ে গঠিত। ব্যবহারকারীরা ওয়েব ইন্টারফেস বা API যেকোনো একটি ব্যবহার করে শর্টনার সার্ভিস ব্যবহার করতে পারেন।

shortener Lambda ফাংশনটি একটি HTTP রিকোয়েস্ট কোয়েরি থেকে প্রদত্ত দীর্ঘ URL থেকে একটি সংক্ষিপ্ত URL কী তৈরি করে। তারপর সংক্ষিপ্ত URL কী এবং এর সংশ্লিষ্ট দীর্ঘ URL মান আপস্ট্যাশ রেডিসে সংরক্ষণ করে, এবং সংক্ষিপ্ত URL ব্যবহারকারীর কাছে ফেরত দেয়।

redirector Lambda ফাংশন ব্যবহারকারীদের সংক্ষিপ্ত URL থেকে এর সংশ্লিষ্ট দীর্ঘ URL-এ রিডাইরেক্ট করে। এটি সংক্ষিপ্ত URL কী ব্যবহার করে রেডিস থেকে দীর্ঘ URL পুনরুদ্ধার করে এবং ব্যবহারকারীর ব্রাউজারের কাছে HTTP 302 রিডাইরেকশন রেসপন্স পাঠায়। এই ফাংশন ব্যবহারকারীদের দীর্ঘ URL মনে রাখতে বা ম্যানুয়ালি লিখতে না হলে কাঙ্ক্ষিত কন্টেন্ট অ্যাক্সেস করতে সাহায্য করে।

শেষে, আমরা Lambda ফাংশনগুলো ব্যবহার করার জন্য একটি API Gateway তৈরি করব। এই API আমাদের বেসিক URL শর্টনার ফ্রন্টএন্ডের সাথে সংযুক্ত থাকবে।

AWS Lambda, Python এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

আপস্ট্যাশ রেডিস সেটআপ

আমরা আপস্ট্যাশ কনসোলে আমাদের রেডিস ডেটাবেস তৈরি করতে পারি। লগইন করার পর, 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 এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

URL সংক্ষিপ্ত করার জন্য Lambda ফাংশন

প্রথম কাজ হলো এনভায়রনমেন্ট ভেরিয়েবল যোগ করা। shortener ফাংশন ওভারভিউ থেকে, Configuration > Environment variables > Edit > Add environment variable-এ যান। তারপর UPSTASH_REDIS_REST_HOST, UPSTASH_REDIS_REST_PORT এবং UPSTASH_REDIS_REST_PASSWORD কী হিসেবে টাইপ করুন, এবং আপস্ট্যাশ কনসোল থেকে তাদের সংশ্লিষ্ট মানগুলো দিন।

এখন আমরা কোডিং শুরু করতে পারি। shortener ফাংশনের Code সেকশনে ফিরে যান, এবং নিচের কোডটি পেস্ট করুন। এটি আপস্ট্যাশ রেডিস ডেটাবেসের সাথে সংযোগ সরবরাহ করবে।

import random
import string
import json
import redis
# Create a redis client.
redis_client = redis.Redis(
    host= UPSTASH_REDIS_REST_HOST,
    port= UPSTASH_REDIS_REST_PORT,
    password= UPSTASH_REDIS_REST_PASSWORD
)

তারপর আমরা আমাদের মূল শর্টনার অ্যালগরিদম বাস্তবায়ন করব। নিচের কোড স্নিপেটটি কী করছে:

  • API রিকোয়েস্ট URL থেকে long_url কোয়েরি প্যারামিটার পাওয়া,
  • সংক্ষিপ্ত URL-এর জন্য একটি র‍্যান্ডম ৭ অক্ষরের কী তৈরি করা,
  • আপস্ট্যাশ রেডিসে এই কীটির মান দীর্ঘ URL হিসেবে সেট করা,
  • রেসপন্স বডিতে আমাদের পূর্ণ সংক্ষিপ্ত URL সহ HTTP 200 রেসপন্স ফেরত দেওয়া।

রেডিস ক্লায়েন্ট তৈরির ঠিক নিচে 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 ইতিমধ্যে আছে কিনা চেক করা
    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()
    # সংক্ষিপ্ত 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 টেস্ট করেন, আপনি নিচের রেসপন্স পাবেন:

Unable to import module 'lambda_function': No module named 'redis'

এটি কারণ, এক্সটার্নাল Python লাইব্রেরি ব্যবহার করতে, আমাদের নিজস্ব লাইব্রেরিগুলো একটি কাস্টম প্যাকেজ হিসেবে তৈরি করতে হবে এবং তারপর সেই প্যাকেজটি Lambda-র সাথে আট্যাচ করার উপায় খুঁজে বের করতে হবে। এটি সমাধান করার кіль উপায় আছে, কিন্তু আমার পছন্দের সমাধান হলো Lambda Layers ব্যবহার করা। এটা আপনাকে বিভ্রান্ত করবে না, এটি নাকি খুব সহজ একটি প্রক্রিয়া।

Layer তৈরি করা

প্রথমে, আমাদের প্যাকেজ তৈরি এবং জিপ করতে হবে। আপনার লোকাল টার্মিনালে যান এবং নিচের কমান্ডগুলো টাইপ করুন। এতে packages ফোল্ডারে রেডিস ইনস্টল করা requirements-package.zip ফাইল তৈরি হবে।

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 এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

Layer তৈরি হয়ে গেলে, এটি আমাদের shortener ফাংশনের সাথে সংযুক্ত করতে হবে। ফাংশনের Layers সেকশনে যান এবং Add a layer বাটনে ক্লিক করুন।

AWS Lambda, Python এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

এখন, আমাদের URL সংক্ষিপ্ত করতে পারা উচিত। বাকি থাকছে short_url কী থেকে দীর্ঘ URL পুনরুদ্ধার করে ব্রাউজারকে সেটিতে রিডাইরেক্ট করা। সেটির জন্য আমরা একটি redirector Lambda ফাংশন তৈরি করব।

URL রিডাইরেকশনের জন্য Lambda ফাংশন

redirector Lambda তৈরি করার প্রক্রিয়া উপরের মতোই। একবার আবার ধাপগুলো:

  • Lambda ড্যাশবোর্ড থেকে redirector নামে একটি Lambda ফাংশন তৈরি করা।
  • এনভায়রনমেন্ট ভেরিয়েবল সেট করা।
  • নিচে দেওয়া কোডটি লিখা।
  • requirements-package.zip ফাইল দিয়ে একটি layer তৈরি করা। (এই কেসে redis-library-layer আবার ব্যবহার করা যাবে, কারণ রিকোয়ারমেন্ট একই।)
  • Lambda ফাংশনের সাথে layer যোগ করা।

রিডাইরেক্টর Lambda-এর মূল অ্যালগরিদম এখানে:

import json
import redis
# Create a redis client.
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']
    # রেডিসে সংক্ষিপ্ত 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

এভাবেই, আমাদের লেম্বডাগুলো প্রস্তুত! যদিও এটি ফাংশনাল, এই URL শর্টনারকে একটি অ্যাক্সেসযোগ্য সার্ভিস बनाने 위해서는 আমাদের লেম্বডাগুলো চালানোর উপায় খুঁজে বের করতে হবে। Lambda ফাংশন ব্যবহার করার বেশ কিছু উপায় আছে, কিন্তু এই বাস্তবায়নের জন্য আমরা AWS API Gateway ব্যবহার করব।

AWS-এ API Gateway তৈরি

প্রথমে, AWS কনসোল থেকে API Gateway-এ যান। ড্যাশবোর্ডে, Create API বাটনে ক্লিক করুন এবং একটি REST API বিল্ড করুন। বেসিক কনফিগারেশন করার পর, আমাদের API সেকেন্ডღন prêts।

AWS Lambda, Python এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

তারপর আমাদের API Gatewayকে Lambda ফাংশনগুলোর সাথে সংযুক্ত করতে হবে। Resources সেকশনে, Actions > Create Resource-এ যান। resource name এবং resource path লিখুন।

AWS Lambda, Python এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

তারপর Resources-এ /shortener পাথে ক্লিক করুন এবং Actions > Create Method > Select GET > Confirm-এ যান। এই অংশ খুব গুরুত্বপূর্ণ, এই কনফিগারেশন আমাদের API Gateway থেকে Lambda ফাংশনে রিকোয়েস্ট ডেটা ট্রান্সফার করতে সক্ষম করে। নিশ্চিত করুন যে সেগুলো সঠিক!

AWS Lambda, Python এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

আমরা শর্টনার ফাংশনকে আমাদের API-র সাথে সংযুক্ত করেছি, তাই এখন আমরা আমাদের URL সংক্ষিপ্ত করতে পারি। যাইহোক, আমাদের সার্ভিস কাজ করার জন্য redirector Lambda ফাংশনকেও API-এর সাথে সংযুক্ত করতে হবে। Resources-এ /-এ ক্লিক করুন, Actions > Create Resource-এ যান।

AWS Lambda, Python এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস URL শর্টনার তৈরি করুন

Resources সেকশনে /{short_url}-এ ক্লিক করুন, তারপর Actions > Create Method > Choose GET > Confirm।

AWS Lambda, Python এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস 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 এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস 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 এবং আপস্ট্যাশ রেডিস দিয়ে সার্ভারলেস 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 এবং আপস্ট্যাশ রেডিস প্রদর্শন ছিল, আমি এই পোস্টটি আরও দীর্ঘ করতে চাইনি। কিন্তু আপনি চাইলে AWS API Gateway থেকে আরও সহজ এবং সংক্ষিপ্ত URL-এ পরিবর্তন করতে পারেন।
  • API-এর জন্য আপস্ট্যাশ রেট লিমিট বাস্তবায়ন করা। আমি এই প্রজেক্টে ফ্রি টিয়ার সার্ভিস ব্যবহার করেছি, কিন্তু আপনি যদি একটি সক্রিয় এবং পাবলিক সার্ভিস বানাতে চান, তো আপনাকে অনাকাঙ্ক্ষিত খরচ এড়াতে রিকোয়েস্ট লিমিট সেট আপ করা উচিত।
  • এই প্রজেক্ট Vercel-এ হোস্ট করা।

পড়ার জন্য ধন্যবাদ।

  1. CSS দিয়ে রেসপন্সিভ টেবিল তৈরি করার পদ্ধতি

  2. Redis ZREMRANGEBYLEX মাস্টার করুন: ভ্যালু রেঞ্জ অনুযায়ী সোর্টেড সেট এলিমেন্ট মুছে ফেলুন

  3. পাইথনে লগারিদমিক Y-অক্ষ বিন প্লট করা

  4. macOS-এ MySQL ইনস্টলেশন