PHP
AWS

短縮URLサービスの作り方

More than 1 year has passed since last update.

これは 日本情報クリエイト Engineers Advent Calendar 2016 による10日目の記事になります。

短縮URLサービスとは

長いURLを短いURLにしてリダイレクトさせるサービスです。
https://ja.wikipedia.org/wiki/%E7%9F%AD%E7%B8%AEURL

利用されだして随分経ちますが便利な反面いろいろと問題はあります。
1. 提供サービスの閉鎖により利用できなくなる。
2. 提供サービスの規約に抵触し利用できなくなる。
3. ウイルス感染源になりうる。

1,2は外部サービスを使う宿命ですが、できれば自分でコントロールしたいところです。
3は元のURLが隠しやすいためセキュリティ攻撃者にとっても便利なサービスとなってしまっています。

自分で作れば安心

自分でつくれば閉鎖もないし制限も受けないし、利用者も制限できます。
そこで、できるだけ手間をかけず、コストをかけず、可用性を落とさないサービスとして、AWS のS3を利用しました。
ドメインを用意して、S3のバケットとドメインを紐づけて、htmlファイルにリダイレクトコードを書いた物をアップロードする。
って仕組みを作ったのが2014年5月でした。

そのうち時間ができたらAPI利用して生成ページ作ればアップロードの手間も不要になるなぁ
って放置していたらあっという間に2年が経過していました(^^;

製作者現る!

弊社では毎年複数回インターン生を受け入れているのですが、1名だけのインターンが2回発生しました。
プログラム経験も少ない方だったので、社内向けで短期間で作成できるこの「短縮URL」を作成していただきました。

ポイント

S3も2年の間に進化して、WEBリダイレクトオプションが利用できるようになっていました。
短縮URLっぽく最後に.htmlが不要なのでこちらのオプションを採用しました。

主要コード(php)

for ($i=0;$i<10;$i++){
// オブジェクト名作成
  $s3_object = makeRandStr(6);
  // 同一オブジェクトがあるかの確認
  $check = $client->doesObjectExist($bucket_name,$s3_object);
  if (!$check){
    // 同一オブジェクトが存在していなかったら作成
    $result = $client->putObject(array(
      'Bucket' => $bucket_name,
      'Key' => $s3_object,
      'Body' => $s3_body,
      'ACL' => 'public-read',
      'ContentType' => 'text/html',
      'WebsiteRedirectLocation' => $target_url
     ));
     break;
   }
 }

社内系利用ってこともありきっちりしたエラー処理等も行っていません(^^;
コードの補足説明をすると以下の通りです。
makRandStrはランダムな文字を生成する自作関数です。
$bucket_nameが短縮URLで作成されたバケット名です。
$s3_objectが6文字のランダムな文字で短縮URLの後半部分であり、ファイル名です。
$s3_bodyはファイルの中身です。
$target_urlはリダイレクト先のURLです。

その他aws-apiへの接続部分や、登録フォーム結果表示ページ、本ページへのアクセス制限等を組み込んで完成です。

謝辞

作成いただいたインターン生Aさん、php & AWS-API未経験でインターン補佐をご担当いただいた社員Sさん、手探りでの構築大変だったと思いますが作成いただきありがとうございました(^^