ENECHANGE Developer Blog

ENECHANGE開発者ブログ

ブルー/グリーンなAmazon ECSサービスのネットワーク設定を変える方法

AWS CodeDeployでブルー/グリーンデプロイしているAmazon ECSサービスについて、もしネットワーク設定を変えたくなったら、AppSpecを編集したうえで、新しいデプロイメントをトリガーしましょう。

この方法を知らないと、ECSサービスをわざわざ作り直すか、ネットワーク変更をあきらめるか、どちらかになってしまいます。

背景

CodeDeployでブルー/グリーンデプロイしているECSサービスでは、ネットワーク設定を直接的には変更できません。

ECSのUpdateService APIを呼び出して変更しようとすると、下記のエラーが起こります。

InvalidParameterException: Unable to update network parameters on services with a CODE_DEPLOY deployment controller. Use AWS CodeDeploy to trigger a new deployment.

これは、CodeDeployで新しいデプロイメントをトリガーする必要があることを示すエラーメッセージです。

この制約についてはドキュメントにも書かれています。

For services using the blue/green (CODE_DEPLOY) deployment controller, only the desired count, deployment configuration, health check grace period, task placement constraints and strategies, enable ECS managed tags option, and propagate tags can be updated using this API. If the network configuration, platform version, task definition, or load balancer need to be updated, create a new AWS CodeDeploy deployment. For more information, see CreateDeployment in the AWS CodeDeploy API Reference.

引用元:UpdateService - Amazon Elastic Container Service

解決策

新しいデプロイメントをトリガーすべきなのは分かりましたが、具体的にどうしたらよいのでしょうか。

答えは「AppSpecを編集してからトリガーする」です。編集せずにCodeDeployのCreateDeployment APIを呼んでトリガーしても、当然ながらネットワーク設定は変わりません。

appspec.ymlの場合、下記のように編集します。

        NetworkConfiguration:
          AwsvpcConfiguration:
            Subnets: ["subnet-1234abcd","subnet-5678abcd"]
            SecurityGroups: ["sg-12345678"]
            AssignPublicIp: "ENABLED"

引用元:AppSpec File example - AWS CodeDeploy

ECSタスクのサブネットやセキュリティグループ、また、パブリックIPアドレスを割り当てるかどうかを、AppSpecで指定するわけです。

その際には、下記ドキュメントの通り SubnetsSecurityGroupsAssignPublicIp のすべてを指定する必要があります。

All or none of the settings under NetworkConfiguration must be specified. For example, if you want to specify Subnets, you must also specify SecurityGroups and AssignPublicIp. If none is specified, CodeDeploy uses the current network Amazon ECS settings.

引用元:AppSpec 'resources' section (Amazon ECS and AWS Lambda deployments only) - AWS CodeDeploy

AppSpecを編集後、新しいデプロイメントをトリガーすれば、ネットワーク設定が変わります。グリーン環境のECSタスクが、指定したネットワークで起動されるはずです。

デプロイメントが完了したら、AppSpecから NetworkConfiguration を削除してOKです。

まとめ

以上のように、CodeDeployでブルー/グリーンデプロイしているAmazon ECSサービスでも、AppSpecを編集したうえで新しいデプロイメントをトリガーすれば、ネットワーク設定が変えられます。

筆者の岩本はこの方法を知らず、もう少しでECSサービスを作り直すところでした。この記事が、似たような状況にある方の参考になれば幸いです。