鉄道料金計算問題の AWS 構成を紹介する
はじめに
本記事は弊社の社内アドベントカレンダー向けの記事です。
今年で社内アドベントカレンダーへの参加は 3 回目で、過去 2 回はドメイン駆動設計に関する記事を投稿していましたが、今年は AWS 移行漬けの一年だったため AWS 関連の記事にしました。
私が個人学習で取り組んでいる 鉄道料金を計算する DDD の課題 を AWS に移行したので、移行後のシステム構成を紹介したいと思います。
Terraform
以下で紹介する AWS システム構成は Terraform を使って構築しました。Terraform に興味ある方は 私の GitHub リポジトリ に置いてあるので覗いてみてください。
Terraform は 公式の Docker イメージ を使いました。バージョンは 1.0.11
です。
AWS システム構成
コンテナ間の通信
AWS に構築したマイクロサービス間の通信方式は何パターンかありますが、今回は サービスディスカバリ という ECS の機能を使って実現しました。サービスディスカバリとは ECS クラスタ内のコンテナ間通信を簡単に実現するための仕組み のことです。具体的には下図に示すように各コンテナへアクセスするための A レコードが Route 53 に自動で登録される機能で、例えば fare-api.fare.internal
というドメインで fare マイクロサービスのコンテナと通信できます。
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