しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Elastic Beanstalk のデプロイマニフェストを使って IIS 設定とデプロイをカスタマイズする

ASP.NET アプリケーションのデプロイでは MSDeploy パッケージをそのままアップロード、ASP.NET Core アプリケーションのデプロイではマニフェストを用意してアップロードします。

前に ASP.NET Core アプリケーションをデプロイする時に使いました。

ドキュメントではデプロイマニフェストを ASP.NET Core に対して使っている例ばかりですが、MSDeploy パッケージに対してもデプロイマニフェストを使ってカスタマイズが行えるので調べました。

1 つの Elastic Beanstalk に対して複数の仮想アプリケーションをデプロイすることも簡単に出来ます。

Customizing ASP.NET Core Deployments | AWS Developer Blog

非常に面白いのが、MSDeploy パッケージと ASP.NET Core のデプロイを同時に行ったり、デプロイ処理自体をスクリプトで書いて完全にカスタマイズすることまで出来るようになっています。

残念ながら思ったよりも情報が少なかったので実際に試してみることにします。

デプロイマニフェストを書く

Visual Studio 2015 と Visual Studio Code は JSON Schema を使った IntelliSense に対応しているので、AWS から提供されている JSON Schema を使うとデプロイマニフェストを書くのが非常に楽です。

JSON Schema は $schema というキーで URL 書いておくと、勝手に認識されます。

{
  "$schema": "https://aws-vs-toolkit.s3.amazonaws.com/JSONSchemas/aws-windows-deployment-manifest-schema.json"
}

テンプレートとして最低限の部分は用意しておくと後々便利かもしれません。

実際に Visual Studio 2015 を使ってデプロイマニフェストを書きました。必須パラメータは太字になったり、自動でバリデーションを行ってくれるので間違えようがないです。

f:id:shiba-yan:20161105184449p:plain

f:id:shiba-yan:20161105184535p:plain

Visual Studio や Visual Studio Code の場合は IntelliSense で設定項目が読み取れるので必要ない気がしてますが、デプロイマニフェストで行える設定は以下のようになっています。

  • IIS 設定
    • アプリケーションプール名
    • CPU 制限
    • 32bit / 64bit
    • .NET CLR バージョン (2.0 / 4.0 / なし)
    • マネージパイプラインモード (クラシック / 統合)
    • リクエストキューの最大値
    • リサイクル設定
  • デプロイ設定
    • アプリケーション名
    • 仮想アプリケーションパス
    • 使用するアプリケーションプール名

Elastic Beanstalk のダッシュボードから設定できる項目よりも、デプロイマニフェストの方が項目数が多いので、普段から活用しておきたいと思いました。

パッケージを作成

今回は複数のアプリケーションをデプロイするパッケージを作ることにしたので、デプロイマニフェストは以下のように書いてみました。それぞれのアプリケーションで別々のプールを使うようにします。

デフォルトは統合のはずですが、なんとなくマネージパイプラインの設定も追加しておきました。

{
  "$schema": "https://aws-vs-toolkit.s3.amazonaws.com/JSONSchemas/aws-windows-deployment-manifest-schema.json",
  "manifestVersion": 1,
  "iisConfig": {
    "appPools": [
      {
        "name": "App1Pool",
        "managedPipelineMode": "Integrated"
      },
      {
        "name": "App2Pool",
        "managedPipelineMode": "Integrated"
      }
    ]
  },
  "deployments": {
    "msDeploy": [
      {
        "name": "app1",
        "parameters": {
          "appBundle": "app1.zip",
          "appPool": "App1Pool",
          "iisPath": "/app1"
        }
      },
      {
        "name": "app2",
        "parameters": {
          "appBundle": "app2.zip",
          "appPool": "App2Pool",
          "iisPath": "/app2"
        }
      }
    ]
  }
}

app1 と app2 で別々の MSDeploy パッケージを用意しておきます。

中身は同じですが、ファイルをコピーして名前だけ変えました。仮想アプリケーションのパスはそれぞれ app1 と app2 にしてアプリケーションプールの設定も追加してあります。

f:id:shiba-yan:20161105203539p:plain

保存したデプロイマニフェストと作成した MSDeploy パッケージを更に zip で固めると Elastic Beanstalk にデプロイするためのパッケージが完成します。

zip の中に zip が入っているのは少し違和感がありますが、気にしない方向で。

デプロイして結果を確認

作成したパッケージを Elastic Beanstalk にデプロイした後に、リモートデスクトップで IIS マネージャを立ち上げてアプリケーションの状態を確認しました。

マニフェストに書いた通り、2 つの仮想アプリケーションが作成されています。

f:id:shiba-yan:20161105203018p:plain

アプリケーションプールも指定した名前で 2 つちゃんと作成されていることも確認できます。

f:id:shiba-yan:20161105203057p:plain

最後にタスクマネージャーを確認すると、ワーカープロセスがそれぞれのアプリケーションごとに作成されて、別々に動いていることまで確認できます。

f:id:shiba-yan:20161105203145p:plain

MSDeploy 向けに職人的なコードを書くよりも、デプロイマニフェストで定義した方が簡単かつ確実に IIS 設定を行えそうです。個人的には JSON Schema を提供している部分がポイント高いと思いました。

パッケージに必要な情報がまとまっているので、環境を作り直しても安心です。