AWS入門 - ECSでBlue/Greenデプロイしてみる
AWSを使う必要が出てきたので、色々と試してみる。
ここでは、ECSのBlue/Greenデプロイを試す。
Blue/Greenデプロイ
Martinが結構前に言ってたらしい。
BlueGreenDeployment
2つの環境(BlueとGreen)を用意し、ルーティング設定を切り替えることでデプロイする仕組みのこと。
既にデプロイ済みの環境(Blue)があったとして、新しい環境(Green)をルーティングに紐付けない状態で用意する。その後にルーティングの設定を切り替えて、BlueではなくGreenへとデータが流れるようにする。
こうすることで安全にデプロイできるし、切り戻しもルーティング設定の変更で簡単に対応できる。
ECSでBlue/GreenデプロイするPipelineを組んでみる
ECSサービスを作成する
まず、デプロイするためのECSサービスを作成する。
この時、Blue/GreenデプロイするためにALBと紐付ける。
サービスが作成され、Networking --> Target groups --> Load balancer と辿っていくとALBに紐付いていることがわかる。
後から分かったが、ECSサービスのデプロイタイプを Blue/Green deployment に設定する必要があった。
ただし、新しいVerのUIだと Rolling update しか選択できない?ので、古いUIに戻す必要がある。(未実装?)
また、設定するロールには必要なポリシーを追加しておく。
とりあえず、AmazonECS_FullAccessをアタッチしておく。
Blue/Greenデプロイするアクションを設定する
CodePipelineは前回作ったやつを流用する。
最後のDeployステージを、ECSへBlue/Greenデプロイするアクションへと変更してみる。
また、imageDetail.json, taskdef.json, appspec.yml が必要らしいのでファイルを追加しておく。
{
"ImageURI": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/mynginx"
}
{
"executionRoleArn": "arn:aws:iam::xxxxxxxxxxxx:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "mynginx",
"image": "<IMAGE1_NAME>",
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
]
}
],
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512",
"networkMode": "awsvpc",
"family": "my-task-1103"
}
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: <TASK_DEFINITION>
LoadBalancerInfo:
ContainerName: "mynginx"
ContainerPort: 80
<IMAGE1_NAME>
は↓を設定すると書き換えてくれるらしい。
これでアクションを追加し保存。
git push するとパイプラインが開始される。
デプロイが開始され、BlueとGreenが両方とも存在する状態になった。
ALBのTargetGroupには新しい方だけ紐付いている。
で、指定した時間がたったら古い方は消してくれるはず。
まとめ
やってることは大して難しくないはずなのだが、
コンソール画面が使いづらいので難しく感じる気がする。。。
Discussion