207のインフラ周りをご紹介
この記事は207 Advent Calendar 2022 2日目 の記事です。
はじめに
207で主にインフラ周りを見ているゲインです。
今回は副業時代から基本的に一人で見ているインフラをご紹介しようと思います。
インフラ構成
アプリケーション
基本的にインフラはAWS上に構築されています。
一部画像解析やGeocoding, アプリの分析データなどでGCPおよびFirebaseを使用している形となっています。
AWS上の主なアーキテクチャはこちらになります。
基本的にアプリケーションは全てコンテナ化しており、Ruby(Rails)とnode.js(Next.js)をFargate上で動かしています。
主なトラフィックとしてはアプリからRailsのAPIへのリクエストとなっています。 配達員向けのアプリを提供している都合上早朝の時間帯は書き込みのリクエストが多く重い傾向です。 昼間は読み込みのトラフィックが多い状態で夜間はほぼほぼトラフィックがないような状態です。 そのため、AutoScalingをSchedulingしており重い時間帯のみコンテナを増やしています。
Next.jsのSSRでは対したトラフィックもないのでinternalな通信をせずに一旦外部に出てRailsのAPIを叩く構成になっています。 将来的にユーザーが増えた場合はinternalなLBを挟むのかコンテナ間通信にするのか考慮しますが、当分はシンプルな状態で運用していきます。
その他管理画面やWebの機能が存在しており,静的なファイルはCloudFrontから吐き出しています。
デプロイはCodeDeployのB/Gデプロイを活用しています。 現状はECRへのPushを起点にCodePipelineを起動しているのですが、いずれCodeDeploy単体でデプロイを行おうと密かに画策中です。
運用
サーバー側のログ、メトリクスやAPMなどは全てNewRelicに集約しています。 バックエンド側ではそれぞれのアプリケーションのSidecarとしてNewRelicのコンテナを起動し、ログやメトリクスの送信を行っています。
アプリ側ではエラーログをSentryに送信し、日々のエラーログ等を観測しています。 アプリはReactNativeを使用しており、NewRelicのReactNative Agentが最近GAばかりなのでまだきちんと導入まで出来ていません。 いずれアプリ側サーバー側をNewRelicで一気通貫で見れるとよいのかなと考えています。
インタビュー記事も上がっているので良かったら見てみてください。
https://newrelic.com/jp/customers/207
データ分析
ざっくりはこちらとなっています。
現状データはAuroraからs3にEmbulkを使用してparquet形式で吐き出してRedash経由でAthenaによるデータ分析を行っています。
EmbulkのコンテナをそれぞれStepFunctionで起動しています。 それぞれのコンテナは1テーブルのみをETLすることだけに注力するようにStepFunctionからcommandのoverrideを行っています。 StepFunctionのそれぞれのテーブル毎の失敗通知はAPI Gatewayの機能を使ってStepFunctionからSlackへ通知を行っています。 あまりLambdaを乱立させるのが好きではないのでこの方法は気に入っています。
Schemaに関してはこちらのプラグイン (embulk-output-s3_parquet)を使用してGlue Catalogで日々更新されています。
出力されたデータはECS on EC2上に構築したRedashで閲覧することが可能です。
今後の課題
アプリケーションに関してかなり雑なスペックおよび台数の決め方をしているため、これらを最適化するために負荷試験を行っていく必要があります。 定期的なライブラリのアップデートも疎かになっている部分があるので、定期的に検知と対応を行う必要もあるでしょう。
運用に関してはSLOをきちんと定義しきれておらず、本当にユーザー影響を感知するような仕組みを作りきれていないというのが正直なところです。
またオンコールの体制も組みきれていないので、ユーザー影響を最小化するための活動はまだまだといったところですね。
データ分析に関してはかなり適当にデータをマスクして吐き出しているだけとなっているため、今後ゴリゴリと分析を行っていく用途には耐えられないことがすでに判明しています。 どのデータは誰が見れてよいのか、どこにデータを格納していくかを今後検討してく必要がありそうです。
まとめ
ざっくりと207のインフラをご紹介しました。 まだまだインフラ周りでの課題はたくさんあるので、メンバーと協力して改善していきたいです。 今後とも応援よろしくお願いします!