AWS Toolkit for Visual Studio の「Publish to AWS」が刷新され、スケジュール実行されるコンソールアプリや Blazor WebAssembly などもデプロイ可能に

2022.07.08

いわさです。

AWS Toolkit for Visual Studio には AWSへ公開するための「Publish to AWS」というメニューが備わっており、こちらを使うとAWSへアプリケーションを簡単にデプロイすることが出来ます。
先日のAWS Toolkit for Visual Studio のアップデートで、この「Publish to AWS」が大幅にアップデートされました。

一言でまとめると、.NET Core 3.1 以上の、コンソールアプリケーション / ASP.NET Core アプリケーション / Blazor WebAssembly のプロジェクトをデプロイする場合は、AWS CDKベースの新しいデプロイ機能を使うことが出来るようになりました。

やってみる

2022年7月5日リリースのv1.35.0.0から新機能を使うことが出来るようになっています。
ソリューションエクスプローラーで対象プロジェクトを右クリックした際に、「Publish to AWS」が表示されます。

前述のとおり対象プロジェクトは、.NET Core 3.1 以降で構築された ASP.NET Core アプリケーション、サービスやスケジュール実行されるようなコンソールアプリケーション、Blazor WebAssembly アプリケーションが対象になっています。

後述しますが、旧デプロイ方法のメニューも「Legacy」というラベル付きで引き続き実行が可能になっていて、上記以外のフレームワークバージョンやプロジェクトでも旧デプロイ方法でデプロイ出来るものであれば、引き続きデプロイは可能です。

また、Lambdaについてはまだ新しいデプロイ機能は使えないので、引き続き従来のLambdaデプロイインターフェースを使う必要があります。

ASP.NET Core Web アプリ

まずは、ASP.NET Core Web アプリケーションを新規作成し、右クリックから「Publish to AWS」を選択してみます。

新規デプロイ先と、既存リソースを含むデプロイ先が選択可能です。
デプロイに使う認証情報は、ローカル環境で設定された構成プロファイルを使う形になっていて、リージョンとプロファイル名を指定することが出来ます。

ASP.NET Core Web アプリケーションの場合だと、Elastic Beanstalk、ECS on Fargate、App Runner から選択することが出来ます。
従来のデプロイツールはAPIベースでリソースの作成やモジュールアップロードを行う形でしたが、新しいデプロイ機能では AWS CDK ベースでのデプロイとなっています。
CDKを使うので、デプロイ端末では Node.js などの AWS CDK に必要なモジュールを事前にインストールしておく必要があります。

Visual Studio上で設定したデプロイ構成で CloudFormation スタックが作成されます。

ECS on Fargate の場合であれば、タスクやクラスターの設定をデプロイ前に調整することが出来ます。

また、プロジェクトがコンテナ化されていない場合は既存の構成からDockerFileを自動で作成し、ECRへのアップロードも自動で行われます。
こちらは App2Container と異なり静的解析になっているようで、事前にローカルでWebアプリケーションを動作させておく必要はありませんでした。

ECRやALBがデプロイされ、デプロイウィンドウ上ではDNS名などスタックの出力情報が表示されるので、そのままブラウザアクセスすることも可能です。
URLへアクセスすると以下のようにデプロイされたWebアプリケーションへアクセスすることが出来ました。

リソースも少し確認してみます。
ECSではクラスター一式が作成されており、デフォルトではタスク数は3になっています。このあたりはデプロイ前に設定変更が可能です。
正直ECSやASP.NET Core がよくわからなくてもデプロイが出来るので、まず動かしてみてそこから設定や挙動を確認したいときなどにも利用できそうなのが良いなと思いました。

コンソールアプリ

続いてコンソールアプリケーションです。
コンソールアプリケーションのデプロイ先は ECS on Fargate のみで、サービスあるいはスケジュールタスクとしてデプロイすることが可能です。

今回はスケジュールタスクをデプロイしてみます。
コードとしては以下のようなデフォルトのHelloWorldです。

Program.cs

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

スケジュールとして、rate(1 minute)を指定してみました。

このタイプのデプロイでは、ECSクラスターはデプロイされますが、ロードバランサーなどはデプロイされません。
スケジュール実行を実現するために、クラスターをターゲットとした EventBridge ルールがデプロイされており、先程指定したスケジュールはルールのイベントスケジュールとして指定される形になっています。

CloudWatch Logs を確認し、1分ごとに「Hello World!」が出力されていることを確認しました。

Blazor WebAssembly アプリ

続いて、Blazor WebAssembly アプリをデプロイしてみます。
Blazor Server アプリではなく WebAssembly アプリなのでご注意ください。

こちらはなんと、CloudFront + S3 環境へのデプロイになっています。すごいですね。

それ以外

ドキュメントを見ていて気になったのが、今回のターゲットになっていないフレームワークバージョンやプロジェクトタイプの場合どうなるのかです。
こちらも検証してみました。

.NET Framework コンソールアプリ

まずは、.NET Core ではなく、.NET Framework のコンソールアプリです。
こちらは旧来のWebアプリケーションとしてもデプロイ出来ないので、AWS Toolkit for Visual Studio を使ったデプロイは出来ません。

Blazor Server アプリ

先程は Blazor WebAssembly アプリを CloudFront + S3 へデプロイ出来ましたが、Blazor Server アプリだとどうなるでしょうか。
この場合は通常のASP.NET Core アプリケーションと同様で、Elastic Beanstalk、ECS on Fargate、App Runner が選択肢となっていました。

旧デプロイ方法でのデプロイ

冒頭少し触れましたが、旧デプロイ方法もLegacyという表記がされてはいますが、引き続きデプロイすることが出来ます。
こちらはAWS CDKは使わないままなので、CloudFormationスタックは作成されません。

さいごに

本日は AWS Toolkit for Visual Studio で新しくなった「Publish to AWS」機能を試してみました。

Windows + Visual Studio と .NET Core 3.1 以上という前提条件はありますが、簡単に最新フレームワークの.NETワークロードがデプロイ出来るようになっているので、これは Visual Studio ユーザーには大変嬉しいアップデートではないでしょうか。