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

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

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

আপনি এর মাধ্যমে প্রকল্পের বাস্তবায়নে পৌঁছাতে পারেন:URL শর্টনার

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

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

প্রকল্প বিবরণ

প্রকল্পটিতে Upstash Redis এর একটি ডাটাবেস, দুটি Python Lambda ফাংশন এবং AWS-এ একটি API গেটওয়ে রয়েছে। ব্যবহারকারীরা শর্টনার পরিষেবা ব্যবহার করতে ওয়েব ইন্টারফেস বা API ব্যবহার করতে পারে৷

shortener Lambda ফাংশন একটি HTTP অনুরোধ ক্যোয়ারী দেওয়া একটি দীর্ঘ URL থেকে একটি সংক্ষিপ্ত URL কী তৈরি করে। ব্যবহারকারীকে সংক্ষিপ্ত URL ফেরত দেওয়ার আগে এটি সংক্ষিপ্ত URL কী এবং এর সংশ্লিষ্ট দীর্ঘ URL মান Upstash Redis-এ সঞ্চয় করে৷

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

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

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

Upstash Redis সেট আপ করা হচ্ছে

আমরা আপস্ট্যাশ কনসোলে আমাদের রেডিস ডেটাবেস তৈরি করতে পারি। লগ ইন করার পরে, ডেটাবেস তৈরি করুন ক্লিক করুন৷ বোতাম এটি কয়েক সেকেন্ড সময় নেবে এবং আপনি সব সেট আপ হয়ে গেছেন। তারপর, UPSTASH_REDIS_REST_HOST কপি করে পেস্ট করুন , UPSTASH_REDIS_REST_PORT এবং UPSTASH_REDIS_REST_PASSWORD বিশদ বিবরণ থেকে ভেরিয়েবল একটি ফাইলে বিভাগ। আমরা AWS এনভায়রনমেন্ট ভেরিয়েবলে এই কীগুলি ব্যবহার করতে যাচ্ছি।

AWS Lambda-তে সার্ভারবিহীন ফাংশন তৈরি করা

পরবর্তীতে, আমরা আমাদের সার্ভারহীন পাইথন ফাংশন তৈরি করব। AWS-এ লগ ইন করার পর, সরাসরি AWS Lambda-এ যান। ড্যাশবোর্ড থেকে, ল্যাম্বডা ফাংশন তৈরি করুন।

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

ইউআরএল সংক্ষিপ্ত করার জন্য ল্যাম্বডা ফাংশন

এনভায়রনমেন্ট ভেরিয়েবল যোগ করা প্রথম জিনিস। shortener থেকে ফাংশন ওভারভিউ, কনফিগারেশন> এনভায়রনমেন্ট ভেরিয়েবল> সম্পাদনা> এনভায়রনমেন্ট ভেরিয়েবল যোগ করুন এ যান . তারপর, UPSTASH_REDIS_REST_HOST টাইপ করুন , UPSTASH_REDIS_REST_PORT এবং UPSTASH_REDIS_REST_PASSWORD কী হিসাবে, এবং Upstash কনসোল থেকে তাদের সংশ্লিষ্ট মান।

এখন আমরা কোডিং শুরু করতে পারি। কোড-এ ফিরে যান shortener এর বিভাগ ফাংশন, এবং নীচের কোড পেস্ট করুন। এটি আমাদের Upstash Redis ডাটাবেসের সাথে সংযোগ প্রদান করবে।

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
)

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

  • ক্যোয়ারী প্যারামিটার পাওয়া long_url API অনুরোধ URL থেকে,
  • সংক্ষিপ্ত URL-এর জন্য একটি এলোমেলো 7 অক্ষর কী তৈরি করা হচ্ছে,
  • দীর্ঘ URL-এ Upstash Redis-এ এই কী-এর মান সেট করা,
  • প্রতিক্রিয়ার মূল অংশে আমাদের সম্পূর্ণ সংক্ষিপ্ত URL সহ একটি HTTP 200 প্রতিক্রিয়া ফিরিয়ে দেওয়া।

Redis ক্লায়েন্ট তৈরির ঠিক নীচে, generate_short_url যোগ করুন এবং lambda_handler ফাংশন।

def generate_short_url():
 # Define the character set for generating the short URLs
 CHARSET = string.ascii_letters + string.digits
 
 # Generate a random short URL using the character set
 short_url = ''.join(random.choice(CHARSET) for _ in range(7))
 
 # Check if the short URL already exists in Redis
 if redis_client.exists(short_url):
 # If it does, recursively generate a new short URL
 return generate_short_url()
 
 # Otherwise, return the new short 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']}/"
 
 # Generate a unique short URL
 short_url_key = generate_short_url()
 
 # Store the mapping between the short URL and long URL in Redis
 redis_client.set(short_url_key, long_url)
 
 # Return the short URL to the client
 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

তারপর ডিপ্লয় করুন এ ক্লিক করুন যদিও কোডগুলি প্রস্তুত; আপনি যদি এখন ল্যাম্বডা পরীক্ষা করেন, তাহলে আপনি Lambda থেকে নীচের প্রতিক্রিয়া পাবেন

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

কারণ, বাহ্যিক পাইথন লাইব্রেরি ব্যবহার করার জন্য, আমাদের নিজস্ব লাইব্রেরি তৈরি করতে হবে একটি কাস্টম প্যাকেজ হিসাবে এবং তারপর প্যাকেজটিকে ল্যাম্বডার সাথে সংযুক্ত করার উপায় খুঁজে বের করতে হবে। এটি সমাধান করার বিভিন্ন উপায় আছে, কিন্তু আমার যেতে সমাধান ল্যাম্বডা স্তর ব্যবহার করা হবে। এটি আপনাকে বিভ্রান্ত করতে দেবেন না, এটি বরং একটি সহজ প্রক্রিয়া৷

স্তর তৈরি করা

প্রথমত, আমাদের প্যাকেজটি তৈরি করতে হবে এবং জিপ করতে হবে। আপনার স্থানীয় টার্মিনালে যান এবং নীচের কমান্ড টাইপ করুন। এটি একটি 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

তারপর, shortener-এ ফিরে যান AWS-এ ফাংশন এবং সাইডবার থেকে লেয়ারে সরাসরি। স্তর তৈরি করুন-এ ক্লিক করুন এবং প্রয়োজনীয় কনফিগারেশন পূরণ করুন এবং requirements-package.zip আপলোড করুন ফাইল, আমার মতই।

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

যখন লেয়ারটি তৈরি করা হয়, তখন আমাদের এই লেয়ারটিকে আমাদের shortener এর সাথে সংযুক্ত করতে হবে ফাংশন ফাংশনের স্তর বিভাগে যান এবং একটি স্তর যুক্ত করুন ক্লিক করুন৷ বোতাম।

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

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

ইউআরএল পুনঃনির্দেশের জন্য ল্যাম্বডা ফাংশন

redirector তৈরির প্রক্রিয়া ল্যাম্বডা উপরে বর্ণিত হিসাবে একই। এখানে আবার ধাপগুলি রয়েছে:

  • redirector নামে একটি ল্যাম্বডা ফাংশন তৈরি করা হচ্ছে ল্যাম্বডা ড্যাশবোর্ড থেকে।
  • পরিবেশ ভেরিয়েবল সেট করা।
  • ঠিক নিচে প্রদত্ত কোডে টাইপ করুন।
  • requirements-package.zip দিয়ে একটি স্তর তৈরি করা ফাইল (আমরা redis-library-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):
 # Get the short URL from the request path
 short_url = event['pathParameters']['short_url']
 
 # Look up the long URL associated with the short URL in Redis
 long_url = redis_client.get(short_url).decode('utf-8').strip('"')
 
 long_url = format_url_for_redirection(long_url)
 
 # If the short URL doesn't exist, return a 404 error
 if not long_url:
 response = {
 'statusCode': 404,
 'body': json.dumps({'error': 'Short URL not found'})
 }
 return response
 
 # Otherwise, redirect the user to the long URL
 response = {
 'statusCode': 302,
 'headers' : {'Location':long_url},
 'body' : ''
 }
 return response
 
 
def format_url_for_redirection(url):
 if not url.startswith("http://") and not url.startswith("https://"):
 url = "https://" + url
 return url

ঠিক তেমনই, আমাদের ল্যাম্বডাস সব প্রস্তুত! যদিও এটি কার্যকরী, এই ইউআরএল শর্টনারকে একটি অ্যাক্সেসযোগ্য পরিষেবা করতে, আমাদের ল্যাম্বডাস চালানোর একটি উপায় খুঁজে বের করতে হবে। ল্যাম্বডা ফাংশন ব্যবহার করার বিভিন্ন উপায় আছে, কিন্তু এই বাস্তবায়নের জন্য আমরা AWS API গেটওয়ে ব্যবহার করব .

AWS-এ API গেটওয়ে তৈরি করা হচ্ছে

প্রথমে, AWS কনসোল থেকে API গেটওয়েতে যান। ড্যাশবোর্ডে, API তৈরি করুন ক্লিক করুন৷ বোতাম এবং একটি REST API তৈরি করুন . মৌলিক কনফিগারেশন করার পরে, আমাদের কাছে সেকেন্ডের মধ্যে আমাদের API আছে।

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

আমাদের তখন আমাদের ল্যাম্বডা ফাংশনের সাথে API গেটওয়ে সংযোগ করতে হবে। সম্পদ বিভাগে, ক্রিয়া> সম্পদ তৈরি করুন-এ যান . resource name লিখুন এবং resource path .

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

তারপর /shortener-এ ক্লিক করুন সম্পদ-এ পথ এবং ক্রিয়া> পদ্ধতি তৈরি করুন> GET নির্বাচন করুন> নিশ্চিত করুন-এ যান . এই অংশটি বেশ গুরুত্বপূর্ণ, এই কনফিগারেশনটি আমাদেরকে API গেটওয়ে থেকে Lambda ফাংশনে অনুরোধের ডেটা স্থানান্তর করতে সক্ষম করে। নিশ্চিত করুন যে তারা সঠিক!

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

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

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

/{short_url}-এ ক্লিক করুন সম্পদ-এ বিভাগ, তারপর ক্রিয়া> পদ্ধতি তৈরি করুন> GET চয়ন করুন> নিশ্চিত করুন .

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

অবশেষে, আমাদের API সেট আপ করা হয়েছে। চূড়ান্ত ধাপ হল API স্থাপন করা। Actions> Deploy API> Create New Stage-এ যান . প্রয়োজনীয় ক্ষেত্রগুলিতে টাইপ করুন এবং স্থাপন করুন। আমরা এখন একটি পাবলিক API আছে. পর্যায়ে বিভাগে, আপনি আপনার API-এর জন্য সর্বজনীন আহ্বান URL দেখতে পারেন৷

একটি চূড়ান্ত কাজ করতে হবে:serverless-shortener-API এর মাধ্যমে ল্যাম্বডা ফাংশনগুলিকে ট্রিগার করা গেটওয়ে।

shortener-এ যান ল্যাম্বডা ফাংশন, ফাংশন ওভারভিউ-এর মধ্যে বিভাগে, ট্রিগার যোগ করুন ক্লিক করুন বোতাম।

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

আপনি যখন উভয় ফাংশনে ট্রিগার যোগ করেন, তখন আমাদের পাবলিক API এবং Lambda ফাংশনগুলি ব্যবহার করার জন্য প্রস্তুত। shortener-এর জন্য ফাংশন, ট্রিগারিং ইউআরএল পাথ যেমন:

<YOUR_INVOKE_URL>/shortener?short_url="<LONG_URL>"

redirector ট্রিগার করতে ফাংশন, আপনার shortener থেকে প্রতিক্রিয়া প্রয়োজন ফাংশন redirector-এর ট্রিগারিং ইউআরএল নীচের গঠন আছে:

<YOUR_INVOKE_URL>/<SHORT_URL_KEY>

আপনি যখন এটিতে ক্লিক করেন বা এটিতে একটি HTTP অনুরোধ পাঠান, তখন আপনাকে আপনার দীর্ঘ URL-এ পুনঃনির্দেশিত করা হবে৷ আসলে, আমাদের পরিষেবা প্রস্তুত, তবে আমরা কিছুটা ঝকঝকে একটি ওয়েব ইন্টারফেস তৈরি করব৷

ওয়েব ইন্টারফেস তৈরি করা এবং ফাংশন ব্যবহার পরিচালনা করা

আমরা ফ্রন্টএন্ডের জন্য এইচটিএমএল, বুটস্ট্র্যাপ এবং জাভাস্ক্রিপ্ট ব্যবহার করব। যখন ব্যবহারকারী একটি URL টাইপ করে এবং সংক্ষিপ্ত করুন ক্লিক করুন বোতাম, একটি url প্রম্পট করা হবে, ব্যবহারকারীকে মূল ওয়েবসাইটে পুনঃনির্দেশিত করে।

AWS Lambda, Python, এবং Upstash Redis এর সাথে একটি সার্ভারহীন URL শর্টনার তৈরি করুন

এটি কয়েকটি উপাদান সহ একটি বরং সহজ ওয়েবসাইট। প্রথমে, নিচের লাইনটি <head>-এ যোগ করুন বুটস্ট্র্যাপ বৈশিষ্ট্যগুলি ব্যবহার করার জন্য HTML কোড ব্লক করুন।

<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 গেটওয়ে থেকে ডেটা আনা হয়। আমরা জাভাস্ক্রিপ্ট দিয়ে এটি পরিচালনা করব। <body> শেষ হওয়ার আগে অংশ, URL আনার কার্যকারিতা সন্নিবেশ করান। <INVOKE_URL> প্রতিস্থাপন করতে ভুলবেন না আপনার AWS API গেটওয়ে থেকে একটি দিয়ে।

<!-- 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>

চূড়ান্ত শব্দ এবং প্রকল্পের উন্নতি

আমরা আমাদের সার্ভারহীন ইউআরএল শর্টনার প্রকল্পের প্রধান বৈশিষ্ট্যগুলি বাস্তবায়ন করেছি। আমি আশা করি এটি পাইথন ল্যাম্বডা ফাংশন তৈরি এবং সেগুলি গ্রাস করার একটি স্পষ্ট প্রদর্শন হয়েছে। আপনি যদি এই প্রজেক্টে কাজ চালিয়ে যেতে চান তাহলে প্রজেক্টের উন্নতির জন্য আমার কিছু পরামর্শও থাকবে।

  • ইউআরএল শর্টনারের জন্য একটি কাস্টম ডোমেন সেট করা। Invoke URL AWS দ্বারা প্রদত্ত বরং জটিল. যেহেতু এই প্রজেক্টের মূল উদ্দেশ্য ছিল AWS Lambda এবং Upstash Redis প্রদর্শন করা, তাই আমি এই পোস্টটি এর সাথে আর দীর্ঘ করতে চাইনি। কিন্তু আপনি যদি চান তাহলে আপনি AWS API গেটওয়ে থেকে URLটিকে একটি সহজ এবং ছোটে পরিবর্তন করতে পারেন৷
  • এপিআই-এর জন্য আপস্ট্যাশ হার সীমা বাস্তবায়ন করা। আমি এই প্রকল্পের জন্য বিনামূল্যে স্তরের পরিষেবাগুলি ব্যবহার করেছি, কিন্তু আপনি যদি একটি সক্রিয় এবং সর্বজনীন পরিষেবা তৈরি করতে চান, তাহলে আপনার অপ্রত্যাশিত খরচ এড়াতে অনুরোধের সীমা সেট আপ করার কথা বিবেচনা করা উচিত৷
  • ভার্সেলে এই প্রকল্পটি হোস্ট করা হচ্ছে৷

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


  1. HTML DOM অবস্থান হোস্টনাম সম্পত্তি

  2. ডেটা স্ট্রাকচারে কম্প্রেসড কোয়াডট্রিস এবং অকট্রিস

  3. rbash - একটি সীমাবদ্ধ ব্যাশ শেল ব্যবহারিক উদাহরণ সহ ব্যাখ্যা করা হয়েছে

  4. CSS শব্দ মোড়ানো সম্পত্তি