はじめに
弊社はAWSのリソースをTerraformで管理しているのですが、Fargateのプラットフォームバージョンの固定に失敗したお話を書きます。
将来、v1.5.0が出た時に、同じ轍を踏まないように、同様な事象で困った方のお役に少しでも立てれば良いなと思い、この記事を書きました。
環境
- Terraform v0.12.20
- Amazon ECS
- Fargate v1.3.0
- AWS CodePipelineによるBlue/Greenデプロイ
- バッチ処理時、アプリケーションの方からAWS SDK経由でECSタスクを起動
経緯
2021年の3月頃、FargateのプラットフォームバージョンのLATEST
が1.3.0 -> 1.4.0
へ更新されました。
その更新されるというアナウンスが来た時点で、ECSを管理しているTerraformのコードを確認したところ、プラットフォームバージョンは指定されておらず、デフォルト値のLATEST
で動いている事が判明。
そこで、対応としては、LATEST
(この時点ではv1.3.0)で動いている物に関しては、v1.3.0
に固定するという対応を行いました。
-
aws_ecs_service
のplatform_version
に1.3.0
を指定
resource "aws_ecs_service" "api" {
# ... other configuration ...
launch_type = "FARGATE"
platform_version = "1.3.0"
# ... other configuration ...
}
そして頃合いを見て、v1.4.0
の検証を行い、動作に問題無ければ順次v1.4.0
に上げていく予定でした。
問題発覚
ある日、v1.4.0
で動いているECSタスクを発見!!!
原因&対応
複数の原因があり、それぞれの対応を行ったところ、無事にv1.3.0
で起動しました
[原因1] CodePipelineでBlue/Greenデプロイを行っていたので、デプロイ時にCodeDeployの設定で上書きされてしまうが、CodeDeployの設定にはプラットフォームバージョンの記載が漏れていた
- -> [対応]
appspec.yaml
のPlatformVersion
に1.3.0
を指定
# ... other configuration ...
PlatformVersion: "1.3.0"
[原因2] AWS SDKを使用してECSタスクを起動している箇所への設定が漏れていた
- バッチ処理用にアプリケーションから一時的にECSタスクを起動していた
- -> [対応] ECSタスク起動時処理の
platform_version
に1.3.0
を指定
launch_type: "FARGATE",
platform_version: "1.3.0",
- AWS SDK for Ruby
[原因3] バージョン指定方法に誤りがあった(番外編)
- 誤って
1.3
と指定していた箇所があったが、パッチバージョンまで正確に記述しないとPlatformUnknownException
が発生する - -> [対応]
1.3.0
とパッチバージョンまで指定
終わりに
v1.4.0
でENI周りの変更があったので、ECSタスク起動時に問題が発生するかと思っていたのですが、恐らく、NATゲートウェイ経由で良い具合に通信ができたいたため(未検証)、不幸中の幸いで障害は起こりませんでした。
しかし、意図せずバージョンが上がり、使用しているアーキテクチャの後方互換性が保たれていない場合に、ある日突然アプリケーションが動かないという事態は十分に起こりえます。
将来、LATEST
がv1.5.0
を指した時に、同様な事象で困った方のお役に少しでも立てれば幸いです。