Terraform/AWSでBlueGreen deploy環境構築とCodePipelineでのdeploy自動化

背景

  • 対象プロダクトのリニューアルに伴い、EC2で稼働していた旧バージョンから一新したい。
  • 旧バージョンはモノリスなアーキテクチャで、リリースやメンテに一苦労している。
  • バックエンドとフロントエンドの2ラインに分けてアプリケーションを管理したい。
  • IaCにて、クラウドインフラストラクチャをコードで管理したい。

制約

  • production, stagingのデータは、既存のRDSを利用する。
  • フロントアプリケーションはscope out。

運用方針

  • 環境はproduction, staging, previewの3つ存在。全く同じ構成を作成するため、それぞれの環境ごとに.tfstateを管理する。
  • CodeBuildのプロセスは、アプリケーションを管理しているリポジトリにbuildspec.ymlを配置してそれに記述する。
  • CodeDeployの必要資材(appspec.yml, taskdef.json)は、CodeBuildのプロセス内で生成する。
    ( 仕様により必要資材のサイズは3MBを超えられないらしい。Source StageのArtifactをそのまま利用したらサイズが大きすぎてエラーになる。かなりの沼ポイント。 )
    実際の記述は以下。テンプレートを用意してそこから生成している。
# (omitted)
- cat $TASKDEF_TEMPLATE_FILENAME | sed -e s@\<PHP_IMAGE\>@$REPOSITORY_URL_PHP:$IMAGE_TAG@ > taskdef.json

感想とか

  • Terraformerにかなりお世話になった。本稼働しているRDSの情報を引っ張ってきたり、AWSのコンソールから手動で作ったリソースを引っ張ってきて値を確認したり、 terraform import だと多少手間がかかりそうな作業を簡単にできた。