M1 Mac で AWS Deploy Tool for .NET を使って ASP.NET Core を ECS クラスターへデプロイする際の注意事項

2023.01.01

いわさです。

先日 .NET on AWS のセルフペースデジタルコースを紹介しました。
ただ、私はモジュール 3 のハンズオンでうまくクラスターが立ち上がらずにスキップしてスキルアセスメントを実施していました。

その後、トラブルシューティングを行ってハンズオンにいくつか手順を追加することでうまくいきました。
M1 Mac で AWS Deploy Tool for .NET (AWS .NET deployment tool) を使って ECS をデプロイする場合とASP.NET Core を ECS へデプロイする場合に同じような事象に遭遇する可能性があるので備忘録として残しておきます。

事象: ECS デプロイ後に全タスクが起動後即終了してしまう

ハンズオン手順の全体については冒頭の記事から公式サイトをご参照ください。
関連のある手順としては以下を実施しました。

  • dotnet new webapp でプロジェクトを作成し SSLリダイレクトを無効化しコントローラーにヘルスチェック用のメソッドを追加
  • dotnet aws deploy でデプロイ

ECS クラスターがデプロイされましたが、全てのタスクが起動後に全て終了されてしまいました。

対処 1 : マルチ CPU アーキテクチャーに対応させる

マルチ CPU アーキテクチャーに追加の詳細は以下をご参照ください。

初めはヘルスチェックに問題があってタスクが終了してしまっているのかと思いましたが、ヘルスチェックが走る前にタスクが Running になった直後にすぐにタスクが終了してしまっていました。
以下を参考にヘルスチェックタイミングを遅延させましたが事象は改善せず、設定を見直しているうちに CPU アーキテクチャーについて失念していることに気が付きました。

そこでプラットフォームにlinux/amd64を指定したいところですが、dotnet aws deployでの指定の仕方がわかりませんでした。
こちらは構成中のmoreオプションでDocker Build Argsを指定出来るのでそこでオプションとして指定することが出来ました。

:

Current settings (select number to change its value)
----------------------------------------------------
1 . ECS Cluster: WeatherAPI2
2 . ECS Service Name: WeatherAPI2-service
3 . Desired Task Count: 2
4 . Application IAM Role: *** Create new ***
5 . Virtual Private Cloud (VPC): *** Default ***
6 . ECS Service Security Groups: 
7 . Task CPU: 256
8 . Task Memory: 512
9 . Elastic Load Balancer: 
        Create New Load Balancer: True
        Deregistration delay (seconds): 60
        Health Check Path: /
        Health Check Timeout: 5
        Health Check Interval: 30
        Healthy Threshold Count: 5
        Unhealthy Threshold Count: 2
10. AutoScaling: 
        Enable: False
11. Environment Variables: 
12. Docker Build Args: 
13. Dockerfile Path: ./Dockerfile
14. Docker Execution Directory: 
15. ECR Repository Name: weatherapi2

Or press 'Enter' to deploy:
12

Docker Build Args:
The list of additional options to append to the `docker build` command.
Enter value. Type <reset> to reset.): 
--platform=linux/amd64

Current settings (select number to change its value)
----------------------------------------------------
1 . ECS Cluster: WeatherAPI2
2 . ECS Service Name: WeatherAPI2-service
3 . Desired Task Count: 2
4 . Application IAM Role: *** Create new ***
5 . Virtual Private Cloud (VPC): *** Default ***
6 . ECS Service Security Groups: 
7 . Task CPU: 256
8 . Task Memory: 512
9 . Elastic Load Balancer: 
        Create New Load Balancer: True
        Deregistration delay (seconds): 60
        Health Check Path: /
        Health Check Timeout: 5
        Health Check Interval: 30
        Healthy Threshold Count: 5
        Unhealthy Threshold Count: 2
10. AutoScaling: 
        Enable: False
11. Environment Variables: 
12. Docker Build Args: --platform=linux/amd64
13. Dockerfile Path: ./Dockerfile
14. Docker Execution Directory: 
15. ECR Repository Name: weatherapi2

Or press 'Enter' to deploy:

これによってタスクが正常に起動されるようになりました。

対処 2 : ヘルスチェックのために ASP.NET Core の ASPNETCORE_URLS を指定

タスクはすぐには終了しなくなりましたがヘルスチェックに失敗する状態でした。
それによって一定時間後にタスクがやはり終了する状態になってしまっていました。

こちらはヘルスチェックということで ASPNETCORE_URLS の指定が必要だろうと気が付きました。
以前 App Runner で実行した際にも環境変数で指定したことがありました。

先程の Docker Build Args に加えて環境変数も追加します。
ALB から 80 ポートで HTTP ヘルスチェックが発生していたので、ここでは http://*:80 を指定しました。

Or press 'Enter' to deploy:
8

Environment Variables:
Configure environment properties for your application.
Enter the name:
ASPNETCORE_URLS
Enter the value (type <reset> to reset):
http://*:80

Current settings (select number to change its value)
----------------------------------------------------
1 . Desired Task Count: 2
2 . Application IAM Role: *** Create new ***
3 . ECS Service Security Groups: 
4 . Task CPU: 256
5 . Task Memory: 512
6 . Elastic Load Balancer: 
        Create New Load Balancer: True
        Deregistration delay (seconds): 60
        Health Check Path: /
        Health Check Timeout: 5
        Health Check Interval: 30
        Healthy Threshold Count: 5
        Unhealthy Threshold Count: 2
7 . AutoScaling: 
        Enable: False
8 . Environment Variables: 
        ASPNETCORE_URLS: http://*:80
9 . Docker Build Args: 
10. Dockerfile Path: ./Dockerfile
11. Docker Execution Directory: 
12. ECR Repository Name: weatherapi2

実行後、期待どおりヘルスチェックも正常動作するようになりました。

さいごに

本日は M1 Mac で AWS .NET deployment tool を使って ASP.NET Core を ECS クラスターへデプロイする際の注意事項ということで、先日のセルフペースデジタルコースのトラブルシューティングがてら情報をまとめてみました。

AWS .NET deployment tool に関する設定方法だったり、ASP.NET Core の環境変数だったりと .NET on AWS に関する領域だったので、後から見てみると簡単な問題かもしれないですがなかなか類似の情報が見当たらず苦労しました。同じ問題を抱えているかたの参考になると嬉しいですね。