こちらの記事の続きです。
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のテンプレートを用意してあるので、まずはそれを実行します。
こちらから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短縮サービスができてしまいました。
では。