データ基盤のoceanusで、Google App Engineを使った短縮URLサービスを追加した。
脳内でもんもんと設計をし、手を動かし始めてから完成まで3日ぐらい。
ソースコードは下記。
公開しているけど、短縮URLの作成画面は社内の人間のみで、ログイン必須。
作成すると下記のような、大文字小文字英数6字のURLが作られる。
画面はDjangoの管理画面を除くと2画面。
単発で作るフォームと
メールマガジンの文面などのURLを一括で変換&置換するもの
独自の短縮URLサービスが必要な理由
なぜ、巷にはたくさんの短縮URLサービスがあるのに、oceanus専用の短縮URLが必要かというと、メールマガジンなどに貼るリンクを誰が踏んだかのデータも一元管理したかったから。
ただ他のURLに飛ばすだけでなく、リダイレクト前にoceanusのAPIにデータを送っている。
一部のパラメーターは追加が可能で、例えばユーザーIDが12345のユーザーには下記のようにして送れば、特定が可能になる。
短縮URLのアルゴリズム
短縮URLサービスはシンプルなサービスゆえに、いろいろと作り方がWEB上で見つかる。
今回はDjangoで短縮URLを作るチュートリアルが見つかり、URLの作成部分、HTML部分はかなり流用させていただいた。
Django Tutorial – Building URL Shortener with Djangohellocoding.wordpress.com
Google App Engineを使う理由
下記の理由から、他で使っているGoogle Container Engine(GKE)ではなく、GAEのSTANDARD ENVIRONMENTを利用した。
- メールマガジンに貼ったりするため、アクセスの偏りが大きい
- シンプルなサービスなので必要なライブラリが少ない
- 今後の機能拡張も必要ない
1に関して、bizoceanでは200万以上の会員にメルマガを配信しているので、配信直後にアクセスが集中する。GKEでもオートスケールはできるが、MAXがどのくらい必要なのかとか、POD単位、クラスタ単位なのかを考えたり、指標をどうするかなど考えたり設定することが多い。でもGAEであればいい感じに勝手にスケールしてくれるので心配が少ない。
2に関して、今回はDjangoとMySQLが使えれば十分なことがわかっていたので、pipなど外部のライブラリの追加も必要なかった。正確にはpythonのrequestsが使いたかったが、面倒だったのでurllibとか標準ライブラリで済ませた。Python3を使いたいとか、大きめのライブラリを使いたい、RedisとかRabbitMQが必須、となればGKEを使ってたと思う。FLEXIBLE ENVIRONMENTであればPython3.4が使えるけど、中途半端だし、Dockerイメージ使うのであればGKEでいいじゃんという気になる。
3は、どんどん拡張していく予定であれば、2の理由等から難しいけど、変換とリダイレクト、ユーザー認証だけ、と決まっていたのでGAEで十分だった。
また現在、oceanusのWEB APIであるarmsはフレームワークにFalconを使っており、こちらはCythonが必要だし、シンプルなフレームワークなため、Djangoの用にユーザー認証や管理画面を作るのは面倒だったというのもある。
Djangoを使う理由
個人的にDjangoの経験があったことと、ドキュメントが充実していること、ユーザー認証を簡単に実装できること。
下記の公式チュートリアルを動かせることができれば、あとは継ぎ足しですぐ完成できる。
Running Django on App Engine Standard Environment | Python | Google Cloud Platform
GAEでDjangoを動かす、公式ドキュメントがあるし、上記の短縮URLみたいにWEB上にDjango関係のドキュメントは非常に充実している。
問題としてはちょっとバージョンが古い(現在1.11があるけど1.9まで)ことぐらい。
ユーザー認証が必要で、シンプルで、実質無限なスケールを必要なサービスには、手軽なGAE+Djangoがおすすめです。
Webアプリケーションを作ってみよう(Bootstrap Django MySQL 活用編)
- 作者: kenpapa
- 発売日: 2017/01/18
- メディア: Kindle版
- この商品を含むブログを見る
Django1.10 QUICKSTART-BOOK with Python3: 作りながら学ぶDjangoアプリケーション開発
- 作者: 淵上 喜弘
- 出版社/メーカー: 淵上 喜弘
- 発売日: 2016/12/04
- メディア: Kindle版
- この商品を含むブログを見る