## 参加時の状況
4月に入社して間もなく既存サービスの一部を切り出す形で新規メディアサイトを立ち上げることとなり、その開発を任されました。
サービスの特性上、8月が繁忙期のためそれまでにリリースしたいとのことで開発期間は約2.5ヶ月でした。
体制は ディレクター1名、デザイナ2名、エンジニアは2名で私のみ専任。もう一名は既存サービスの開発の傍らでサポートしてもらい、主に既存サービスとの連携部分を担当してもらいました。
関連記事:[いこレポ はじめました。](https://tech.actindi.net/2017/08/14/ikorepo.html)
## システム設計
既存サービスからの独立なのでおおよその要件は決まっているも同然でした。
その上で新たに実現したい機能をディレクターとコンテンツを作る編集チームと調整して詰めました。
その結果、開発するアプリケーションとしてはRailsアプリケーションとして難しそうな部分はないと判断できました。一方で、リリース後も運用に自分以外のリソースを割いてもらえない状況が見えており、できるだけ手放しで運用できるようにインフラを構築する必要があると考えました。
### 運用環境インフラ
次の理由からDockerで運用することを最初に決めました。
- 本場同様の環境で開発を進められること
- Dockerfile にサーバの構築手順がコード化できること
- 将来的なOS、Rubyのアップデートもアプリケーションのデプロイと同時に可能で容易
- 自分の技術的な興味
ローカルで一通りRailsが動かせるDockerイメージを作った後、本番での稼働環境を検討しました。AWSで運用することは決まっていたため、ECS等いくつかの候補を検討した結果 ElasticbeanStalkが最もAWS側でやってくれることが多そうなので採用することとしました。それを軸に必要なネットワーク設計等を行い構築しました。
## アプリケーション開発
アプリケーション側の開発ではサイトを訪問するエンドユーザ側のUIが最も重要ですが、
コンテンツの表示を行うのみで特にインタラクティブな機能は不要でした。
幸いデザイナはSlimテンプレートを書けたのでおまかせすることにしました。
一方、管理側の機能は私が担当しました。
コンテンツを作成するCMS機能の使いやすさが運用上重要で、開発を効率化するためにJSのフレームワークを導入することは最初に決めていました。Reactと比較した結果Vue.jsのほうが使いやすいと判断し、採用しました。Vue.jsの学習に多少時間がかかったものの、難しかったのはCMS機能のみであとは想定通りの開発難度で開発は進められました。
また、過去の失敗経験から既存サービスから移行してくるデータについては開発初期に変換スクリプトを使ってデータ移行しました。移行処理の中でデータ補間と変換でクリーニングしデータに起因する不具合を排除しました。
## CI環境
開発前半で本番用のインフラを構築後はGithubで管理しているリポジトリのmasterにpushすれば本番用にDcokerイメージをビルドし、デプロイできる仕組みを構築しました。
当初はJenkinsを導入しようと検討していましたが、1日数回しか使わないサーバを稼働させるコストと運用の手間が惜しくなり、CodeBuildとCodePipelineを利用してサーバレスな仕組みを構築しました。これによりコストダウンでき、サーバ運用の手間から解放されました。
リリース前には上記と3つのステージング環境のみしか用意できなかったのですが、リリース後GithubのpullrequestにpushするとRSpecを実行できるように開発時のテストを効率化しました。これもDocker、CodeBuild、Lambdaを使って処理しサーバレスで実現しています。
## リリースとその後
利用頻度の低いいくつかの管理側の機能の開発を先送りしたものの、予定通り7月末にリリースを果たしました。
リリース後は大きなトラブルもなく安定稼働し、月間100万PV超えるサイトに成長しました。
当初の目論見通り、Elasticbeanstalkは運用の手間を最小にしてくれていますし、Rubyのアップデート等もDockerのおかげで手間なく実施できています。