이 블로그 게시물에서는 Upstash Redis, AWS Lambda(Python) 및 AWS API Gateway를 기반으로 구축된 서버리스 URL 단축 서비스를 구축하는 과정을 안내하겠습니다. 이 블로그 게시물의 주요 목적은 Python Lambda 함수를 생성하고 이를 Redis에 연결하고 API를 통해 사용하는 프로세스를 보여주는 것입니다.
다음을 통해 프로젝트 구현에 도달할 수 있습니다:URL 단축기

참고 :출력 URL은 데모용입니다. 활성 URL 단축기는 도메인 주소가 더 짧고 단순하므로 여기서는 기능에 중점을 둡니다.
프로젝트 설명
이 프로젝트는 Upstash Redis의 데이터베이스 1개, Python Lambda 함수 2개, AWS의 API 게이트웨이로 구성됩니다. 사용자는 웹 인터페이스나 API를 사용하여 단축 서비스를 이용할 수 있습니다.
shortener Lambda 함수는 HTTP 요청 쿼리에 제공된 긴 URL에서 단축 URL 키를 생성합니다. 그런 다음 짧은 URL 키와 해당 긴 URL 값을 Upstash Redis에 저장한 후 사용자에게 짧은 URL을 반환합니다.
redirector Lambda 함수는 사용자를 짧은 URL에서 해당 긴 URL로 리디렉션합니다. 짧은 URL 키를 사용하여 Redis에서 긴 URL을 검색하고 사용자의 브라우저에 HTTP 302 리디렉션 응답을 보냅니다. 이 기능을 사용하면 사용자가 긴 URL을 기억하거나 수동으로 입력할 필요 없이 원하는 콘텐츠에 액세스할 수 있습니다.
마지막으로 Lambda 함수를 사용하기 위한 API 게이트웨이를 생성하겠습니다. 이 API는 기본 URL 단축기 프런트엔드에 연결됩니다.

Upstash Redis 설정
Upstash 콘솔에서 Redis 데이터베이스를 생성할 수 있습니다. 로그인 후 데이터베이스 생성을 클릭하세요. 버튼. 몇 초 정도 걸리며 모든 설정이 완료됩니다. 그런 다음 UPSTASH_REDIS_REST_HOST를 복사하여 붙여넣으세요. , UPSTASH_REDIS_REST_PORT 및 UPSTASH_REDIS_REST_PASSWORD 세부정보의 변수 섹션을 파일로 이동합니다. AWS 환경 변수에서 이 키를 사용할 것입니다.
AWS Lambda에서 서버리스 함수 생성
다음으로 서버리스 Python 함수를 생성하겠습니다. AWS에 로그인한 후 AWS Lambda로 이동합니다. 대시보드에서 람다 함수를 생성하세요.

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자 키 생성
- Upstash Redis의 이 키 값을 긴 URL로 설정
- 응답 본문에 전체 단축 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 그런 다음 배포를 클릭하세요. .코드가 준비되었음에도 불구하고; 지금 람다를 테스트하면 람다로부터 아래 응답을 받게 됩니다
Unable to import module 'lambda_function': No module named 'redis'
외부 Python 라이브러리를 사용하려면 자체 라이브러리를 사용자 지정 패키지로 만든 다음 해당 패키지를 Lambda에 연결하는 방법을 찾아야 하기 때문입니다. 이 문제를 해결하는 방법에는 여러 가지가 있지만 제가 주로 사용하는 솔루션은 Lambda 레이어를 사용하는 것입니다. 혼동하지 마세요. 절차가 매우 간단합니다.
레이어 생성
먼저 패키지를 생성하고 압축해야 합니다. 로컬 터미널로 이동하여 아래 명령을 입력하세요. 그러면 requirements-package.zip가 생성됩니다. 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
그런 다음 shortener로 돌아가세요. AWS에서 작동하고 사이드바에서 레이어로 직접 연결됩니다. 레이어 만들기를 클릭합니다. 필요한 구성을 입력하고 requirements-package.zip을 업로드하세요. 내 파일과 비슷해요.

레이어가 생성되면 이 레이어를 shortener에 연결해야 합니다. 기능. 함수의 레이어 섹션으로 이동하여 레이어 추가를 클릭하세요. 버튼을 누르세요.

이제 URL을 단축할 수 있습니다. 남은 것은 short_url에서 긴 URL을 검색하는 것입니다. 키를 입력하고 브라우저를 해당 URL로 리디렉션합니다. 이를 위해 redirector를 생성하겠습니다. 람다 함수.
URL 리디렉션을 위한 Lambda 함수
redirector 생성 과정 람다는 위에서 설명한 것과 동일합니다. 다시 한 번 단계를 따르세요.
redirector이라는 람다 함수 만들기 Lambda 대시보드에서.- 환경 변수를 설정합니다.
- 바로 아래에 제공된 코드를 입력하세요.
requirements-package.zip를 사용하여 레이어 만들기 파일. (redis-library-layer를 사용할 수 있습니다) 다시 말하지만, 이 경우 요구 사항은 동일합니다.)- 람다 함수에 레이어 추가
리디렉터 람다의 주요 알고리즘은 다음과 같습니다.
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 단축기를 접근 가능한 서비스로 만들려면 람다를 실행하는 방법을 찾아야 합니다. 람다 함수를 사용하는 방법에는 여러 가지가 있지만 이 구현에서는 AWS API 게이트웨이를 사용하겠습니다. .
AWS에서 API 게이트웨이 생성
먼저 AWS 콘솔에서 API Gateway로 이동합니다. 대시보드에서 API 생성을 클릭합니다. 버튼을 클릭하고 REST API를 빌드하세요. . 기본 구성을 완료하면 몇 초 만에 API가 완성됩니다.

그런 다음 API 게이트웨이를 Lambda 함수에 연결해야 합니다. 리소스 섹션에서 작업> 리소스 생성으로 이동합니다. . resource name을 입력하세요 및 resource path .

그런 다음 /shortener을 클릭하세요. 리소스의 경로 작업> 메소드 생성> GET 선택> 확인으로 이동합니다. . 이 부분은 매우 중요합니다. 이 구성을 사용하면 API 게이트웨이에서 Lambda 함수로 요청 데이터를 전송할 수 있습니다. 올바른지 확인하세요!

단축 기능을 API에 연결했으므로 이제 URL을 단축할 수 있습니다. 하지만 redirector가 필요합니다. 서비스가 작동하도록 API에 연결된 Lambda 함수입니다. /를 클릭하세요. 리소스 , 작업> 리소스 생성으로 이동하세요. .

/{short_url}을 클릭하세요. 리소스 섹션을 선택한 다음 작업> 메소드 생성> 가져오기 선택> 확인을 선택하세요. .

마지막으로 API가 설정되었습니다. 마지막 단계는 API를 배포하는 것입니다. 작업> API 배포> 새 단계 만들기로 이동합니다. . 필요한 필드를 입력하고 배포합니다. 이제 공개 API가 생겼습니다. 단계 섹션에서 API에 대한 공개 호출 URL을 볼 수 있습니다.
해야 할 마지막 작업이 있습니다. serverless-shortener-API를 통해 Lambda 함수를 트리거하는 것입니다. 게이트웨이.
shortener로 가세요 함수 개요 내의 Lambda 함수 섹션에서 트리거 추가를 클릭하세요. 버튼을 누르세요.

두 함수 모두에 트리거를 추가하면 공개 API와 Lambda 함수를 사용할 준비가 됩니다. shortener의 경우 함수에서 URL 경로를 실행하는 방법은 다음과 같습니다:
<YOUR_INVOKE_URL>/shortener?short_url="<LONG_URL>"
redirector를 트리거하려면 함수를 사용하려면 shortener의 응답이 필요합니다. 기능. redirector의 트리거 URL 아래와 같은 구조를 가지고 있습니다:
<YOUR_INVOKE_URL>/<SHORT_URL_KEY>
이를 클릭하거나 HTTP 요청을 보내면 긴 URL로 리디렉션됩니다. 실제로 저희 서비스는 준비되어 있지만 약간의 반짝임으로 웹 인터페이스를 만들어 보겠습니다.
웹 인터페이스 생성 및 기능 사용 처리
우리는 프론트엔드에 HTML, Bootstrap, JavaScript를 사용할 것입니다. 사용자가 URL을 입력하고 단축을 클릭하면 버튼을 누르면 사용자를 원래 웹사이트로 리디렉션하는 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 게이트웨이에서 가져오는 데이터만 남습니다. 우리는 JavaScript로 이를 처리할 것입니다. <body>이 끝나기 전 부분에 URL 가져오기 기능을 삽입하세요. <INVOKE_URL>을 바꾸는 것을 잊지 마세요 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 단축기에 대한 맞춤 도메인을 설정합니다.
Invoke URLAWS가 제공하는 것은 다소 복잡합니다. 이 프로젝트의 주요 목적은 AWS Lambda 및 Upstash Redis를 시연하는 것이었기 때문에 이 게시물을 그것으로 길게 만들고 싶지 않았습니다. 하지만 원하는 경우 AWS API Gateway에서 URL을 더 간단하고 짧은 URL로 변경할 수 있습니다. - API에 Upstash 비율 제한을 구현합니다. 이 프로젝트에서는 무료 계층 서비스를 사용했지만 활성 공개 서비스를 구축하려는 경우 예상치 못한 비용이 발생하지 않도록 요청 제한을 설정하는 것을 고려해야 합니다.
- Vercel에서 이 프로젝트를 호스팅합니다.
읽어주셔서 감사합니다.