こんばんは、しーまんです。
先日 Fargate Spot を導入してインフラ費用の削減を行った話を投稿しました。
その際にBlue-Greenデプロイで少し躓いた点がありましたので、今回はその話をまとめてみました。
もしFargate Spotを導入検討されている方や、デプロイ周りで躓いている方は参考にしてみてください!
Fargate Spot
まずはFargate Spotについて簡単におさらいしておきましょう。
Fargate SpotとはAWSが提供するマネージドコンテナサービスであるFargateを、余剰リソースを使用することで通常より安く使用できるサービスです。
コンテナ費用を削減したいという方が検討するべきサービスになります。
こちらの導入方法については前回の記事を参考にして導入してみてください。
導入時に躓いた点
今回はFargate Spot導入時に躓いた点を話したいと思います。
導入自体はとても簡単でそんなに苦労しなかったのですが、デプロイ周りで予想外の挙動が起こりました。今回アプリをデプロイする時にCode DeployによるBlue Greenデプロイを使用していました。
Fargate Spotを導入するにはECS Serviceにキャパシティープロバイダーという設定を入れます。
しかしここが今回ハマった点で、デプロイを行うと折角設定したFargate Spotのキャパシティープロバイダー設定が消えてしまいました。
でも大丈夫です。
Fargate Spotのリリース当初はCode DeployによるBlue Greenデプロイは未対応だったらしいですが、こちらはもう対応されています。
あまり情報が無かったですが、私の方で試してみたところ問題なく動作することが確認できます。
ですので、次項目の対応を行ってみてください。
Blue-Greenデプロイの対応方法
Fargate Spotの設定であるキャパシティープロバイダー設定をCode Deployを使用したデプロイ時に維持できるようにしたいです。
そこでCode Deployの設定ファイルであるappspec.ymlを編集します。
変更前のAppSpecファイルの例は以下です。
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "<TASK_DEFINITION>"
LoadBalancerInfo:
ContainerName: "web"
ContainerPort: 80
プロパティにタスク定義とロードバランサーの設定のみを記載しておりました。
続いて変更後の例は以下になります。
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "<TASK_DEFINITION>"
LoadBalancerInfo:
ContainerName: "web"
ContainerPort: 80
CapacityProviderStrategy:
- CapacityProvider: "FARGATE"
Weight: 1
Base: 0
- CapacityProvider: "FARGATE_SPOT"
Weight: 2
Base: 0
プロパティにキャパシティプロバイダーの設定が追加されているのが分かると思います。
ここにキャパシティプロバイダーの設定を入れることでCode Deploy時にサービスのキャパシティプロバイダーを反映させることができます。
まとめ
今回は、Fargate Spot 導入時にデプロイで躓いた点について解説しました。
Fargate Spotの設定であるキャパシティープロバイダーの設定がCode Deployのタイミングで消えてしまう問題です。こちらの問題はCode Deployの設定であるAppSpecにキャパシティープロバイダーの設定を追加することで解消されます。
なかなか検索しても見つからなかったので、私と同じようにハマった人もいたのではないでしょうか。
同じような事象に陥って困っている方の参考に少しでもなりましたら幸いです。
コメント