Windows IIS サービスの移行計画をカスタマイズする

移行の作成時に入力された移行計画ファイルを確認します。移行計画は、移行を実行する前にカスタマイズできます。移行計画の詳細は、移行元 VM からワークロード コンテナ アーティファクトを抽出するために使用されます。

このセクションでは、移行の内容と、移行を実行してデプロイ アーティファクトを生成する前に考慮すべきカスタマイズについて説明します。

始める前に

このドキュメントでは、すでに移行計画を作成し、移行計画ファイルが作成されていることを前提としています。

移行計画の構造

以下に、移行計画の完全な構造を示します。以降のセクションでは、この枠組み、各要素の概要、変更方法について説明します。

globalSettings:
    globalIis:
        enablegmsa: string
        apppools:
            - enable32bitapponwin64: bool
              identitytype: string
              managedruntimeversion: string
              name: string
        connectionStrings:
            add:
                - connectionstring: string
                  name: string
                  providername: string
        security:
            authentication:
                windowsAuthentication:
                    enabled: bool
                    providers:
                        - value: string
            authorization:
                add:
                    - access_type: string
                      roles: string
                      users: string
                      verbs: string
                remove:
                    - roles: string
                      users: string
                      verbs: string
    image:
        extraFeatures:
            - string
    target:
        baseVersion: string
        requirements:
            - string
        warnings:
            - string
    msvcRuntimes:
            - string
    pathEnvVarAdditionalEntries:
            - string
images:
    - name: string
      probes:
        enabled: bool
        livenessProbe:
            probehandler:
                exec:
                    command:
                        - string
                        - string
            initialdelayseconds: int
            timeoutseconds: int
            periodseconds: int
            successthreshold: int
            failurethreshold: int
            terminationgraceperiodseconds: optional[int]
        readinessProbe:
            probehandler:
                exec:
                    command:
                        - string
                        - string
            initialdelayseconds: int
            timeoutseconds: int
            periodseconds: int
            successthreshold: int
            failurethreshold: int
            terminationgraceperiodseconds: optional[int]
      useractions:
        files:
            - source: string
              target: string
        registry:
            currentcontrolset:
                - path: string
            software:
                - path: string
      workloads:
        sites:
            site:
                - applications:
                    - applicationpool: string
                      path: string
                      virtualdirectories:
                        - path: string
                          physicalpath: string
                  bindings:
                    - port: int
                      protocol: string
                      sslflags: int
                  connectionstrings:
                    - connectionstring: string
                      name: string
                      providername: string
                  name: string
                  security:
                    authentication:
                        windowsAuthentication:
                            enabled: bool
                            providers:
                                - value: string
                    authorization:
                        add:
                            - access_type: string
                              roles: string
                              users: string
                              verbs: string
                        remove:
                            - roles: string
                              users: string
                              verbs: string
                  serverautostart: bool
version: string

globalSettings セクション

globalSettings セクションには、この VM から IIS サイトを実行している Pod の基本的な要件を記述します。検出プロセスで、移行元の VM の全般的な構成が検索され、このセクションに挿入されます。以下で説明するように、これらの構成には特定のイメージ構成に存在するフィールドが含まれますが、すべてのイメージに同時に影響します。

image セクション

globalSettings に続く image セクションには、Pod にインストールする Windows 機能のリストを記述します。検出プロセスで、元の VM 上に存在し、Windows コンテナにインストール可能なすべての Windows 機能がこのセクションに挿入されます。

msvcRuntimes セクション

移行するアプリケーションが特定のバージョンの Microsoft Visual C++ Runtime(MSVCRT)に依存している可能性があります。Migrate to Containers は、移行元 VM にインストールされているランタイムを自動的に検出し、移行計画に含めます。

移行計画のランタイムのリストを変更するには、msvcRuntimes のメンバーを追加または削除します。

使用可能な値の完全なリストは次のとおりです(2015 ランタイムには、2017、2019、2022 のサポートも含まれています)。

    msvcRuntimes:
        - MSVC2012_x64
        - MSVC2013_x64
        - MSVC2015_x64
        - MSVC2012_x86
        - MSVC2013_x86
        - MSVC2015_x86

pathEnvVarAdditionalEntries セクション

Windows IIS アプリケーションには、デフォルト以外の PATH 環境変数エントリが含まれている可能性があります。これらのエントリは移行元 VM で自動的に検出され、移行計画に含まれます。pathEnvVarAdditionalEntries のメンバーを編集することで、PATH 環境変数を変更できます。

    pathEnvVarAdditionalEntries:
      - "C:\\myDllsFolder"
      - "C:\\ProgramData\\SomeSoftware"

image セクションを編集する

次のような場合は、image セクションの編集が必要になります。

  1. 提案された機能の一部が移行後のサイトで不要な場合。移行元の VM に IIS サイトのホスト以外の用途がある場合、この状況が発生します。

  2. 移行計画の IIS セクションを変更し、追加の Windows 機能に依存する構成を追加する場合(たとえば、Windows 認証は Windows 認証機能に依存します)。

target セクション

target セクションでは、使用する Windows ベースイメージを指定します(たとえば 1909)。このフィールドを編集することはほとんどありません。

images セクション

images セクションの各サブアイテムに、単一の出力イメージを指定します。
アーティファクト zip には、このようなイメージごとに個別のサブディレクトリがあり、独自の Dockerfiledeployment_spec.yaml が存在します(コンテナ イメージのデプロイをご覧ください)。

name フィールド

name フィールドには、イメージ名を記述します。これは、イメージのサブディレクトリの名前と、アーティファクト内の deployment_spec.yaml ファイルに影響します。

probes フィールド

probes フィールドには、イメージのヘルスプローブ構成を記述します。kubelet のプローブの詳細については、livenessProbe、readinessProbe、startupProbe を構成するをご覧ください。

IIS 正常性プローブを編集する

正常性プローブでは、マネージド コンテナのダウンタイムと準備状況をモニタリングできます。正常性プローブによるモニタリングは、移行されたコンテナのダウンタイムを減らし、モニタリングを改善する効果があります。

不明なヘルス状態は、可用性の低下、可用性モニタリングの誤判定、データ損失を引き起こす可能性があります。正常性プローブがなければ、kubelet は、コンテナの健全性を想定することしかできず、準備ができていないコンテナ インスタンスにトラフィックを送信する可能性があります。インスタンスの準備ができていない場合は、トラフィックが失われる可能性があります。kubelet は、フリーズされたコンテナを検出できず、コンテナは再起動されません。

正常性プローブは、コンテナの起動時に小さなスクリプト ステートメントを実行します。このスクリプトは、成功したプローブの種類をチェックします。これは、使用されるプローブのタイプによって定義されます。期間は移行計画の periodSeconds フィールドで定義されます。これらのプローブは、移行計画をカスタマイズするときに手動で定義できます。

構成可能なプローブには 3 種類あります。すべてのプローブは probe v1 core リファレンスで定義されている probe v1 core で、対応する container v1 core のフィールドと同じ関数を共有します。

  • *livenessProbe: livenessProbe は、コンテナを再起動するタイミングを把握するために使用します。

  • readinessProbe: readinessProbe は、コンテナがトラフィックの受信を開始する準備が整うタイミングを認識するために使用します。プローブが成功した場合にのみ Pod へのトラフィックの送信を開始するには、readinessProbe を指定します。readinessProbe が livenessProbe と同様に機能する場合もあります。ただし、readinessProbe は、Pod がトラフィックを受信せずに起動し、プローブが成功した後にのみトラフィックの受信を開始することを示します。

  • startupProbe: kubelet は startupProbe を使用して、コンテナ アプリケーションが起動した時間を特定します。このようなプローブが構成されている場合、プローブが成功するまで稼働チェックと準備チェックが無効になり、それらのプローブがアプリケーションの起動を妨げないようにします。

調査後、プローブ構成が移行計画に追加されます。プローブは、次の例に示すようにデフォルトの構成で使用できます。デフォルトの構成では、livenessProbe と readinessProbe に exec コマンドを使用します。どちらも probe.ps1 という PowerShell スクリプトを使用しており、IIS コマンドライン ツール appcmd を呼び出して IIS サイトのステータスを確認します。

プローブはデフォルトで無効になっています。プローブを有効にするには、enabled フラグを true に設定します。

images:
name: IMAGE_NAME
      probes:
        enabled: false
        livenessProbe:
            probehandler:
                exec:
                    command:
                        - powershell.exe
                        - C:\m4a\probe.ps1
            initialdelayseconds: 0
            timeoutseconds: 1
            periodseconds: 10
            successthreshold: 1
            failurethreshold: 3
            terminationgraceperiodseconds: null
        readinessProbe:
            probehandler:
                exec:
                    command:
                        - powershell.exe
                        - C:\m4a\probe.ps1
            initialdelayseconds: 0
            timeoutseconds: 1
            periodseconds: 10
            successthreshold: 1
            failurethreshold: 3
            terminationgraceperiodseconds: null

windowsServices セクション

移行中に作成された Windows コンテナは、単一の Windows IIS サービスを実行し、監視します。ただし、一部のワークロードでは、正しく機能させるために追加のサービス(データベース、ロギング メカニズム、プロキシなど)の実行が必要になる場合があります。

移行後のコンテナで追加のサービスを実行するには、windowsServices セクションにエントリを追加し、useractions セクションに必要なバイナリをコピーします。

version: v1
globalSettings:
    target:
       …
    globalIIS:
    …
images:
  - name: migrated-image-zgwb2
    workloads:
    sites:
      site:
        - applications:
          ...
          bindings:
          - port: 80
            protocol: http
          name: Default Web Site
          …
    windowsServices:
    - MyService
    useractions:
      files:
        - source: C:\Program Files\MyService
          target: C:\Program Files\MyService
      registry:
        currentcontrolset:
          - key: services\MyService

useractions セクション

useractions セクションでは、移行するその他のファイルとレジストリキーを指定します。

例:

      useractions:
        files:
        - source: DRIVE:\FOLDER-OR-FILE-PATH
          target: DRIVE:\FOLDER-OR-FILE-PATH
        - source: C:\myfolder
          target: C:\myfolder
        - source: D:\myfile
          target: D:\myfile
        - source: D:\myfile
          target: C:\myfile
        ...
        registry:
          currentcontrolset:
          - path: KEY
          ...
          software:
          - path: KEY
          ...

currentcontrolsetsoftware に指定されたパスは、HKEY_LOCAL_MACHINE\System\CurrentControlSet レジストリ ハイブまたは HKEY_LOCAL_MACHINE\Software レジストリ ハイブの鍵です。

useractions セクションを編集する

デフォルトでは、イメージにコピーされるファイルは、指定したイメージ内のサイトの仮想ディレクトリのみです。
コードまたは構成でこのディレクトリの外部からファイルをインポートする場合は、これらのファイルを useractions セクションに追加する必要があります。
また、コードが依存するレジストリ値は、useractions registry セクションを編集して追加する必要があります。

IIS 関連の設定には、特定のサイトに関連する設定(イメージ仕様の一部)とすべてのサイトに関連する設定(gloabalIis セクションの下)があります。

sites セクション

sites セクションには、特定のイメージに移行するサイトを記述します。同じサイトを複数のイメージに含めることができます。

Cloud Load Balancing、Ingress、または Cloud Service Mesh を使用して SSL 構成を処理する場合は、protocolhttp に設定する必要があります。

sites:
  site:
  - applications:
    - path: /
      virtualdirectories:
        - path: /
          physicalpath: '%SystemDrive%\inetpub\wwwroot'
          bindings:
          - port: 8080
            protocol: http
          name: Default Web Site

apppools セクション

apppools セクションには、移行後の Pod に作成されるアプリケーション プールを記述します。

identitytype フィールドには、アプリケーション プールの IIS ID を ApplicationPoolIdentity(デフォルト)、NetworkServiceLocalSystemLocalService のいずれかとして指定します。

詳細については、IIS の ID についてアプリケーション プールの ID をご覧ください。

identitytype を含む移行計画の例を次に示します。

migrationPlan:
    applications:
      iis:
        applicationhost:
          apppools:
          - name: DefaultAppPool
            # Allowed values include: ApplicationPoolIdentity (default), NetworkService, LocalSystem, LocalService
            identitytype="NetworkService"
          - managedruntimeversion: v4.0
            name: .NET v4.5 Classic
          - managedruntimeversion: v4.0
            name: .NET v4.5

コンテナ アーティファクトを生成する移行計画を実行すると、Migrate to Containers は identitytype フィールドの設定に従って、必要な Dockerfile ディレクティブを自動的に追加します。

たとえば、identitytypeNetworkService に設定した場合、ディレクティブは次の形式になります。

RUN c:\windows\system32\inetsrv\appcmd.exe set apppool \"DefaultAppPool\" \"/-processModel.identityType:NetworkService\";

Migrate to Containers はターゲット identitytype に従って読み取り用の ACL ディレクティブをサイトのフォルダに自動的に追加します。IUSR には組み込みユーザーを追加します。これは、元のアプリケーション アカウントが継承されているか、明示的に指定されているアプリケーション ファイル システムの項目に対して、自動的に行われます。

詳細については、ACL を設定するをご覧ください。

enablegmsa フィールド

enablegmsa フィールドは移行計画の糖衣構文です。これは、アプリケーション プールの identity フィールドを上書きするためのショートカットです。

enablegmsa フィールドでサポートされている値は次のとおりです。

  • auto(デフォルト): Migrate to Containers が現在の構成を使用できないと判断した場合、gMSA を使用するために移行後のコンテナを変換します。
  • all: gMSA を使用するために、移行後のコンテナを常に変換します。identitytype の設定は無視します。この場合、identitytype は常に NetworkService に設定されていると解釈されます。

enablegmsa を含む移行計画の例を次に示します。

migrationPlan:
    applications:
      iis:
        # Allowed values include: auto (default), all
        enablegmsa: auto|all

詳細については、gMSA を使用するようにアプリを構成するをご覧ください。

接続文字列

接続文字列は、移行後のコンテナ ワークロードから .NET Framework データ プロバイダへの接続を定義します。

Migrate to Containers は、サイトおよびグローバル スコープの接続文字列をサポートします。

サイトに接続文字列を追加するには、移行計画の site 定義を編集して connectionstrings プロパティを設定します。

sites:
  site:
    # Add the site connection strings here.
    connectionstrings:
    - name: connectionname1
      providername: System.Data.SqlClient
      connectionstring: Database=connectedDB1;Password=Welcome1;User=admin;
    - name: connectionname2
      providername: System.Data.OleDb
      connectionstring: Database=connectedDB2;Password=Welcome2;User=admin;
  - applications:
    - path: /
      virtualdirectories:
      ...

接続文字列をグローバル スコープに追加する(すべてのサイトからアクセスできるようにする)には、globalIis の直下の接続文字列を編集します。

globalIis:
  enablegmsa: auto
  connectionStrings:
  connectionstring:
    - name: connectionname3
      providername: System.Data.SqlClient
      connectionstring: Database=connectedDB3;Password=Welcome3;User=admin;
  applicationhost:
      ...

ここで

  • name には接続名を指定します。
  • providername には、必要に応じてデータ プロバイダのタイプを指定します。Migrate to Containers は、System.Data.SqlClient の値のみをサポートします。これは、.NET Framework データ プロバイダをサポートする値です。
    • System.Data.SqlClient
    • System.Data.OleDb
    • System.Data.Odbc
    • System.Data.OracleClient
  • connectionstring には、データ プロバイダへの接続に使用する接続文字列を指定します。

接続文字列セクションを編集する

Migrate to Containers は、移行した VM で検出された接続文字列を自動的に移行計画にコピーします。

一部の接続文字列が検出されないため、上記のように移行計画を編集して追加する必要があります(たとえば、接続文字列が applicationhost.config ファイルの暗号化セクションにある場合)。

移行計画に追加する接続文字列を決定する方法については、実行時の接続文字列の取得に関する Microsoft のドキュメントをご覧ください。

接続文字列の外部依存関係

  • 接続文字列には、ファイルへの参照や、サイトに関連付けられている Windows ユーザーへの参照などの依存関係を含めることができます。移行計画にカスタム ユーザー アクションを追加して、ファイル システム内の別のファイルをコピーできます。Dockerfile を手動で編集して Windows ユーザーを追加します。
  • 接続文字列には、外部データソースへの参照などの依存関係を含めることができます。移行されたコンテナ ワークロードがデータソースにアクセスできるようにするには、これらの依存関係を手動で移行する必要があります。

security セクション

security セクションには、認証と認可のサブセクションがあります。

  • Windows 認証では、Active Directory ユーザーを確認します。
  • Windows 認可は、どのユーザーに IIS ウェブサイトへのアクセスを許可するかを指定するメカニズムです。アクセスタイプは HTTP 動詞(POST、GET、PUT、PATCH、DELETE)です。

接続文字列の場合と同様に、すべてのサイトに対して認証または認可を設定するには、次の例のように globalIis を編集します。特定のサイトに対して認証または認可を設定するには、サイトの要素を編集します。

globalIis:
    security:
      authentication:
        windowsAuthentication:
          providers:
          - NTLM
      authorization:
        - add:
          user:John
          access:
          role:
         - remove:
              user:Jane
              access: GET
              role: 
            ...

ここで

  • providers には、セキュリティ プロトコルのプロバイダを指定します。
  • user には、ユーザー名を指定します。
  • access には、ユーザーの権限を指定します。アクセスタイプは HTTP 動詞(POST、GET、PUT、PATCH、DELETE)です。
  • role には、特定の権限ロールを指定します。

次のステップ