最近は自分の中で ASP.NET Core への興味が高まってきてるので、実行環境をいつもの Azure ではなく今回は AWS の Elastic Beanstalk を使ってみることにします。
タイトルに 2 つの方法と書いた通り、Windows Server 2012 R2 と Amazon Linux 上の Docker の両方で動かしてみることにします。まずはアプリケーションを作ります。
アプリケーションの準備
用意した ASP.NET Core アプリケーションは Visual Studio で作成した、極々普通のものです。俗にいうテンプレートそのままアプリです。
Elastic Beanstalk で ASP.NET Core アプリケーションを実行するために、まずはコマンドで言うところの dotnet publish を実行しておく必要があります。
これは Visual Studio の発行機能を使うことにします。
カスタムのプロファイルを作成して、ファイルシステムに出力するだけの簡単な設定です。
この設定が地味に重要なので確認しておきます。ターゲットランタイムが Any になっていることをちゃんと確認しておきましょう。デフォルトだと Any で変更不可なので、変える人はまあいないと思いますけど。
実行する ASP.NET Core アプリケーションの大体の準備は終わったので、これからは Elastic Beanstalk に依存する部分の設定を追加します。
Windows Server 2012 R2 を使う
Elastic Beanstalk で提供されている Windows Server 2012 R2 の AMI には .NET Core がインストール済みなので、単純に MSDeploy パッケージを作ればデプロイ出来そうですが失敗します。
ASP.NET Core のツールチェインが parameters.xml を吐き出してくれないので、デプロイ先の Web サイトを特定できず死にます。なので専用のマニフェストを json で用意します。
ASP.NET Core Support for Elastic Beanstalk | AWS Developer Blog
デフォルトのマニフェストで基本的には問題ないと思います。
{ "manifestVersion": 1, "deployments": { "aspNetCoreWeb": [ { "name": "app", "parameters": { "appBundle": ".", "iisPath": "/", "iisWebSite": "Default Web Site" } } ] } }
aws-windows-deployment-manifest.json という名前で保存して、project.json と同じ階層に置いておきます。デプロイ先に含まれるように include に追加するのも忘れずに。これで発行を行っておきます。
次に Elastic Beanstalk を作成します。プラットフォームとして .NET を選択すると Windows Server 2012 R2 が選ばれるので、そのまま進めて問題ないです。
この段階でアプリケーションコードをアップロードする必要があるので、先ほど発行しておいたファイルを zip で固めたものを指定しておきます。バージョンラベルは適当に付けておきます。
アプリケーションの作成をクリックすると、Elastic Beanstalk が自動で必要な EC2 インスタンスやセキュリティグループなどを作ってくれるので非常に便利です。
EC2 インスタンスから作る割に起動までは結構素早いです。仕組み的には ASE に近いはずです。
作成が終われば *.elasticbeanstalk.com という URL でアクセス可能になっているのでブラウザで確認しておきましょう。いつもの ASP.NET Core ページが表示されていればちゃんと動作しています。
Windows Server 2012 R2 なので動いて当然という感じはしてきますね。
ポイントとしては Elastic Beanstalk 用にマニフェストを追加するぐらいで、あとはデフォルトのままで問題なかったです。ランタイムがインストールされているので、アプリケーションパッケージも最小で済みます。
Amazon Linux 上の Docker を使う
Windows Server だと面白みと新鮮味に欠けますが、Amazon Linux の Docker は目新しさが出てきそうです。と言っても Docker Hub には ASP.NET Core 用のリポジトリが公開されてます。
https://hub.docker.com/r/microsoft/aspnetcore/
.NET Core のリポジトリもありますが、ASP.NET Core の方がタグが分かりやすいです。
先ほどはマニフェストファイルを作成しましたが、今回は代わりに Dockerfile を作成して ASP.NET Core プロジェクトに追加する形になります。
FROM microsoft/aspnetcore:latest COPY . /app WORKDIR /app EXPOSE 80 CMD ["dotnet", "AspNetCore-Sample.dll"]
Visual Studio でビルド済みのアプリケーションをデプロイするので、dotnet コマンドにはビルドされた dll を指定する形にしています。ファイル名を指定しないといけないのは少しダサいです。
アプリケーションの準備が出来たので、Elastic Beanstalk に新しい環境を作成します。プラットフォームに Docker を選択するぐらいで、あとは Windows の時と変わりません。
例によってこの段階でアプリケーションコードをアップロードする必要があるので、Dockerfile を含めて発行した結果を zip で固めたものを指定しておきます。
環境の作成を実行すると、同じように EC2 インスタンスなどが作成された後、docker build が Elastic Beanstalk によって実行されて環境が完成します。デプロイは非常に高速です。
ブラウザでアクセスして、Windows Server の時と同じように ASP.NET Core ページが表示されていれば、ちゃんと動作していることが確認出来ます。Windows でビルドしたアプリケーションですが、同じものが Amazon Linux 上でも普通に動きました。
同じ Elastic Beanstalk アプリケーションに Windows Server と Docker の環境が用意できたので、最後に環境のスワップを行って遊んでおくことにします。DNS を切り替えるだけです。
Windows Server から Docker にスワップとか実際には使いどころはないと思いますが、DNS の切り替えなのでこういうことも出来るということで。クラウドサービスを思い出しますね。
ダッシュボードを確認すると、環境名と URL が一致していないので入れ替わっていることが分かります。ASP.NET Core は割と実行環境を選ばないので、特定の環境に縛られないのが良いですね。