AWS Lambda、Python、Upstash Redis を使用してサーバーレス URL 短縮ツールを構築する
このブログ投稿では、Upstash Redis、AWS Lambda (Python)、および AWS API Gateway 上に構築されたサーバーレス URL 短縮サービスの構築について説明します。このブログ投稿の主な目的は、Python Lambda 関数を作成し、それを Redis に接続し、API 経由で使用するプロセスを示すことです。
URL Shortener
経由でプロジェクトの実装にアクセスできます。

注意 :出力 URL はデモ用です。アクティブな URL 短縮機能は、より短くて単純なドメイン アドレスを持つことになるため、ここでは機能に焦点を当てます。
プロジェクトの説明
このプロジェクトは、Upstash Redis 上の 1 つのデータベース、2 つの Python Lambda 関数、および AWS 上の API ゲートウェイで構成されます。ユーザーは、Web インターフェースまたは 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 短縮のための Lambda 関数
最初に行うことは、環境変数を追加することです。 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 の作成プロセス lambda は上で説明したものと同じです。手順をもう一度示します。
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 Gateway を使用します。 .
AWS での API ゲートウェイの作成
まず、AWS コンソールから API Gateway に移動します。ダッシュボードで [API の作成] をクリックします。 ボタンをクリックしてREST APIを構築します。 。基本的な設定を行うと、数秒で API が完成します。

次に、API ゲートウェイを Lambda 関数に接続する必要があります。リソースセクションで、[アクション]> [リソースの作成]に移動します。 。 resource name を入力してください および resource path .

次に、/shortener をクリックします。 リソースのパス そして[アクション]> [メソッドの作成]> [GET] を選択> 確認に進みます。 。この部分は非常に重要です。この構成により、リクエスト データを API Gateway から Lambda 関数に転送できるようになります。正しいことを確認してください。

短縮機能を API に接続したので、URL を短縮できるようになりました。ただし、redirector が必要です。 サービスが動作するために API に接続された Lambda 関数。 / をクリックします。 リソース内 、[アクション]> [リソースの作成]に進みます。 .

/{short_url} をクリックします。 リソース内 セクションに移動し、[アクション]> [メソッドの作成]> [GET] を選択> 確認します。 .

最後に、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 にリダイレクトされます。実際、私たちのサービスは準備ができていますが、ちょっとしたアクセントとして Web インターフェースを作成します。
Web インターフェイスの作成と関数の使用方法の処理
フロントエンドには HTML、ブートストラップ、JavaScript を使用します。ユーザーが URL を入力して [短縮] をクリックすると、 ボタンをクリックすると、URL の入力を求めるプロンプトが表示され、ユーザーが元の Web サイトにリダイレクトされます。

これは、いくつかの要素を備えたかなりシンプルな Web サイトです。まず、次の行を <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 をよりシンプルで短いものに変更できます。 - API の Upstash レート制限を実装します。このプロジェクトでは無料枠サービスを使用しましたが、アクティブな公開サービスを構築する場合は、予期せぬコストを避けるためにリクエスト制限の設定を検討する必要があります。
- Vercel でこのプロジェクトをホストします。
読んでいただきありがとうございます。
-
リアルタイムデータベースを使用した不正の検出と財務データの保護
リアルタイムデータプラットフォームを使用した金融詐欺との戦い 、金融詐欺の最新トレンド、企業が効果的に反撃する方法、およびRedisが企業がこれらの目標を達成するのをどのように支援しているかにスポットライトを当てた重要なホワイトペーパー。以下から無料でダウンロードしてください。 詐欺の蔓延は現実のものであり、金融機関はサイバー犯罪者の進行中の猛攻撃と変化する戦術に追いつくのに苦労しています。世界的な金融サービスの状況が進化するにつれて、詐欺師はデジタルバンキングの変革と並行して動き、顧客のIDを盗んだり偽造したり、詐欺を犯したりする革新的な方法を見つけています。 パンデミック以来、
-
Redis SRANDMEMBER –Redisのセットからランダムな要素を取得する方法
このチュートリアルでは、キーに格納されている設定値から1つ以上のランダム要素を取得する方法について学習します。このために、コマンドを使用します– SRANDMEMBER redis-cliで。 redis SRANDMEMBERコマンドの構文は次のとおりです:- 構文:- redis host:post> SRANDMEMBER <key name> [count] 出力:- -(string value) if Key exists and Count argument is not given.-(nil), if Key does not exists an