Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

ในบล็อกโพสต์นี้ ผมจะแนะนำคุณเกี่ยวกับการสร้างบริการย่อ URL แบบไร้เซิร์ฟเวอร์ที่สร้างบน Upstash Redis, AWS Lambda (Python) และ AWS API Gateway วัตถุประสงค์หลักของโพสต์บล็อกนี้คือเพื่อสาธิตกระบวนการสร้างฟังก์ชัน Python Lambda เชื่อมต่อกับ Redis และใช้งานผ่าน API

คุณสามารถเข้าถึงการดำเนินโครงการได้ทาง:URL Shortener

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

หมายเหตุ :URL ผลลัพธ์มีไว้เพื่อการสาธิต เครื่องมือย่อ URL ที่ใช้งานอยู่จะมีที่อยู่โดเมนที่สั้นกว่าและเรียบง่ายกว่า ดังนั้นเราจึงมุ่งเน้นไปที่ฟังก์ชันการทำงาน

คำอธิบายโครงการ

โปรเจ็กต์ประกอบด้วยฐานข้อมูลหนึ่งฐานข้อมูลบน Upstash Redis, ฟังก์ชัน Python Lambda สองฟังก์ชัน และ API Gateway บน AWS ผู้ใช้อาจใช้เว็บอินเตอร์เฟสหรือ API เพื่อใช้บริการที่สั้นลง

01 ฟังก์ชัน Lambda สร้างคีย์ URL แบบสั้นจาก URL แบบยาวที่ให้ไว้ในแบบสอบถามคำขอ HTTP จากนั้นจะจัดเก็บคีย์ URL แบบสั้นและค่า URL แบบยาวที่เกี่ยวข้องใน Upstash Redis ก่อนที่จะส่งคืน URL แบบสั้นให้กับผู้ใช้

18 ฟังก์ชัน Lambda เปลี่ยนเส้นทางผู้ใช้จาก URL แบบสั้นไปยัง URL แบบยาวที่เกี่ยวข้อง โดยดึง URL แบบยาวจาก Redis โดยใช้คีย์ URL แบบสั้น และส่งการตอบสนองการเปลี่ยนเส้นทาง HTTP 302 ไปยังเบราว์เซอร์ของผู้ใช้ ฟังก์ชันนี้ช่วยให้ผู้ใช้เข้าถึงเนื้อหาที่ต้องการโดยไม่จำเป็นต้องจำหรือป้อน URL แบบยาวด้วยตนเอง

สุดท้ายนี้ เราจะสร้าง API Gateway เพื่อใช้ฟังก์ชัน Lambda API นี้จะเชื่อมต่อกับส่วนหน้าเครื่องมือย่อ URL พื้นฐานของเรา

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

การตั้งค่า Upstash Redis

เราสามารถสร้างฐานข้อมูล Redis ของเราบน Upstash Console หลังจากเข้าสู่ระบบแล้ว ให้คลิก สร้างฐานข้อมูล ปุ่ม จะใช้เวลาสักครู่ และคุณก็พร้อมแล้ว จากนั้นคัดลอกและวาง 28 , 35 และ 43 ตัวแปรจาก รายละเอียด ส่วนเป็นไฟล์. เราจะใช้คีย์เหล่านี้ในตัวแปรสภาพแวดล้อม AWS

การสร้างฟังก์ชันไร้เซิร์ฟเวอร์บน AWS Lambda

ต่อไป เราจะสร้างฟังก์ชัน Python แบบไร้เซิร์ฟเวอร์ หลังจากเข้าสู่ระบบ AWS ให้ตรงไปที่ AWS Lambda จากแดชบอร์ด ให้สร้างฟังก์ชัน lambda

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

ฟังก์ชัน Lambda สำหรับการย่อ URL

สิ่งแรกที่ต้องทำคือเพิ่มตัวแปรสภาพแวดล้อม จาก 58 ภาพรวมฟังก์ชัน ไปที่ การกำหนดค่า> ตัวแปรสภาพแวดล้อม> แก้ไข> เพิ่มตัวแปรสภาพแวดล้อม . จากนั้นพิมพ์ 62 , 74 และ 87 เป็นคีย์และค่าที่เกี่ยวข้องจาก Upstash Console

ตอนนี้เราสามารถเริ่มเขียนโค้ดได้แล้ว กลับไปที่ โค้ด ส่วนของ 94 ฟังก์ชั่นและวางโค้ดด้านล่าง สิ่งนี้จะทำให้เราเชื่อมต่อกับฐานข้อมูล 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
)

จากนั้นเราจะใช้อัลกอริธึมตัวย่อหลักของเรา ข้อมูลโค้ดด้านล่างนี้ทำอะไร:

  • รับพารามิเตอร์การค้นหา 107 จาก URL คำขอ API
  • สร้างคีย์ 7 ตัวอักษรแบบสุ่มสำหรับ URL แบบสั้น
  • การตั้งค่าของคีย์นี้บน Upstash Redis เป็น URL แบบยาว
  • ส่งคืนการตอบกลับ HTTP 200 พร้อมด้วย URL แบบสั้นแบบเต็มของเราในเนื้อหาของการตอบกลับ

ใต้การสร้างไคลเอ็นต์ Redis ให้เพิ่ม 114 และ 125 ฟังก์ชั่น

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

จากนั้นคลิกปรับใช้ .แม้ว่ารหัสจะพร้อมก็ตาม หากคุณทดสอบแลมบ์ดาตอนนี้ คุณจะได้รับคำตอบด้านล่างจากแลมบ์ดา

130

นั่นเป็นเพราะว่าในการใช้ไลบรารี Python ภายนอก เราจำเป็นต้องสร้างไลบรารีของเราเองเป็นแพ็คเกจแบบกำหนดเอง จากนั้นจึงหาวิธีแนบแพ็คเกจกับ Lambda มีหลายวิธีในการแก้ไขปัญหานี้ แต่วิธีแก้ปัญหาหลักของฉันคือการใช้ Lambda Layers อย่าปล่อยให้สิ่งนั้นทำให้คุณสับสน มันเป็นกระบวนการที่ค่อนข้างง่าย

การสร้างเลเยอร์

ก่อนอื่นเราต้องสร้างและบีบอัดแพ็คเกจ ไปที่เทอร์มินัลท้องถิ่นของคุณแล้วพิมพ์คำสั่งด้านล่าง นั่นจะสร้าง 148 ในโฟลเดอร์แพ็คเกจที่ติดตั้ง 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

จากนั้นกลับไปที่ 157 ทำงานบน AWS และตรงไปยังเลเยอร์จากแถบด้านข้าง คลิกที่สร้างเลเยอร์ และกรอกการกำหนดค่าที่จำเป็นแล้วอัปโหลด 166 ไฟล์คล้ายกับของฉัน

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

เมื่อสร้างเลเยอร์แล้ว เราจำเป็นต้องเชื่อมต่อเลเยอร์นี้กับ 170 ของเรา ฟังก์ชั่น ไปที่ส่วนเลเยอร์ของฟังก์ชันแล้วคลิก เพิ่มเลเยอร์ ปุ่ม.

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

ตอนนี้เราควรจะสามารถย่อ URL ให้สั้นลงได้ สิ่งที่เหลืออยู่คือการเรียกค้น URL แบบยาวจาก 189 คีย์และเปลี่ยนเส้นทางเบราว์เซอร์ไปยัง URL นั้น เพื่อสิ่งนั้น เราจะสร้าง 193 ฟังก์ชันแลมบ์ดา

ฟังก์ชันแลมบ์ดาสำหรับการเปลี่ยนเส้นทาง URL

ขั้นตอนการสร้าง 208 แลมบ์ดาเหมือนกับที่อธิบายไว้ข้างต้น ต่อไปนี้เป็นขั้นตอนอีกครั้ง:

  • การสร้างฟังก์ชันแลมบ์ดาชื่อ 212 จากแดชบอร์ด Lambda
  • การตั้งค่าตัวแปรสภาพแวดล้อม
  • พิมพ์รหัสที่ให้ไว้ด้านล่าง
  • การสร้างเลเยอร์ด้วย 224 ไฟล์. (เราอาจใช้ 233 อีกครั้ง ข้อกำหนดจะเหมือนกันในกรณีนี้)
  • การเพิ่มเลเยอร์ให้กับฟังก์ชันแลมบ์ดา

นี่คืออัลกอริทึมหลักสำหรับแลมบ์ดาตัวเปลี่ยนเส้นทาง

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

เพียงเท่านี้แลมบ์ดาของเราก็พร้อมแล้ว! แม้ว่าวิธีนี้จะใช้งานได้ดี แต่เพื่อทำให้ URL สั้นลงเป็นบริการที่เข้าถึงได้ เราต้องหาทางเรียกใช้ lambdas ของเรา มีหลายวิธีในการใช้ฟังก์ชัน lambda แต่สำหรับการนำไปใช้งานนี้ เราจะใช้ AWS API Gateway .

การสร้างเกตเวย์ API บน AWS

ขั้นแรก ไปที่ API Gateway จากคอนโซล AWS ในแดชบอร์ด ให้คลิก สร้าง API ปุ่มและสร้าง REST API . หลังจากทำการกำหนดค่าพื้นฐานแล้ว เราก็จะมี API ของเราภายในไม่กี่วินาที

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

จากนั้นเราจำเป็นต้องเชื่อมต่อ API Gateway กับฟังก์ชัน Lambda ของเรา ในส่วนทรัพยากร ให้ไปที่ การดำเนินการ> สร้างทรัพยากร . ป้อน 245 และ 256 .

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

จากนั้นคลิกที่ 268 เส้นทางในทรัพยากร และไปที่ การดำเนินการ> สร้างวิธีการ> เลือก GET> ยืนยัน . ส่วนนี้ค่อนข้างสำคัญ การกำหนดค่านี้ช่วยให้เราสามารถถ่ายโอนข้อมูลคำขอจาก API Gateway ไปยังฟังก์ชัน Lambda ตรวจสอบให้แน่ใจว่าถูกต้อง!

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

เราได้เชื่อมต่อฟังก์ชันตัวย่อเข้ากับ API ของเราแล้ว ดังนั้นเราจึงสามารถย่อ URL ของเราให้สั้นลงได้ อย่างไรก็ตาม เราต้องการ 273 ฟังก์ชัน Lambda เชื่อมต่อกับ API เพื่อให้บริการของเราทำงานได้ คลิกที่ 283 ในแหล่งข้อมูล ให้ไปที่ การดำเนินการ> สร้างทรัพยากร .

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

คลิกที่ 295 ในแหล่งข้อมูล จากนั้น การดำเนินการ> สร้างวิธีการ> เลือก GET> ยืนยัน .

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

ในที่สุด API ของเราก็ได้รับการตั้งค่าแล้ว ขั้นตอนสุดท้ายคือการปรับใช้ API ไปที่ การดำเนินการ> ปรับใช้ API> สร้างระยะใหม่ . พิมพ์ฟิลด์ที่จำเป็นและปรับใช้ ขณะนี้เรามี API สาธารณะแล้ว ในระยะ คุณสามารถดู URL เรียกใช้สาธารณะสำหรับ API ของคุณได้

มีงานสุดท้ายที่ต้องทำ:เรียกใช้ฟังก์ชัน Lambda ผ่านทาง 307 เกตเวย์

ไปที่ 316 ฟังก์ชัน Lambda ภายในภาพรวมฟังก์ชัน คลิกส่วน เพิ่มทริกเกอร์ ปุ่ม.

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

เมื่อคุณเพิ่มทริกเกอร์ให้กับทั้งสองฟังก์ชัน API สาธารณะและฟังก์ชัน Lambda ของเราก็พร้อมที่จะใช้งาน สำหรับ 321 ฟังก์ชั่นการทริกเกอร์เส้นทาง URL เป็นดังนี้:

334

เพื่อทริกเกอร์ 348 คุณจะต้องได้รับการตอบสนองจาก 352 ฟังก์ชั่น URL ที่ทริกเกอร์สำหรับ 365 มีโครงสร้างดังนี้:

374

เมื่อคุณคลิกหรือส่งคำขอ HTTP ไปที่ URL คุณจะถูกนำไปยัง URL แบบยาวของคุณ จริงๆ แล้ว บริการของเราพร้อมแล้ว แต่เราจะสร้างอินเทอร์เฟซเว็บให้ดูสดใส

การสร้างเว็บอินเตอร์เฟสและการจัดการการใช้งานฟังก์ชัน

เราจะใช้ HTML, Bootstrap และ JavaScript สำหรับส่วนหน้า เมื่อผู้ใช้พิมพ์ URL และคลิก ย่อให้สั้นลง ปุ่ม URL จะถูกถามเพื่อเปลี่ยนเส้นทางผู้ใช้ไปยังเว็บไซต์ดั้งเดิม

สร้างตัวย่อ URL แบบไร้เซิร์ฟเวอร์ด้วย AWS Lambda, Python และ Upstash Redis

นี่เป็นเว็บไซต์ที่ค่อนข้างเรียบง่ายและมีองค์ประกอบเล็กน้อย ขั้นแรก เพิ่มบรรทัดต่อไปนี้ใน 382 บล็อกของโค้ด HTML เพื่อใช้คุณสมบัติ Bootstrap

398

ภายใน 400 บล็อก เราจะมีองค์ประกอบ 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 ก่อนจบ 410 ส่วนหนึ่ง แทรกฟังก์ชันการดึง URL อย่าลืมแทนที่ 420 ด้วยอันจาก AWS API Gateway ของคุณ

<!-- 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 431 ที่กำหนดโดย AWS ค่อนข้างซับซ้อน เนื่องจากวัตถุประสงค์หลักของโปรเจ็กต์นี้คือการสาธิต AWS Lambda และ Upstash Redis ฉันจึงไม่ต้องการให้โพสต์นี้ยาวขึ้น แต่หากคุณต้องการ คุณสามารถเปลี่ยน URL ให้เป็น URL ที่ง่ายและสั้นลงได้จาก AWS API Gateway
  • การใช้ขีดจำกัดอัตรา Upstash สำหรับ API ฉันใช้บริการระดับฟรีสำหรับโปรเจ็กต์นี้ แต่หากคุณตั้งใจจะสร้างบริการสาธารณะที่ใช้งานอยู่ คุณควรพิจารณาตั้งค่าขีดจำกัดคำขอเพื่อหลีกเลี่ยงค่าใช้จ่ายที่ไม่คาดคิด
  • การโฮสต์โปรเจ็กต์นี้บน Vercel

ขอบคุณที่อ่าน