バックエンド側 node.js AWS環境デプロイ(CodeBuild/テスト/RDS/マイグレーション)

2か月前のことなんて全然覚えてないぞパクリ25発目!

パクリ元

内容

以下一覧を完了させて ECS リリースさせることでバックエンド側を終わりとする。順序は適宜入れ替える。

  • 開発環境構築
  • プロジェクト作成・最適なフォルダ構成
  • 認証チェック(含めた前処理) 
  • ログ処理
  • APIによってはIPチェックやHeaderチェック
  • バリデーション
  • 環境ファイルによる振り分け
  • DB参照・更新
  • 外部API呼び出し
  • 外部API呼び出し待ち合わせ
  • 認証・認可
  • SPA における CSRF CORS
  • 長時間処理を非同期処理で
  • メール送信
  • 画像アップロード
  • 画像ダウンロード
  • EXCEL/PDF作成
  • テスト
  • (AWS環境デプロイ)
  • Docker 化確認
  • CodePipeline    ←←← 今回まだココ
  • RDS 対応
  • CloudFront
  • cdk

前々回料金超過のおかげで溜まっていたテストとマイグレーションを試す。しかし全く覚えてないので思い出すまでに毛布を洗濯して乾燥させるぐらいの時間を要す。

テスト

CodePipeline 上に専用のステージを追加してもいいのかもしれないが、簡単に済ませるために以前 Dockerfile 内で実行しているものをそのまま実行するようにする。
pre_build の最後に Dockerfile 内の test ステージ実行 を追加する。

buildspec.yml
version: 0.2
phases:
  pre_build:
・・・
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG --target test .
 ・・・

テストコードでエラーが出るように修正してビルド実行。

pre_build で止まることを確認。テストコードをちゃんと修正して再ビルド。

OK。

マイグレーション

こっちも簡単に済ませるために CodePipeline 上ステージでなく、Dockerfile 内で実行しているものをそのまま呼び出すこととする。テスト後にマイグレーションを実行するように buildspec.yml に追加する。

buildspec.yml
version: 0.2
phases:
  pre_build:
・・・
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG --target test .
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG --target migration .
 ・・・

RDS

テスト内でDBを使用しているのでRDSにて無料利用枠のMariaDBを作成する。

ほぼデフォルト設定。マイグレーションのテスト用なので VPC 等も何も気にしない。出来上がったら「接続とセキュリティ」タブにあるエンドポイントとポートを Dockerfile 内の環境変数としてDB接続先を直書きしているので変更する。本来ならCodeBuild の環境変数として定義するところだろうが。ビルドしてみる。

どうもつながらない様子。パクリ元1つ目を参考につなげようとすると、、止まる。これは セキュリティグループのポート空いてないパターンだな。ポート開けて ssh 上で接続できることを確認。再度 CodeBuild やってもつながらなかったが、データベースは作っておかないといけないパターンだっけか?

MariaDB [(none)]> create database dbtest;
Query OK, 1 row affected (0.00 sec)

データベース作ってから再ビルド。やっぱ繋がらない。ハマったか。
パクリ元2つ目3つ目を見ると、、どうやら CodeBuild から RDS へは VPC を使用しないといけないらしく、CodeBuild では CodeCommit や ECR 等と接続しているので全てその配下に置く必要がありそうだ。これはコトだな、、ここからかなりの時間四苦八苦してパクリ元4つ目5つ目6つ目ぐらいまででVPCの設定が大事だとやっと気づいたので、とりあえず先ほどのRDSは削除してVPCから作成しなおし。

環境の再作成

VPC の作成

新しいVPCを VPC名をtest-vpc 、VPC のアドレス範囲を 10.0.0.0/16 として作成する。

ルートテーブル の作成

VPC作成により自動的にルートテーブルが作られるので、名前を分かりやすく test-routetable-public とする。

今のとは別に、test-vpc のもう一つのルートテーブルを test-routetable-private として作成する。

サブネット の作成

test-vpc のサブネットを作成する。サブネット名は test-subnet-public 、アベイラビリティーゾーンにアジアパシフィック(東京) の 1a、サブネットのアドレス範囲は 10.0.0.0/28 とする。

さらに、test-vpc のもう一つのサブネットを作成する。サブネット名は test-subnet-private 、アベイラビリティーゾーンにアジアパシフィック(東京)の 1a、サブネットのアドレス範囲は 10.0.1.0/28 とする。

今作ったサブネットはルートテーブルが test-routetable-public になってしまっているので test-routetable-private に変更する。サブネットを作る段階でルートテーブルを指定したいところだが、、

インターネットゲートウェイ の作成

インターネットゲートウェイを test-internet-gateway として作成する。

作成したインターネットゲートウェイを VPC にアタッチする。

インターネットゲートウェイのルートテーブルへの紐づけ

パクリ元6つ目を参考に、ルートテーブル test-routetable-public の 0.0.0.0/0 のアドレスに対して作成したインターネットゲートウェイを紐づける。

NATゲートウェイの作成

NATゲートウェイを名前 test-nat-gateway、サブネット test-subnet-public、接続タイプ パブリック として作成する。「Elastic IP を割り当て」ボタンを押下してIPも割り当てる。

NATゲートウェイのルートテーブルへの紐づけ

インターネットゲートウェイ同様、パクリ元6つ目を参考に、ルートテーブル test-routetable-private の 0.0.0.0/0 のアドレスに対して作成したNATゲートウェイを紐づける。

RDS データベースの作成

VPC 配下にデータベースを再度作成することにする。

接続箇所では作成した test-vpc を指定する。

前回忘れていた、データベースも dbtest として作っておく。

すると、アベイラビリティーゾーンが足りないよ、と出てしまう。アジアパシフィック(東京)の 1a しか使っていないからか?

サブネットの作成

サブネット名 test-subnet-private2、アベイラビリティーゾーン アジアパシフィック(東京)の 1c、アドレス範囲が 10.0.2.0/28 のサブネットを追加で作成する。

RDS データベースの作成の続き

追加したサブネットのおかげでエラーなく、DBが作成される。

エンドポイントをDockerfileに反映させるのを忘れない。

CodeBuild を VPC 配下に変更する

CodeBuild の「編集」>「環境」の追加設定項目で VPC、サブネット、セキュリティグループをそれぞれ作成したもので指定して更新する。

マイグレーション再実行

VPC 配下に設定した CodeBuild が成功することを確認する。

OK。

後片付け

VPC やら RDS やら全て削除しておく。

雑感

いやー何もかも忘れていた。もう疲れたので CroudFront と cdk に関しては省略してバックエンド側を終了するものとする。お疲れ様でした!