Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Trong bài đăng trên blog này, tôi sẽ hướng dẫn bạn xây dựng dịch vụ rút ngắn URL không có máy chủ được xây dựng trên Upstash Redis, AWS Lambda (Python) và AWS API Gateway. Mục đích chính của bài đăng blog này là minh họa quy trình tạo hàm Lambda Python, kết nối hàm đó với Redis và sử dụng hàm đó thông qua API.

Bạn có thể tiếp cận việc triển khai dự án thông qua:URL Shortener

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

LƯU Ý :Các URL đầu ra là dành cho mục đích trình diễn; công cụ rút ngắn URL đang hoạt động sẽ có địa chỉ miền ngắn hơn và đơn giản hơn, vì vậy, trọng tâm của chúng tôi ở đây là chức năng.

Mô tả dự án

Dự án bao gồm một cơ sở dữ liệu trên Upstash Redis, hai hàm Python Lambda và một Cổng API trên AWS. Người dùng có thể sử dụng giao diện web hoặc API để sử dụng dịch vụ rút ngắn.

shortener Hàm Lambda tạo khóa URL rút ngắn từ một URL dài được cung cấp trong truy vấn yêu cầu HTTP. Sau đó, nó lưu trữ khóa URL ngắn và giá trị URL dài tương ứng trong Upstash Redis, trước khi trả lại URL ngắn cho người dùng.

redirector Hàm Lambda chuyển hướng người dùng từ một URL ngắn sang URL dài tương ứng. Nó truy xuất URL dài từ Redis bằng khóa URL ngắn và gửi phản hồi chuyển hướng HTTP 302 tới trình duyệt của người dùng. Chức năng này giúp người dùng truy cập nội dung mong muốn mà không cần phải nhớ lại hay nhập thủ công URL dài.

Cuối cùng, chúng ta sẽ tạo một Cổng API để sử dụng các hàm Lambda. API này sẽ được kết nối với giao diện người dùng rút ngắn URL cơ bản của chúng tôi.

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Thiết lập Upstash Redis

Chúng tôi có thể tạo Cơ sở dữ liệu Redis trên Bảng điều khiển Upstash. Sau khi đăng nhập, nhấp vào Tạo cơ sở dữ liệu nút. Sẽ mất vài giây và bạn đã thiết lập xong. Sau đó, sao chép và dán UPSTASH_REDIS_REST_HOST , UPSTASH_REDIS_REST_PORTUPSTASH_REDIS_REST_PASSWORD các biến từ Chi tiết phần vào một tập tin. Chúng ta sẽ sử dụng các khóa này trong các biến môi trường AWS.

Tạo các chức năng phi máy chủ trên AWS Lambda

Tiếp theo, chúng ta sẽ tạo các hàm Python không có máy chủ. Sau khi đăng nhập vào AWS, hãy chuyển thẳng đến AWS Lambda. Từ Trang tổng quan, tạo hàm lambda.

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Chức năng Lambda để rút ngắn URL

Điều đầu tiên cần làm là thêm các biến môi trường. Từ shortener tổng quan về hàm, đi tới Cấu hình> Biến môi trường> Chỉnh sửa> Thêm biến môi trường . Sau đó, nhập UPSTASH_REDIS_REST_HOST , UPSTASH_REDIS_REST_PORTUPSTASH_REDIS_REST_PASSWORD làm khóa và các giá trị tương ứng của chúng từ Bảng điều khiển Upstash.

Bây giờ chúng ta có thể bắt đầu viết mã. Quay lại phần của shortener chức năng và dán mã bên dưới. Điều này sẽ cung cấp cho chúng tôi kết nối tới Cơ sở dữ liệu 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
)

Sau đó, chúng tôi sẽ triển khai thuật toán rút ngắn chính của mình. Đoạn mã bên dưới có tác dụng gì:

  • lấy tham số truy vấn long_url từ URL yêu cầu API,
  • tạo khóa 7 ký tự ngẫu nhiên cho URL rút ngắn,
  • đặt giá trị của khóa này trên Upstash Redis thành URL dài,
  • trả về Phản hồi HTTP 200 với URL ngắn đầy đủ của chúng tôi trong nội dung phản hồi.

Ngay bên dưới phần tạo ứng dụng khách Redis, hãy thêm generate_short_urllambda_handler chức năng.

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

Sau đó nhấp vào Triển khai .Mặc dù mã đã sẵn sàng; nếu bạn kiểm tra lambda bây giờ, bạn sẽ nhận được phản hồi bên dưới từ Lambda

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

Đó là bởi vì, để sử dụng các thư viện Python bên ngoài, chúng ta cần tạo các thư viện của riêng mình dưới dạng gói tùy chỉnh, sau đó tìm cách đính kèm gói đó vào Lambda. Có một số cách để giải quyết vấn đề này, nhưng giải pháp phù hợp nhất của tôi sẽ là sử dụng Lớp Lambda. Đừng để điều đó làm bạn bối rối, đây là một quá trình khá đơn giản.

Tạo lớp

Đầu tiên, chúng ta phải tạo và nén gói. Đi đến thiết bị đầu cuối cục bộ của bạn và gõ các lệnh bên dưới. Điều đó sẽ tạo ra một requirements-package.zip tập tin trong thư mục gói có cài đặt 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

Sau đó, quay lại shortener hoạt động trên AWS và chuyển thẳng đến Lớp từ thanh bên. Nhấp vào Tạo lớp và điền cấu hình cần thiết rồi tải lên requirements-package.zip tập tin, giống hệt như của tôi.

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Khi lớp được tạo, chúng ta cần kết nối lớp này với shortener của chúng ta chức năng. Đi tới phần Lớp của hàm và nhấp vào Thêm lớp nút.

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Bây giờ, chúng ta có thể rút ngắn các URL. Việc còn lại là truy xuất URL dài từ short_url key và chuyển hướng trình duyệt đến URL đó. Để làm được điều đó, chúng ta sẽ tạo một redirector hàm lambda.

Hàm Lambda để chuyển hướng URL

Quá trình tạo redirector lambda giống như mô tả ở trên. Đây là các bước một lần nữa:

  • Tạo hàm lambda có tên redirector từ bảng điều khiển Lambda.
  • Đặt biến môi trường.
  • Nhập mã được cung cấp ngay bên dưới.
  • Tạo một lớp với requirements-package.zip tập tin. (Chúng tôi có thể sử dụng redis-library-layer một lần nữa, các yêu cầu đều giống nhau trong trường hợp này.)
  • Thêm lớp vào hàm lambda.

Đây là thuật toán chính cho lambda chuyển hướng.

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

Cứ như vậy, lambdas của chúng ta đã sẵn sàng! Mặc dù đây là chức năng nhưng để biến trình rút gọn URL này thành một dịch vụ có thể truy cập được, chúng tôi phải tìm cách chạy lambdas của mình. Có một số cách để sử dụng hàm lambda, nhưng để triển khai việc này, chúng tôi sẽ sử dụng Cổng API AWS .

Tạo Cổng API trên AWS

Đầu tiên, hãy truy cập API Gateway từ Bảng điều khiển AWS. Trong trang tổng quan, nhấp vào Tạo API và xây dựng API REST . Sau khi thực hiện cấu hình cơ bản, chúng tôi có API sau vài giây.

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Sau đó, chúng tôi cần kết nối Cổng API với các hàm Lambda của mình. Trong phần tài nguyên, hãy đi tới Hành động> Tạo tài nguyên . Nhập resource nameresource path .

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Sau đó bấm vào /shortener đường dẫn trong Tài nguyên và đi tới Hành động> Tạo phương thức> Chọn NHẬN> Xác nhận . Phần này khá quan trọng, cấu hình này cho phép chúng ta chuyển dữ liệu yêu cầu từ API Gateway sang các hàm Lambda. Hãy chắc chắn rằng chúng đúng!

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Chúng tôi đã kết nối chức năng rút ngắn với API của mình, vì vậy giờ đây chúng tôi có thể rút ngắn URL của mình. Tuy nhiên, chúng ta cần redirector Hàm Lambda được kết nối với API để dịch vụ của chúng tôi hoạt động. Bấm vào / trong Tài nguyên , hãy đi tới Hành động> Tạo tài nguyên .

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Bấm vào /{short_url} trong Tài nguyên phần, sau đó Hành động> Tạo phương pháp> Chọn NHẬN> Xác nhận .

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Cuối cùng, API của chúng tôi đã được thiết lập. Bước cuối cùng là triển khai API. Đi tới Hành động> Triển khai API> Tạo giai đoạn mới . Nhập vào các trường cần thiết và triển khai. Bây giờ chúng tôi có API công khai. Trong Giai đoạn phần này, bạn có thể thấy URL gọi công khai cho API của mình.

Còn một nhiệm vụ cuối cùng cần thực hiện:kích hoạt Hàm Lambda thông qua serverless-shortener-API cổng.

Đi tới shortener Hàm Lambda, trong phần Tổng quan về hàm hãy nhấp vào Thêm trình kích hoạt nút.

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Khi bạn thêm trình kích hoạt vào cả hai hàm, API công khai và hàm Lambda của chúng tôi sẽ sẵn sàng sử dụng. Đối với shortener chức năng, đường dẫn URL kích hoạt như sau:

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

Để kích hoạt redirector chức năng, bạn sẽ cần phản hồi từ shortener chức năng. URL kích hoạt cho redirector có cấu trúc như sau:

<YOUR_INVOKE_URL>/<SHORT_URL_KEY>

Khi bạn nhấp vào nó hoặc gửi Yêu cầu HTTP tới nó, bạn sẽ được chuyển hướng đến URL dài của mình. Trên thực tế, dịch vụ của chúng tôi đã sẵn sàng nhưng chúng tôi sẽ tạo một giao diện web lấp lánh một chút.

Tạo giao diện web và sử dụng chức năng xử lý

Chúng tôi sẽ sử dụng HTML, Bootstrap và JavaScript cho giao diện người dùng. Khi người dùng nhập URL và nhấp vào Rút ngắn nút, một url sẽ được nhắc, chuyển hướng người dùng đến trang web gốc.

Xây dựng Trình rút ngắn URL không có máy chủ bằng AWS Lambda, Python và Upstash Redis

Đây là một trang web khá đơn giản với một vài yếu tố. Đầu tiên, thêm dòng sau vào <head> khối mã HTML để sử dụng các tính năng của Bootstrap.

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"/>

Trong <body> block, chúng ta sẽ có các phần tử HTML chính.

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

Sau khi thêm các phần tử, chỉ còn lại việc tìm nạp dữ liệu từ Cổng API. Chúng tôi sẽ xử lý việc đó bằng JavaScript. Trước khi kết thúc <body> phần, hãy chèn chức năng tìm nạp URL. Đừng quên thay thế <INVOKE_URL> bằng một cái từ Cổng API AWS của bạn.

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

Lời cuối cùng và cải tiến dự án

Chúng tôi đã triển khai các tính năng chính cho dự án rút ngắn URL không có máy chủ của mình. Tôi hy vọng đây là minh chứng rõ ràng về việc tạo và sử dụng các hàm Python Lambda. Tôi cũng sẽ có một số gợi ý để cải thiện dự án nếu bạn muốn tiếp tục thực hiện dự án này.

  • Đặt miền tùy chỉnh cho trình rút ngắn URL. Invoke URL do AWS cung cấp khá phức tạp. Vì mục đích chính của dự án này là trình diễn AWS Lambda và Upstash Redis nên tôi không muốn làm bài viết này dài hơn nữa. Tuy nhiên, nếu muốn, bạn có thể thay đổi URL thành URL đơn giản hơn và ngắn hơn từ AWS API Gateway.
  • Triển khai giới hạn tốc độ tải lên cho API. Tôi đã sử dụng các dịch vụ cấp miễn phí cho dự án này, nhưng nếu bạn có ý định xây dựng một dịch vụ công cộng và đang hoạt động, bạn nên cân nhắc việc thiết lập giới hạn yêu cầu để tránh những chi phí phát sinh ngoài dự kiến.
  • Lưu trữ dự án này trên Vercel.

Cảm ơn đã đọc.