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デプロイの場合は、
- codebuildでテストし、テストがとおればdockerやECRにタグ付けしたイメージをpushする。
- ECSなどで、最新のイメージを使うように設定する。
というふうにイメージを経由した設計になる。小さいプロジェクトだし、できれば高いからECRとか使いたくない。
EC2でデプロイする方法
調査中
実際の流れ
codepipelineを作成する
ソースはgithubでmasterブランチにマージされた場合に発火するようにする。
- masterブランチにマージされた
- code bulidが起動。npm ciでnode_modulesをダウンロード。jsにトランスパイル後に、テストを実行する。
- テストが成功すれば
既存の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が必須になる。
このチュートリアルに従って、サービスロールとかつける
code deployはec2をタグによって判別するか、もしくはオートスケーリンググループによってEC2を設定できるみたい。
困った。チュートリアルはなんかHTMLファイルだけっぽいし。
デプロイ時にpm2とかどうするのか。
これが参考になりそう。
AppSpec fileと言われるものを作ってそこにデプロイ処理を書く
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
これ参考になりそう
自分の環境だと次のようになるのか
- codepipelineで masterブランチにマージされたら発火
- code buildでtypescript -> js へのトランスパイルを実行
- トランスパイルされたものに対してテストを実行
- トランスパイルされたものを成果物としてzip化して、code deployにわたす
- code deploy でzipを解答する。
- 再スタートスクリプトを実行する
2 ~ 4 は buildspec.ymlに設定ファイルを書く
5 は appspec.yml に設定ファイルを書く
EC2の設定
- pm2 をデーモン化しておく
- pm2 でwatch機能を有効化しておく
もし、トランスパイルしたjsをバージョニングしてどこかに保存したい場合は、4でS3などに保存するとよいかも。