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

หมายเหตุ :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 พื้นฐานของเรา

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

ฟังก์ชัน 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 จากนั้นคลิกปรับใช้ .แม้ว่ารหัสจะพร้อมก็ตาม หากคุณทดสอบแลมบ์ดาตอนนี้ คุณจะได้รับคำตอบด้านล่างจากแลมบ์ดา
นั่นเป็นเพราะว่าในการใช้ไลบรารี Python ภายนอก เราจำเป็นต้องสร้างไลบรารีของเราเองเป็นแพ็คเกจแบบกำหนดเอง จากนั้นจึงหาวิธีแนบแพ็คเกจกับ Lambda มีหลายวิธีในการแก้ไขปัญหานี้ แต่วิธีแก้ปัญหาหลักของฉันคือการใช้ Lambda Layers อย่าปล่อยให้สิ่งนั้นทำให้คุณสับสน มันเป็นกระบวนการที่ค่อนข้างง่าย
ก่อนอื่นเราต้องสร้างและบีบอัดแพ็คเกจ ไปที่เทอร์มินัลท้องถิ่นของคุณแล้วพิมพ์คำสั่งด้านล่าง นั่นจะสร้าง
จากนั้นกลับไปที่
เมื่อสร้างเลเยอร์แล้ว เราจำเป็นต้องเชื่อมต่อเลเยอร์นี้กับ
ตอนนี้เราควรจะสามารถย่อ URL ให้สั้นลงได้ สิ่งที่เหลืออยู่คือการเรียกค้น URL แบบยาวจาก
ขั้นตอนการสร้าง
นี่คืออัลกอริทึมหลักสำหรับแลมบ์ดาตัวเปลี่ยนเส้นทาง
เพียงเท่านี้แลมบ์ดาของเราก็พร้อมแล้ว! แม้ว่าวิธีนี้จะใช้งานได้ดี แต่เพื่อทำให้ URL สั้นลงเป็นบริการที่เข้าถึงได้ เราต้องหาทางเรียกใช้ lambdas ของเรา มีหลายวิธีในการใช้ฟังก์ชัน lambda แต่สำหรับการนำไปใช้งานนี้ เราจะใช้ AWS API Gateway .
ขั้นแรก ไปที่ API Gateway จากคอนโซล AWS ในแดชบอร์ด ให้คลิก สร้าง API ปุ่มและสร้าง REST API . หลังจากทำการกำหนดค่าพื้นฐานแล้ว เราก็จะมี API ของเราภายในไม่กี่วินาที
จากนั้นเราจำเป็นต้องเชื่อมต่อ API Gateway กับฟังก์ชัน Lambda ของเรา ในส่วนทรัพยากร ให้ไปที่ การดำเนินการ> สร้างทรัพยากร . ป้อน
จากนั้นคลิกที่
เราได้เชื่อมต่อฟังก์ชันตัวย่อเข้ากับ API ของเราแล้ว ดังนั้นเราจึงสามารถย่อ URL ของเราให้สั้นลงได้ อย่างไรก็ตาม เราต้องการ
คลิกที่
ในที่สุด API ของเราก็ได้รับการตั้งค่าแล้ว ขั้นตอนสุดท้ายคือการปรับใช้ API ไปที่ การดำเนินการ> ปรับใช้ API> สร้างระยะใหม่ . พิมพ์ฟิลด์ที่จำเป็นและปรับใช้ ขณะนี้เรามี API สาธารณะแล้ว ในระยะ คุณสามารถดู URL เรียกใช้สาธารณะสำหรับ API ของคุณได้
มีงานสุดท้ายที่ต้องทำ:เรียกใช้ฟังก์ชัน Lambda ผ่านทาง
ไปที่
เมื่อคุณเพิ่มทริกเกอร์ให้กับทั้งสองฟังก์ชัน API สาธารณะและฟังก์ชัน Lambda ของเราก็พร้อมที่จะใช้งาน สำหรับ
เพื่อทริกเกอร์
เมื่อคุณคลิกหรือส่งคำขอ HTTP ไปที่ URL คุณจะถูกนำไปยัง URL แบบยาวของคุณ จริงๆ แล้ว บริการของเราพร้อมแล้ว แต่เราจะสร้างอินเทอร์เฟซเว็บให้ดูสดใส
เราจะใช้ HTML, Bootstrap และ JavaScript สำหรับส่วนหน้า เมื่อผู้ใช้พิมพ์ URL และคลิก ย่อให้สั้นลง ปุ่ม URL จะถูกถามเพื่อเปลี่ยนเส้นทางผู้ใช้ไปยังเว็บไซต์ดั้งเดิม
นี่เป็นเว็บไซต์ที่ค่อนข้างเรียบง่ายและมีองค์ประกอบเล็กน้อย ขั้นแรก เพิ่มบรรทัดต่อไปนี้ใน
ภายใน
หลังจากเพิ่มองค์ประกอบแล้ว จะเหลือเพียงข้อมูลที่ดึงมาจาก API Gateway เท่านั้น เราจะจัดการเรื่องนั้นด้วย JavaScript ก่อนจบ
เราได้ใช้คุณสมบัติหลักสำหรับโครงการย่อ URL แบบไร้เซิร์ฟเวอร์ของเรา ฉันหวังว่ามันจะเป็นการสาธิตที่ชัดเจนของการสร้างฟังก์ชัน Python Lambda และใช้งานมัน ฉันยังมีข้อเสนอแนะสำหรับการปรับปรุงโครงการ หากคุณต้องการทำงานในโครงการนี้ต่อไป
ขอบคุณที่อ่าน130รหัส> ป> การสร้างเลเยอร์
148 ในโฟลเดอร์แพ็คเกจที่ติดตั้ง Redismkdir 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 python157 ทำงานบน AWS และตรงไปยังเลเยอร์จากแถบด้านข้าง คลิกที่สร้างเลเยอร์ และกรอกการกำหนดค่าที่จำเป็นแล้วอัปโหลด 166 ไฟล์คล้ายกับของฉัน
170 ของเรา ฟังก์ชั่น ไปที่ส่วนเลเยอร์ของฟังก์ชันแล้วคลิก เพิ่มเลเยอร์ ปุ่ม.
189 คีย์และเปลี่ยนเส้นทางเบราว์เซอร์ไปยัง URL นั้น เพื่อสิ่งนั้น เราจะสร้าง 193 ฟังก์ชันแลมบ์ดาฟังก์ชันแลมบ์ดาสำหรับการเปลี่ยนเส้นทาง URL
208 แลมบ์ดาเหมือนกับที่อธิบายไว้ข้างต้น ต่อไปนี้เป็นขั้นตอนอีกครั้ง:
212 จากแดชบอร์ด Lambda224 ไฟล์. (เราอาจใช้ 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การสร้างเกตเวย์ API บน AWS

245 และ 256 .
268 เส้นทางในทรัพยากร และไปที่ การดำเนินการ> สร้างวิธีการ> เลือก GET> ยืนยัน . ส่วนนี้ค่อนข้างสำคัญ การกำหนดค่านี้ช่วยให้เราสามารถถ่ายโอนข้อมูลคำขอจาก API Gateway ไปยังฟังก์ชัน Lambda ตรวจสอบให้แน่ใจว่าถูกต้อง!
273 ฟังก์ชัน Lambda เชื่อมต่อกับ API เพื่อให้บริการของเราทำงานได้ คลิกที่ 283 ในแหล่งข้อมูล ให้ไปที่ การดำเนินการ> สร้างทรัพยากร .
295 ในแหล่งข้อมูล จากนั้น การดำเนินการ> สร้างวิธีการ> เลือก GET> ยืนยัน .
307 เกตเวย์316 ฟังก์ชัน Lambda ภายในภาพรวมฟังก์ชัน คลิกส่วน เพิ่มทริกเกอร์ ปุ่ม.
321 ฟังก์ชั่นการทริกเกอร์เส้นทาง URL เป็นดังนี้:334รหัส> ป> 348 คุณจะต้องได้รับการตอบสนองจาก 352 ฟังก์ชั่น URL ที่ทริกเกอร์สำหรับ 365 มีโครงสร้างดังนี้:374รหัส> ป> การสร้างเว็บอินเตอร์เฟสและการจัดการการใช้งานฟังก์ชัน

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