このシリーズの最初のポストで、ASP.NET Core アプリケーションを GitHub からデプロイするために、どのように Amazon EC2 インスタンスと AWS CodeDeploy を利用するかについて議論しました。そこでのセットアップは何の検証もなしに、GitHub に対して git プッシュしたすべての内容が実行環境に展開されると仮定しています。 この記事では、品質管理と AWS のクラウド スケールの恩恵を受けるASP.NET Core アプリケーションの AWS 環境を、どのようにして構築できるかを検証していきます。
aws-blog-net-exploring-aspnet-core リポジトリの part2 ブランチに、このポストのコードとセットアップ スクリプトがあります。
デプロイメントの検証
最初のポストでは、appspac.yml ファイルが、ApplicationStart フックの実行中にアプリケーションを展開し、IIS をセットアップするために InstallApp.ps1 スクリプトを呼び出していました。アプリケーションが起動し、実行していることを検証するために、ValidateService フックの実行中に ValidateInstall.ps1 を呼び出すように appspec.yml ファイルを修正してみましょう:
version: 0.0 os: windows files: - source: \ destination: C:\ExploringAspNetCore hooks: ApplicationStop: - location: .\RemoveApp.ps1 timeout: 30 ApplicationStart: - location: .\InstallApp.ps1 timeout: 300 ValidateService: - location: .\ValidateInstall.ps1 timeout: 300
このスクリプトは、アプリケーションが正しく実行しているかを確かめるためのテストを呼び出すことを許可します。GitHub リポジトリ内で、 .SampleApp\src\SmokeTests の下にいくつかの xunit テストを追加しました。このサンプル アプリケーションはもはや単純な "Hello World" Web アプリケーションではありません。従って、アプリケーションに Web コールを行い、正しいレスポンスを取得するためにテストを行う必要があります。現実世界のアプリケーションでは、この検証ステップの間に実行する、はるかに徹底的なテスト スイートを持っているでしょう。
テストが実行される方法を確認するために ValidateInstall.ps1 を見てみましょう。
sl C:\ExploringAspNetCore\SampleApp\src\SmokeTests
# Install the latest dnx runtime
C:\Windows\system32\config\systemprofile\.dnx\bin\dnvm install latest -p
# Restore the nuget references
dnu restore
# Run the smoke tests
dnx test
exit $LastExitCode
テストを実行するために、テストが保存されたディレクトリに切り替えます。依存関係を復元し、dnx test コマンドを実行します。どのテストも失敗した場合は dnx が終了コードに 0 以外を返し、PowerShell スクリプトがそれを受け取ります。AWS CodeDeploy は失敗した終了コードを発見し、そのデプロイメントを失敗とマークします。失敗を確認するために AWS CodeDeploy コンソールからテストの実行のログを取得することができます。
AWS CodePipeline の利用
さて、デプロイメントがスモークテストで実行され、正しくないデプロイメントが検知できるようになりました。同様の方法で、正しくないデプロイメントによってユーザーが影響を受けないことを検証したいと思います。ペスト プラクティスはスモークテストを実行している間、ベータ ステージのパイプラインを利用することです。ベータが成功した場合のみ本番に昇格します。これによって安全なチェックに基づいて継続的デリバリを行うことができます。繰り返しますが、パート1で議論したように我々は ASP.NET Core がソースから実行できる能力によって恩恵を受けます。このことは、パイプラインの中でビルド ステップの構成に煩わされる必要がないことを意味します。パイプラインは、 Amazon S3 か GitHub からソースをプルすることができます。PowerShell スクリプトだけでセットアップが可能な完全なサンプルを提供するために、ここでは S3 をパイプラインのソースとして利用します。AWS CodePipeline は、パイプラインを通じてプッシュされるオブジェクトの新しいバージョンを感知するために S3 をモニタします。GitHub リポジトリの構成に関する情報については、AWS CodePipeline ユーザーガイドをご参照ください。
セットアップ スクリプト
リポジトリ内の PowerShell スクリプト .\EnvironmentSetup\EnvironmentSetup.ps1 は、パイプラインを通じてアプリケーションをデプロイするために必要な AWS リソースを作成します。
メモ:未使用のリソースへの課金を防ぐために、テストが完了したら、 .\EnvironmentSetup\EnvironmentTearDown.ps1 を確実に実行してください。
セットアップ スクリプトは以下のリソースをセットアップします:
- 初期デプロイメント ソースとしての zip アーカイブを含む S3 バケット
- ベータ用の1つの t2.small EC2 インスタンス
- t2.medium インスタンスを使用したロードバランサ付きのオートスケール グループ
- t2.small EC2 インスタンスを利用するベータ用のAWS CodeDeploy アプリケーション
- オートスケール グループを利用する本番用の AWS CodeDeploy アプリケーション
- ソースとしての S3 バケットを伴った AWS CodePipeline と AWS CodeDeploy アプリケーションが利用するように構成されたベータと本番用のステージ
スクリプトが完了したら、ベータ用の EC2 インスタンスと本番用のロード バランサのパブリック DNS が出力されます。両方のステージでデプロイメントが成功したかどうかを見るために、パイプラインの進捗を AWS CodePipeline コンソールでモニタすることができます。
https://cdn.amazonblogs.com/net_awsblog/images/SuccessCodePipeline.png"/>
AWS CodeDeploy デプロイメントのスモークテストは成功しているので、アプリケーションは両方の環境にデプロイされています。
失敗したデプロイメント
デプロイメントが失敗した時に何が起こるかを見てみましょう。.\SampleApp\src\SmokeTests\WebsiteTests.cs テスト ファイルを開いて、テストが失敗するように変更を加えることで強制的にテストを失敗させます。
1
2
3
4
5
6
7
8
9
10
|
[Fact] public async Task PassingTest() { using (var client = new HttpClient()) { Assert.Equal( "Exploring ASP.NET Core with AWS." , response); } } |
リポジトリの中で、.\DeployToPipeline.ps1 スクリプトを実行できます。このスクリプトはアーイブを Zip 圧縮し、パイプラインで利用する S3 ロケーションにアップロードします。これによってベータ環境でデプロイメントが開始されます。(間違ったテストにより、デプロイメントは失敗します)
ベータで失敗したため、デプロイメントは本番ステージを試みようとはしません。これによって本番の健康状態が保たれます。何が起こっているのかを見るために、AWS CodeDeploy コンソールのデプロイメント ログを見ることができます。
結論
AWS CodeDeploy と AWS CodePipeline で、ASP.NET Core アプリケーションをデプロイする完全な継続的デプロイ システムを構築することができました。サンプルとスタートアップ スクリプトを GitHub リポジトリからチェックアウトしてください。このシリーズの次のポストでは、ASP.NET Core のクロス プラットフォーム サポートについて探索していきます。
日本語訳はSA 福井 厚が担当しました。原文はこちらです。
https://blogs.aws.amazon.com/net/post/Tx2EHIJAM9LIW8G/Exploring-ASP-NET-Core-Part-2-Continuous-Delivery