AWS
lambda

APIGatewayを使ってサーバーレスなURL短縮サービスを作る(URL生成編)

こちらの記事の続きです。
APIGatewayを使ってサーバーレスなURL短縮サービスを作る(URL取得編)

何を作るか?

諸事情により、外部のURL短縮サービスを使えない場合のために、自前のURL短縮サービスを作ります。
このサービスは、以下の2つから構成されます。

  • URL生成
    • 入力された任意のURLに対して、短縮したURLを生成する
    • 生成したURLを元のURLと共にAmazon S3に格納する
  • URL取得
    • 与えられた短縮URLを元にS3から元URLを取得する
    • HTTPレスポンスでステータスコード301とともにLocationヘッダで元URLを返す

この記事では、AWS Lambdaを使ってURLを生成する部分を実装します。
URL取得の部分はこちらの記事を参照してください。

概要

URL生成部分は、以下のように実装します。

  • 短縮キーとして一意な文字列を生成する。
  • 短縮キーをS3オブジェクトのキー(ファイル名)としてS3バケットにオリジナルURLを格納する。
  • 短縮キーと取得用APIのURLから、短縮URLを生成して返却する。

上記をLambdaFunctionとして実装し、APIGatewayで公開します。

作成方法

CloudFormationのテンプレートを用意してあるので、まずはそれを実行します。

https://github.com/monamu/qiita-url-shorter

こちらからapp-generateurl.yamlを取得して、CloudFormationで実行してください。
以下のパラメータを設定し、StackNameは任意で構いません。

  • DataBucketName: こちらの記事で作成したS3バケット
  • GetUrlEndpoint: こちらの記事で作成したAPIまたは、カスタムドメインを設定している場合はそのAPI。{key}で終わっている必要あり。

まずはそれを実行しますと言いつつ、実行したら完成です。

使い方

短縮URL生成APIを呼ぶ

このページで作成したCloudFormationスタックのOutputsのApiに対して、POSTで短縮前URLをリクエストします。

$ curl -X POST <OutputsのApi> -H "Content-Type:applcation/json" -d "{\"Url\": \"https://www.google.co.jp\"}"

結果

{"Url":"短縮後のURL"}

短縮後のURLの末尾はランダムなキーになっているはずです。

このURLにアクセスしてみます。

curl -i "短縮後のURL"

結果

HTTP/2 301
content-type: application/json
location: https://www.google.co.jp
〜中略〜
{"Location":"https://www.google.co.jp"}

きちんとStatusCodeが301でlocationヘッダに元のURLが設定されているので、Webブラウザはリダイレクトしてくれるでしょう。

まとめ

あとは、URLを生成するページなりプログラムを作成して、それを実行した結果を利用者に伝えれば完成です。(この記事ではそこまでは触れないです)

AWSのサービスを使って、ほとんどプログラムを書かず、サーバーレスなURL短縮サービスができてしまいました。

では。