1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

にわのわさんAdvent Calendar 2023

Day 16

短縮URLを自作する

Last updated at Posted at 2023-12-15

はじめに

短縮URL、使っていますか?にわのわです。

自分は端末間でURLを共有するときに、短縮URLを使うことが多いです。
しかし、短縮URLを作るサービスはたくさんありますが、自分にとってとても難しい問題があります。
それは自分にはURLが覚えられないということです。

参考:
image.png

ということで。今回は以下の要件で短縮URLを作るサービスを作ってみました。

  • (主に)自分のみが使う前提
  • URLは数字のみにして覚えやすいものにする

今回みなかったことにしたもの

OSSで短縮URLをホストできるもの
自分で作ることにも意味があったと思っています

作ったもの

今回作ったものはのソースはこちらで公開しています。

ソース

以下の2つのファイルをlambdaにアップロードして使います。

登録用.py
import json
import boto3

def lambda_handler(event, context):

    table_name = "omit_url"

    #リクエスト情報のログ出力 
    print("===event===")
    print(event)

    print("===context===")
    print(context)

    # eventからurlを取得
    url = json.loads(event.get('body')).get('url')
    print("===url===")
    print(url)

    # DynamoDBからid(プライマリキー)の最大値を取得
    client = boto3.client('dynamodb')
    response = client.scan(
        TableName=table_name,
        Select='COUNT'
    )

    print("===response===")
    print(response)

    count = int(response.get('Count'))+1

    # DynamoDBにデータを登録
    response = client.put_item(
        TableName=table_name,
        Item={
            'id': {
                'N': str(count)
            },
            'url': {
                'S': url
            }
        }
    )

    # CORS対応
    headers = {
        'Access-Control-Allow-Headers': 'Content-Type',
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
    }

    return {
        'statusCode': 200,
        'headers': headers,
        'body': json.dumps(count)
    }
リダイレクト用.py
import json
import boto3
import os

def lambda_handler(event, context):

    table_name = "omit_url"

    #リクエスト情報のログ出力 
    print("===event===")
    print(event)

    print("===context===")
    print(context)

    # eventからidを取得
    id = int(event.get('pathParameters').get('id'))

    # DynamoDBからidをキーにしてデータを取得
    client = boto3.client('dynamodb')
    response = client.get_item(
        TableName=table_name,
        Key={
            'id': {
                'N': str(id)
            }
        }
    )

    print("===response===")
    print(response)

    url = response.get('Item').get('url').get('S')

    # urlへリダイレクトするhtmlを生成する
    html = f"""
    <html>
    <head>
    <meta http-equiv="refresh" content="0;URL={url}">
    </head>
    <body>
    </body>
    </html>
    """

    return {
        'statusCode': 200,
        "headers": {"Content-Type": "text/html"},
        'body': html
    }

おわりに

今回は短縮URLをホストするサービスを作ってみました。
作ってから少し時間が経っていますが、そこそこ使っているので満足さんです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?