💡

鉄道料金計算問題の AWS 構成を紹介する

2021/12/13に公開

はじめに

本記事は弊社の社内アドベントカレンダー向けの記事です。

今年で社内アドベントカレンダーへの参加は 3 回目で、過去 2 回はドメイン駆動設計に関する記事を投稿していましたが、今年は AWS 移行漬けの一年だったため AWS 関連の記事にしました。

私が個人学習で取り組んでいる 鉄道料金を計算する DDD の課題 を AWS に移行したので、移行後のシステム構成を紹介したいと思います。

Terraform

以下で紹介する AWS システム構成は Terraform を使って構築しました。Terraform に興味ある方は 私の GitHub リポジトリ に置いてあるので覗いてみてください。

Terraform は 公式の Docker イメージ を使いました。バージョンは 1.0.11 です。

AWS システム構成

AWS システム構成図

コンテナ間の通信

AWS に構築したマイクロサービス間の通信方式は何パターンかありますが、今回は サービスディスカバリ という ECS の機能を使って実現しました。サービスディスカバリとは ECS クラスタ内のコンテナ間通信を簡単に実現するための仕組み のことです。具体的には下図に示すように各コンテナへアクセスするための A レコードが Route 53 に自動で登録される機能で、例えば fare-api.fare.internal というドメインで fare マイクロサービスのコンテナと通信できます。

Route 53 のレコード例

RDS 接続情報の管理

RDS のマスタパスワードは tfvars から読み込むようにして GitHub 管理しないようにしました。ただしこの方法でも tfstate にはパスワードが平文で保存されるため、実業務では tfstate 自体を機密情報として扱う必要があります。具体的には tfstate の保管先 ( S3 バケットなど ) への public アクセスが禁じられていることを確実にしましょう。

RDS への接続ユーザの情報およびエンドポイントは Secrets Manager で管理します。Secrets Manager への登録は手動で実施し、設定した内容が catalogue マイクロサービスの環境変数として渡ります。

初期設定や運用

RDS の接続ユーザやテーブル作成などの初期設定や運用作業は Bastion ホストにセッションマネージャで SSH 接続して行います。

外部への通信

ECS や Bastion ホストはセキュリティのため private サブネットに配置していますが、以下の理由で VPC の外に出る必要があるため、Nat Gateway を用意しました。

  • ECS が ECR からコンテナイメージを pull するため
  • Bastion ホストに AWS CLI や PostgreSQL クライアントをインストールするため

残課題

アドベントカレンダーに間に合わせるために急いで構築したため、ログや監視の設定などは入っていません。また自動デプロイの仕組みも構築できていないため、手動でのデプロイになります。

今後順に取り入れていきたいと思います。

参考資料

Discussion