Closed11

AWSでバックエンドをEC2でCDするログ

ハトすけハトすけ

CI自体はgithub actionsでdockerを使って実現している。

最近、リリースサイクルが短くなり、手動リリースがつらい。

CDをAWSのcode pipeline使って実現するログをここに。

ハトすけハトすけ

前提

  • express with typescript
  • リリース時にはnpm run buildコマンドを使って内部でtscによるtypescript -> js のトランスコンパイルをしている。
  • トランスパイルしたコードに対してpm2 startを実行
  • dockerの環境は構築されているので、testしたいときにはdocker-composeで環境構築してテストコマンドを実行するだけでよい。

code pipelineについて調査したこと

だいたいEC2デプロイよりも、ECSデプロイとかの情報が多い。
ECSデプロイの場合は、

  1. codebuildでテストし、テストがとおればdockerやECRにタグ付けしたイメージをpushする。
  2. ECSなどで、最新のイメージを使うように設定する。
    というふうにイメージを経由した設計になる。小さいプロジェクトだし、できれば高いからECRとか使いたくない。

EC2でデプロイする方法
調査中

実際の流れ

codepipelineを作成する
ソースはgithubでmasterブランチにマージされた場合に発火するようにする。

  1. masterブランチにマージされた
  2. code bulidが起動。npm ciでnode_modulesをダウンロード。jsにトランスパイル後に、テストを実行する。
  3. テストが成功すれば
ハトすけハトすけ

既存のEC2やオンプレミス環境にcode deployを適用するには code deployエージェントをダウンロードするだけでいいみたい。

ハトすけハトすけ

とりあえず、既存のEC2のIAMロールにAmazonEC2RoleforAWSCodeDeployポリシーをアタッチ。

ハトすけハトすけ

UserDataに以下を追加するとインスタンス作成時に自動的にcode deploy agentがダウンロードされるみたい。とりあえずすでにインスタンスを作ってしまっているので、手動でやる

#!/bin/bash
yum -y update
yum install -y ruby
yum install -y aws-cli
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-us-east-2/latest/install . --region us-east-2
chmod +x ./install
./install auto
ハトすけハトすけ

どうやらcode deployはインスタンスに紐付いた タグによってデプロイするインスタンスを判別するみたいなので、タグのNameが必須になる。

ハトすけハトすけ

AppSpec fileと言われるものを作ってそこにデプロイ処理を書く

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-example.html#appspec-file-example-server

version: 0.0
os: linux
files:
  - source: Config/config.txt
    destination: /webapps/Config
  - source: source
    destination: /webapps/myApp
hooks:
  BeforeInstall:
    - location: Scripts/UnzipResourceBundle.sh
    - location: Scripts/UnzipDataBundle.sh
  AfterInstall:
    - location: Scripts/RunResourceTests.sh
      timeout: 180
  ApplicationStart:
    - location: Scripts/RunFunctionalTests.sh
      timeout: 3600
  ValidateService:
    - location: Scripts/MonitorService.sh
      timeout: 3600
      runas: codedeployuser
ハトすけハトすけ

自分の環境だと次のようになるのか

  1. codepipelineで masterブランチにマージされたら発火
  2. code buildでtypescript -> js へのトランスパイルを実行
  3. トランスパイルされたものに対してテストを実行
  4. トランスパイルされたものを成果物としてzip化して、code deployにわたす
  5. code deploy でzipを解答する。
  6. 再スタートスクリプトを実行する

2 ~ 4 は buildspec.ymlに設定ファイルを書く
5 は appspec.yml に設定ファイルを書く

EC2の設定

  • pm2 をデーモン化しておく
  • pm2 でwatch機能を有効化しておく

もし、トランスパイルしたjsをバージョニングしてどこかに保存したい場合は、4でS3などに保存するとよいかも。

このスクラップは2020/12/13にクローズされました