最近、ECS on Fargateのセキュリティグループを更新に思いの外手こずりました。今回は私が調査した更新手順について共有したいと思います。
ECSにおけるセキュリティグループの設定方法
ECSでは、セキュリティグループをタスク定義レベルではなく、ネットワークインターフェース(ENI)またはECSサービスレベルで設定する必要があります。ECS on EC2ではEC2インスタンスやAuto Scalingグループの設定でセキュリティグループを指定しますが、ECS on Fargateでは、ECSサービスのnetworkConfigurationパラメータで指定します。
ECSサービスのネットワーク設定のアップデート
ECSサービスのネットワーク設定を更新するには、AWS CLIを使用します。具体的には、以下のコマンドを実行することで新しいセキュリティグループIDを指定します。
$ aws ecs update-service --cluster your-cluster-name --service your-service-name --network-configuration "awsvpcConfiguration={subnets=[subnet-1,subnet-2],securityGroups=[sg-1,sg-2],assignPublicIp=ENABLED}"
このコマンドでは、ECSクラスタ名、サービス名、サブネットID、セキュリティグループIDをそれぞれ適切に置き換える必要があります。また、assignPublicIp の値を ENABLED または DISABLED に設定することで、公開IPアドレスの割り当てを制御できます。
ECSサービスのタスク更新
次に、タスクまたはサービスを更新し、新しいセキュリティグループ設定で新しいタスクを起動します。これは、タスクが起動する際にネットワーク設定が決定され、タスクが終了するまでその設定は変更できないためです。
サービスの設定を更新すると、新しいタスクが起動し、既存のタスクが停止します。その際、以下のコマンドを使用します。
$ aws ecs update-service --cluster your-cluster-name --service your-service-name --force-new-deployment
このコマンドを実行すると、サービスは新しいタスクを起動し、既存のタスクを停止します。このとき、新しいタスクが起動される際に、先ほど更新したネットワーク設定が適用されます。
ダウンタイムを発生させずに新しいタスクを更新するためには、minimumHealthyPercentを100%に設定します。これにより、ECSは新しいタスクが正常に起動し、ヘルスチェックを通過するまで既存のタスクを停止しません。
※ 既存セキュリティグループの確認方法
最後に、既存のセキュリティグループを確認する方法について説明します。AWS CLIを使用してECSサービスの詳細を取得することで、既存のネットワーク設定を確認できます。以下のコマンドを使用します。
$ aws ecs describe-services --cluster your-cluster-name --services your-service-name
ここでも、ECSクラスタ名とサービス名をそれぞれ適切に置き換える必要があります。