カンムを支える技術 2020
これはカンム Advent Calendar 2020 の18日目の記事です。昨日はカスタマーサポートを担当している kasai さんによる「山の思い出」の話でした。
さて、自分は今年の5月にカンムに入社して、バンドルカードというサービスのインフラまわりの改善を担当しています。カンムではどんな技術が使われているのか、入社前はなかなか分かりにくいなと感じたので、この記事ではカンムを支える技術について簡単に紹介してみようと思います。
開発
ソースコードや開発の管理には GitHub を使用しています。自分のタスク管理は Issue に強く依存するやり方をしているので、気になることはどんどん Issue にして Project で管理したりしています。
CI には Circle CI をメインで使っており、各リポジトリでは継続的にテストやビルドが実行されています。インフラ関連のリポジトリでは、Issue と連携しやすいという個人的な理由で GitHub Actions を使い始めていたりもします。
プログラミング言語
カンムが提供するバンドルカードのバックエンドは Go と Python3 で書かれています。主要な API やバッチ処理は Go で実装されており、社内の管理系のツールは Python3 と Django で書かれていることが多かったりします。個人的にはどちらの言語にも比較的慣れているので手を出しやすくて助かっています。特に API はテストもしっかり書かれているので開発がしやすいです。
また、バンドルカードが発行するクレジットカードの決済処理システムも全て Go で書かれています。クレジットカードのための通信プロトコルの処理も独自実装していて、その内容を説明した以下の資料は必見です。
フロントエンドとなる iOS や Android のアプリは React Native で作られているので、JavaScript が主に使われています。このあたりは自分はあまり詳しくないのですが、React が分かると色々いじれそうです。
インフラ
全てのサービスは AWS で動いており、EC2 インスタンスや RDS などを使った一般的でシンプルな構成になっています。現在は開発から運用までの効率をあげるべく、ECS/Fargate を使ったコンテナ化も進めています。データ分析やモバイルバックエンドには GCP も活用していて、AWS を中心にしつつ必要であれば他のクラウドサービスも使う、といった感じです。
クラウドリソースの管理には Terraform を使用していて、仮想マシンインスタンスのプロビジョニングには Ansible を使用しています。最近は Ansible と AWS の Session Manager をうまいこと組み合わせる方法を模索中です。
データストア
全てのサービスでデータベースに PostgreSQL を使用しており、AWS の RDS インスタンスで動かしています。自分は入社するまで MySQL しか使った経験がなかったので、PostgreSQL の Schema といった概念や Vacuum などの挙動にはまだまだ戸惑うことがあります。
カンムならではの PostgreSQL のユニークな使い方としては、Que の Go 実装である qg と組み合わせて、非同期処理用のメッセージキューとしても使用しているところです。qg の詳細については以下の資料を参照してみてください。
PostgreSQL の他にも、細かい部分では Redis (ElastiCache) や Elasticsearch (Elasticsearch Service) なども適材適所で使用しています。
モニタリング
メトリクスの収集とアラーティングには Mackerel を使用しており、AWS インテグレーション機能を有効化して AWS リソースの監視なども Mackerel 上でまとめてやっています。アラートの通知先には PagerDuty を使用しており、何かあった時は当番制でやっているオンコール担当に電話がかかる仕組みです。最近はコンテナ化を進めていく中で mackerel-container-agent をインストールしてまわるのが面倒に感じており、Prometheus のようなスクレイピングモデルの導入も検討したいと考えているところです。
アプリケーションのエラーログの収集には Sentry を使用していて、エラーが発生した時は社内の Slack に通知するようにしています。通知されたエラーログはエンジニアの定例ミーティングで確認したり、社内イベントである TechDay を活用して原因などを調査して、コードを修正したりもしています。
また、アプリケーションのパフォーマンスモニタリングには New Relic One を使用しています。最近はこいつのおかげで連携する外部プラットフォームに引きずられて API が遅くなっている問題に気づけたりもしていて活躍中です。導入にあたっては Go の Context を各関数で引き回す対応を hiroakis さんがガッと進めていてかっこよかったです。
データ分析
サービスデータの分析や KPI などの集計には Redash を活用しています。カンムでは職種にかかわらず多くの人が SQL を書けるので、一般的な分析や集計だけでなく、不正検知やモニタリングなど社内で広く使われています。
他にも、サービスのデータは日次で BigQuery に転送しており、長期間にわたるデータの集計や機械学習モデルのための学習データの生成にも使われています。社内のデータ分析に関するニーズは常に高いので、来年はデータの転送まわりをきちんと整備して、BigQuery をより積極的に活用していきたいところです。
おわりに
ここまでカンムを支える技術について紹介してみました。こうして書き出してみると、いい意味で枯れていてシンプルな技術構成になっているなと思います。とはいえ、バンドルカードの機能開発だけでなく新サービスの開発も進んでおり、改善したい部分などは無限にあるのが現状です。
カンムではインフラエンジニアをはじめ全方位の職種で募集をしているので、もし興味があればぜひ話を聞きにきてください。
Discussion