『んー、社内のURL短縮用にbitly使うのはちょっと・・・』
という話を以前していまして、なら自前で作ってしまえばよいのでは??と思ったので作ってみました。
Logic Apps なのでノーコード!
概要は下図のような形です。
- 元のURLと対応する短縮用コード (英数字6桁) を作成して、Table ストレージに保存
- 短縮用のURLにコードを付与してアクセスすると、元のURLにリダイレクトさせるようなHTMLを返す
ということです。
1. 短縮用コード発行フロー
短縮用コード発行フローの中では、以下の処理を行っています。
- 英数字全部含む文字列を作成
- それをもとに6桁のランダムな英数字の文字列を作成
- クエリパラメータで渡された短縮前のURL と、生成したランダムな文字列を Tableストレージに保存
- レスポンスでランダムな文字列を返す
少しだけ数式を使っているのが、ランダムな文字の配列を作る部分です。とくにMap 部分には
substring(outputs('Compose'),rand(0,sub(length(outputs('Compose')),1)),1)
こんな数式が入っています。意味は「英数字全部含む文字列のランダムな順番から1文字取り出す」 という操作です。
2. 短縮URLアクセス時のフロー
短縮URLも基本的にはフローのURL + クエリパラメータです。
この短縮URLにアクセスすると、クエリパラメータに付与されたコード(= 短縮コード発行で作ったランダムな文字列) から、Tableストレージにアクセスして元URLを引っ張ってきます。
レスポンスには
<!DOCTYPE html> <html> <head> <meta http-equiv="refresh" content="1;URL=@{outputs('Compose')}"> </head> </html>
こんなHTMLを入れていて、Tableストレージから得られた元URLに1秒後にリダイレクトします。
仕組みとしてはこれだけです。とても簡単ですね。
課題
Logic Apps を作成したことがある方であれば「フローのURL長いから、短縮にならないのでは??」とおもうことでしょう。
実際フローのURLはそのままだと
https://prod-04.japaneast.logic.azure.com:443/workflows/c0993dasadsuf9362a9ce973e3929/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=nNIdas8767tgbvjjNV5TWzkdfgy5V4aA
こんな感じで非常に長いです。たぶん短縮しようとしている元URLより長いかもしれないです。
これを緩和するために Azure API Managementを使いました。
Azure API Management では、 サーバーURL (ゲートウェイURL) が https://xxxx.azure-api.net
のような短いもので与えられるので、あとは後ろに /encode
とか /decode
をつけて API を定義し、それぞれ短縮URL作成フローと短縮URLアクセス時のフローを読んであげればいいわけです。
これだと短縮後のURLは https://xxxx.azure-api.net/decode?code=XXXX
くらいに収まるので、まだ許容範囲かなと。
動作
#LogicApps と #APIM 使ってノーコードでURL短縮APIを作ってみた! pic.twitter.com/hUhseNJTgY
— Hiro (@mofumofu_dance) May 15, 2021
おわり
簡単でしたが短縮URLサービスを自前で作ってみたよという内容でした。
API Managementの設定が少し手間取るかもしれませんが、スムーズにいけば 1時間くらいで作れちゃいます。ノーコードすごいですね。
あとは期限切れした短縮URLのレコードを消す処理を入れないといけませんが、それは今後の課題ということで。