MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Logic Apps と API Management で 自作短縮URLサービスを作ってみた

『んー、社内のURL短縮用にbitly使うのはちょっと・・・』

という話を以前していまして、なら自前で作ってしまえばよいのでは??と思ったので作ってみました。

Logic Apps なのでノーコード!

概要は下図のような形です。

  • 元のURLと対応する短縮用コード (英数字6桁) を作成して、Table ストレージに保存
  • 短縮用のURLにコードを付与してアクセスすると、元のURLにリダイレクトさせるようなHTMLを返す

ということです。

f:id:mofumofu_dance:20210515230536p:plain
仕組み概要

1. 短縮用コード発行フロー

短縮用コード発行フローの中では、以下の処理を行っています。

  1. 英数字全部含む文字列を作成
  2. それをもとに6桁のランダムな英数字の文字列を作成
  3. クエリパラメータで渡された短縮前のURL と、生成したランダムな文字列を Tableストレージに保存
  4. レスポンスでランダムな文字列を返す

f:id:mofumofu_dance:20210515233349p:plain
短縮用コード発行フロー

少しだけ数式を使っているのが、ランダムな文字の配列を作る部分です。とくにMap 部分には

 substring(outputs('Compose'),rand(0,sub(length(outputs('Compose')),1)),1)

こんな数式が入っています。意味は「英数字全部含む文字列のランダムな順番から1文字取り出す」 という操作です。

f:id:mofumofu_dance:20210515234130p:plain

2. 短縮URLアクセス時のフロー

短縮URLも基本的にはフローのURL + クエリパラメータです。

この短縮URLにアクセスすると、クエリパラメータに付与されたコード(= 短縮コード発行で作ったランダムな文字列) から、Tableストレージにアクセスして元URLを引っ張ってきます。

f:id:mofumofu_dance:20210515234658p:plain
短縮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 くらいに収まるので、まだ許容範囲かなと。

動作

おわり

簡単でしたが短縮URLサービスを自前で作ってみたよという内容でした。

API Managementの設定が少し手間取るかもしれませんが、スムーズにいけば 1時間くらいで作れちゃいます。ノーコードすごいですね。

あとは期限切れした短縮URLのレコードを消す処理を入れないといけませんが、それは今後の課題ということで。