🙆‍♀️

AWS入門 - ECSでBlue/Greenデプロイしてみる

2021/11/11に公開

AWSを使う必要が出てきたので、色々と試してみる。
ここでは、ECSのBlue/Greenデプロイを試す。

Blue/Greenデプロイ

Martinが結構前に言ってたらしい。

BlueGreenDeployment
https://martinfowler.com/bliki/BlueGreenDeployment.html

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をアタッチしておく。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/deployment-type-bluegreen.html

Blue/Greenデプロイするアクションを設定する

CodePipelineは前回作ったやつを流用する。

https://zenn.dev/umatoma/articles/285a3980bb6dc6

最後のDeployステージを、ECSへBlue/Greenデプロイするアクションへと変更してみる。

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/file-reference.html

また、imageDetail.json, taskdef.json, appspec.yml が必要らしいのでファイルを追加しておく。

imageDetail.json
{
    "ImageURI": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/mynginx"
}
taskdef.json
{
  "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"
}
appspec.yml
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