ASP.NET Core MVC: 環境変数を使う

 環境依存の値をハードコーディングするのはよろしくない。だからそういう値は環境変数として呼び出すのが定石。今回は.NET Core 2.0以降の環境変数の呼び出し方。

 まず環境変数をセットする。今回の一連の開発はDockerで動かすものを作っているのでDocker環境の環境変数設定から。docker-compose.ymlに適当な環境変数を追記する。
docker-compose.yml

version: '3'

services:
tetsujin:
image: matoba/tetsujin
build:
context: ./tetsujin
dockerfile: Dockerfile
environment:
- env=tetsujin


 上記は本番で使う環境変数という想定である。docker-compose.ymlに書いているので。
 たとえばデータベースは本番用と開発環境用があるだろう。開発環境用のはどうすればいいだろうか。appsettings.jsonに書く。
appsettings.json

{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
},
"devenv": "devenv",
"env": "devenv"

}

値は二つ書いてみた。一つはdocker-compose.ymlと同じキーの名前で書いてある。これからまず環境変数を呼び出してみる。さらに、docker-compose.yml(本番用)とappsettings.json(開発環境用)の両方に同じキーの名前の環境変数が定義されていたら、このキー名の環境変数を呼んだときどうなるかということまで。

 Startup.csのメソッドStartupの中で環境変数を呼び出してみる。メソッド内の上二行が追加されたもの。
Startup.cs

public Startup(IConfiguration configuration)
{
Console.WriteLine(configuration.GetValue<string>("env"));
Console.WriteLine(configuration.GetValue<string>("devenv"));

Configuration = configuration;
}


 VisualStudioでデバッグを実行し、出力を確認する。処理の手順として、メソッドStartupは指定ポートでの待ち受けが始まる少し前に出力されている。

docker-compose.ymlに書いた環境変数envの値と、appsettings.jsonに書いたdevenvの値が出力されている。
 環境変数envはdocker-compose.ymlとappsettings.jsonの両方に書いておいたが、docker-compose.ymlのほうの値が出力された。これは優先度によるもので、デフォルトではdocker-compose.ymlのほうに書いた環境変数が優先される。docker-compose.ymlに環境変数がなければ、appsettings.jsonのほうに書いた値が参照される。これを利用して、データベースの接続文字列の本番用、開発環境用を切り替える。
comment: 0

ASP.NET Core MVC: 静的ファイルのキャッシュ設定

 機能を実装する前準備を進める。Startup.csファイルを編集していく。.NET Core 2.0によって簡略化された部分があるので、今回は静的ファイルのキャッシュを設定するぐらいで済みそう。

 メソッドConfigureに下記を追記。
Startup.cs

app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
ctx.Context.Response.Headers[HeaderNames.CacheControl] =
"public,max-age=2592000";
}
});



 Startup.csの編集のおまけにちょっとルーティングをいじる。今後だがルーティングはコントローラに明示していきたいので下記の通り変更した。ここは好み。
Startup.cs

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
   ↓
app.UseMvc();

 ルーティングの設定の変更にともなって、コントローラもちょいと変更しておく。アクション名でのルーティングを外したので、アクションに属性でルーティングをつける。
HomeController.cs

[Route("")]
public IActionResult Index()
{
return View();
}


今回までのコミット


 次回は設定値のハードコーディングを避けるための設定をする。

comment: 0

Dockerで開発しているWebアプリのデバッグをHTTPSで行えるようにする

 VisualStudioでDockerサポートのASP.NET Core MVCアプリを作り始めた。

 イマドキWebサイトは全ページHTTPSがめずらしくない。それがSEO上は有利でもあるし、Let'sEncryptという無料で証明書を取得する手段も出てきたのでやらない手はない。
 全ページHTTPSを見越し、開発環境でのデバッグもHTTPSでできるようにしておく。Dockerサポートを有効にしているので、コンテナを一個つけて、VisualStudioのデバッグ設定を一つ行うだけ。

 まずデバッグ用のcomposeファイルを編集する。docker-compose.override.ymlにリバースプロキシをやってくれるコンテナを加える。あとWebアプリコンテナのポートはホストにバインドしておく必要がなくなったので設定を削除する。
docker-compose.override.yml

version: '3'

services:
tetsujin:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80:80"
   ↓
version: '3'


services:
tetsujin:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ssldevenv:
image: matoba/ssldevenv
ports:
- "443:443"
links:
- tetsujin:webapp


追加されたssldevenvというコンテナは、OpenSSLで発行した証明書を入れたもの。中ではNginXがリバースプロキシの役割で動いている。リバースプロキシはwebappという名前で解決されるホストへつながれるようになっている。なのでlinksでWebアプリコンテナの名前認識を変えてつないでいる。
 実際の中身は下記リポジトリを参照。
https://github.com/hMatoba/ssldevenv



 あとはVisualStudioのデバッグ設定を行う。これまではデバッグ実行ごとにブラウザが立ち上がるようになっていたのでこれを切る。




 VisualStudioでデバッグを実行する。コンテナのビルドなどが終わってローカルにデプロイされるのを待つ。




 ブラウザでhttps://localhostへアクセスしてみる。Webアプリへの接続が確認できるはず。




 開発環境でのデバッグをHTTPS接続でできるようにした。Dockerコンテナを使っているので書き換えるところは多くなく楽だったはず。本番環境でもこれと同様に楽に証明書を取得して接続できるコンテナを用意してある。
https://absurd.azurewebsites.net/Article/121


今回のコミット
comment: 0

VisualStudioで作ったDockerイメージでWebアプリってほんとに動かせるのか試す

前回

 VisualStudioでWebアプリを、Dockerサポートを有効にして作り始めた。ローカルでのデバッグ実行は、ブラウザにサイトが表示されたので成功。ではコンテナを実際Webサーバにのっけるとどうなるだろう。それをAzure Container Instanceで試す。
 DockerでWebアプリを走らせる方法はいくらかある。VPSを用意してそこにDockerを入れるとか。だけどコンテナホスティングサービスを使うのがかなり楽。いろいろ楽。

 まずDockerイメージをビルドしてDocker Hubへプッシュする。Docker Hubをググって探して、アカウントを取得しておく。
 プロジェクト内にdocker-compose.ymlがあるので、imageというキーに対応する値に自分のDockerHubアカウント名を入れる。これで作成されたイメージはDockerHubへプッシュできる。
    image: tetsujin

   ↓
    image: [account name]/tetsujin

 dokcer-compose.ymlの編集が済んだらDockerイメージをビルドする。VisualStudioでソリューション構成をReleaseにして、ソリューションをビルドする。PowerShellを開いて"docker images"を実行し、dokcer-compose.ymlでimageに設定した通りの名前のDockerイメージができているのを確認する。
 確認できたらプッシュ。
docker push matoba/tetsujin




 Dockerイメージをパブリックな場所に用意できた。つぎはAzure Container InstanceでこのDockerイメージを使ってWebアプリとして実行する。Azure Portalで指示に従ってもろもろ埋めて立ち上げる。


 作成されたリソースをのぞいてIPを確認する。

 ブラウザでIPへアクセスしてみる。

動作が確認できた。

 VisualStudioで作ったDockerイメージからWebアプリを動かせるのを確認した。引き続きASP.NET Core MVCでのブログの開発を続けていく。
comment: 0

ASP.NET Core MVCでブログを作る はじめ

 .NET Core 2.0がリリースされた。Linux環境でも動かせるC#のアレだ。これを使ってブログを作るまでを数回に分けて書いていく。

 開発のためにDockerを使う。なのでHyper-Vの準備が必要。あとVisualStudio 2017 Communityも使う。

 まずプロジェクトの初期化。VisualStudioで新規ソリューションの作成を選び、Webアプリを選択して進む。


 MVCかつDockerを使うので構成選択は下図のように。


 プロジェクトが用意されるのでとりあえずデバッグを実行してみる。ブラウザが開いて、適当に設定されたポート込みのアドレスが開かれる。


 最初の編集としてdocker-compose.override.ymlを編集して、アプリの使うポートを固定する。ファイルの八行目あたり。
      - "80"

   ↓
      - "80:80"

二重引用符で囲まれたうちの左の数字がコンテナ内部のポート、右がアプリがバインドされるホストのポートだ。

 もう一回デバッグを実行してみる。ポートが指定通りのところでアプリの動作が確認できる。


 とりあえずなんの機能もないような状態だが、デフォルトで用意されたページを返すものとなった。次回もまた機能実装前の準備を続けていく。
https://github.com/hMatoba/tetsujin/tree/28d0cf3679f6d7652d7b418fb7886627f43af16d
comment: 0