アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

いこレポ はじめました。

はじめまして。morishita です。

4月に入社以来、このブログに投稿する機会をうかがっていましたが、ついに初めての投稿です。

すでにサービスインから2週間ほど経っているのですが、いこレポ といういこーよの姉妹サイトをローンチさせました。
ざっくりどのようなサイトかというと、次のようなニュースサイトです。 パパ・ママエンジニアの皆さん、お子さんとのお出かけの参考にご活用ください。

ikorepo

【いこレポとは?】
お出かけの達人「お出かけコンシェルジュ」が、旅行で人気の観光名所、子連れで楽しめる遊び場・イベント、地元の日帰り穴場を掘り下げ、見どころやおすすめプランを提案します。

【いこレポの特徴】
お出かけコンシェルジュが、完全オリジナルの”子どもが喜ぶ遊び場・お出かけまとめ”記事を執筆します。お台場、伊豆などの人気エリアのまとめ記事を読んで週末のお出かけや旅行計画を立てたり、最新記事からお出かけのトレンド情報を探ったり、人気テーマ別記事から新しいお出かけ体験を見つけることができます。
(ニュースリリースより転載)

さて、このブログはTechブログなので、裏側の仕組みについて少しご紹介したいと思います。

私が入社したタイミングでサービスを始めることは決まっていましたが、設計はこれからという状況でした。自社サービスをやっている会社だと、新規機能開発は度々あっても全くの新規プロダクトの開発に最初から入れる機会は少なく、それだけでもラッキーなのに、どのように作るかについてもほとんど決めて良さそうだったので、やってみたいと思っていたことはほぼ思い通りつぎ込みました。

ソフトウェア構成

弊社でサーバサイドの開発というとRailsでというのが既定路線となっています。他の言語やフレームワークを採用する理由も特になかったですし、開発期間がそう長いわけではなかったので、今回もそのまま踏襲しました。

ということで、開発時の最新バージョンということで次の様な構成です。

  • Ruby 2.4
  • Rails 5.1
  • nginx
  • Vue.js


弊社的に新たな試みとしては、Vue.js の導入です。
いこレポに掲載する記事は自前のCMS機能で執筆されていますが、その部分をほぼ、Vue.js で書きました。React + Redux という選択肢も一応は考えたのですが、ちょっとしたアプリを書いてみて、いまいち私の肌に合わなかったので、ほぼ独断でVue.jsを採用しました。結果的には採用して良かったです。
webpacker によるビルドも、デフォルトで組み込まれている設定がよくできており、ハマる部分はありませんでした。

インフラ構成

ソフトウェア構成をオーソドックスに済ませた分、インフラでは色々、当社としては初めての構成を試みています。

まず最初に、サーバはDockerコンテナで動かそうと決めていました。
Dockerで動かす理由は、仕組みとして Dockerfile にサーバの構築手順がコード化されること、将来的にサーバの台数が増えても OS や基本パッケージの更新がアプリケーションのデプロイと同時にできてしまうので手間が少ないだろうということ、いまどき直接あれこれインストールしてサーバを作るのなんてしないよねいう思い込みです。
開発環境も docker-compose up だけで同じ構成のサーバがローカルで起動できるようにしています(流石にDBはMySQLですが)。

そして、AWSの便利サービスはロックインを恐れず積極的に活用することも最初に方針として決めました。 結果的に現時点で使っているAWSのサービスは次のとおりです。

  • ElasticBeanstalk (Multi Container Docker)
  • RDS Aurora
  • ClowdWatch Logs
  • SES
  • S3
  • ClowdFront
  • Route53
  • ECR (EC2 Container Registry)
  • CodeBuild
  • CodePipeline

AWS 上で Docker を動かす仕組みは何種類かあるのですが、ElasticBeanstalk を選択しました。理由は AWS 側でやってくれることが最も多いからです。 環境を作ると、アプリケーションを実際に動かす ECSインスタンスはもちろん、ALB+ターゲットグループ、オートスケーリング、デプロイとひと通りの仕組みを用意してくれます。 これに、CodePipeline と CodeBuild を組み合わせることで、 Github 上で PR をマージすると自動的にデプロイされるように構成しています。

また、これらのインフラ構築を出来る限りコード化することも目指しました。VPC のネットワークは Ansible で構築しています。アプリケーションサーバの構築については CodeBuild で Docker イメージのビルドを行うので、Dockerfile と CodeBuild のビルド定義ファイルである buildspec.yml でコード化ししており、それを稼働させる ElasticBeanstalk 環境も設定ファイルを用いて、eb コマンドで構築できるように定義しています。
部分部分でコード化の仕組みがバラバラで統一感がないのとCI環境の構築についてはコード化できていないのは今後の課題と思っています。

今後について

いこレポがネット上での存在感を高め、編集チームの皆さんが一生懸命書いた記事をできるだけ多くのパパ・ママに届けるために技術的にできることはどんどんやっていきたいと思っています。
今はまだ、記事数がそれほど多くないですが、増えてくると探せない問題が発生すると思うので、検索、レコメンデーションなども検討していきたいと思います。
また、本番を運用する環境についてはできていますが、開発バックエンドであるステージング環境、開発環境についてはいこーよに遅れを取っているのでこの改善も課題です。

アクトインディでは、いこレポを一緒にグロースさせていくエンジニアを待っています