

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 透過部署資訊清單執行多個應用程式和 ASP.NET 核心應用程式
<a name="dotnet-manifest"></a>

您可使用部署資訊清單來指示 Elastic Beanstalk 如何部署您的應用程式。使用這個方法，您不需要用 `MSDeploy` 來產生在網站根路徑執行的單一 ASP.NET 應用程式的原始碼套件。相反地，您可以使用資訊清單檔案，在不同的路徑上執行多個應用程式。或者，您也可以告訴 Elastic Beanstalk 用 ASP.NET Core 部署和執行應用程式。您亦可使用部署資訊清單來設定應用程式集區，在其中執行您的應用程式。

部署資訊清單會將 [.NET Core 應用程式](#dotnet-manifest-dotnetcore)適用的支援新增至 Elastic Beanstalk。您可以部署沒有部署資訊清單的 .NET Framework 應用程式。不過，.NET Core 應用程式需要部署資訊清單，才能在 Elastic Beanstalk 上執行。使用部署資訊清單時，請為每個應用程式建立網站封存檔，然後將此封存檔納入內含部署資訊清單的第二個 ZIP 封存檔。

部署資訊清單亦增加[執行不同路徑的多個應用程式](#dotnet-manifest-multiapp)的能力。部署資訊清單會定義一系列部署目標，每個目標都有網站封存檔與 IIS 應執行資訊清單的路徑。例如，您可於 `/api` 路徑執行 Web API 處理非同步請求，並於使用 API 的根路徑執行 Web 應用程式。

您可以使用部署資訊清單來[設定具有自訂繫結和實體路徑的 IIS 網站](#dotnet-manifest-websites)。這可讓您設定網站，在部署應用程式之前接聽特定連接埠或主機名稱。

您也可以使用部署資訊清單來[使用 IIS 或 Kestrel 中的應用程式集區執行多個應用程式](#dotnet-manifest-apppool)。您可將應用程式集區設定為定期重新啟動您的應用程式、執行 32 位元應用程式，或使用特定版本的 .NET Framework 執行時間。

如需完整自訂功能，您可於 Windows PowerShell [自行撰寫部署指令碼](#dotnet-manifest-custom)，並指示 Elastic Beanstalk 安裝、解除安裝和重新啟動應用程式所需執行的指令碼。

部署資訊清單和相關功能需要 Windows Server 平台 [1.2.0 版或更新版本](dotnet-v2migration.md)。

如需略過 IIS 重設等所有可用組態選項、屬性和進階功能的詳細資訊，請參閱[部署資訊清單結構描述參考](dotnet-manifest-schema.md)。

**Topics**
+ [.NET Core 應用程式](#dotnet-manifest-dotnetcore)
+ [執行多個應用程式](#dotnet-manifest-multiapp)
+ [設定 IIS 網站](#dotnet-manifest-websites)
+ [使用應用程式請求路由 (ARR)](#dotnet-manifest-arr)
+ [設定應用程式集區](#dotnet-manifest-apppool)
+ [定義自訂部署](#dotnet-manifest-custom)
+ [部署資訊清單結構描述參考](dotnet-manifest-schema.md)

## .NET Core 應用程式
<a name="dotnet-manifest-dotnetcore"></a>

您可使用部署資訊清單，在 Elastic Beanstalk 上執行 .NET Core 應用程式。.NET Core 是跨平台版本的 .NET，隨附命令列工具 (`dotnet`)。您可以使用它來產生應用程式、在本機執行，並準備發佈。

欲於 Elastic Beanstalk 上執行 .NET Core 應用程式，您可以執行 `dotnet publish` 並將輸出納入 ZIP 封存檔，且不要納入任何其中的目錄。請將網站封存檔與具備類型為 `aspNetCoreWeb` 之部署目標的部署資訊清單，一同放置於原始碼套件。

下列部署資訊清單於根路徑執行的 .NET 核心應用程式，來自名為 `dotnet-core-app.zip` 的網站封存檔。

**Example aws-windows-deployment-manifest.json - .NET core**  

```
{
  "manifestVersion": 1,
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "my-dotnet-core-app",
        "parameters": {
          "archive": "dotnet-core-app.zip",
          "iisPath": "/"
        }
      }
    ]
  }
}
```

將資訊清單和網站封存檔打包至 ZIP 封存檔來建立原始碼套件。

**Example dotnet-core-bundle.zip**  

```
.
|-- aws-windows-deployment-manifest.json
`-- dotnet-core-app.zip
```

網站封存檔內含編譯的應用程式程式碼、依存項目和 `web.config` 檔案。

**Example dotnet-core-app.zip**  

```
.
|-- Microsoft.AspNetCore.Hosting.Abstractions.dll
|-- Microsoft.AspNetCore.Hosting.Server.Abstractions.dll
|-- Microsoft.AspNetCore.Hosting.dll
|-- Microsoft.AspNetCore.Http.Abstractions.dll
|-- Microsoft.AspNetCore.Http.Extensions.dll
|-- Microsoft.AspNetCore.Http.Features.dll
|-- Microsoft.AspNetCore.Http.dll
|-- Microsoft.AspNetCore.HttpOverrides.dll
|-- Microsoft.AspNetCore.Server.IISIntegration.dll
|-- Microsoft.AspNetCore.Server.Kestrel.dll
|-- Microsoft.AspNetCore.WebUtilities.dll
|-- Microsoft.Extensions.Configuration.Abstractions.dll
|-- Microsoft.Extensions.Configuration.EnvironmentVariables.dll
|-- Microsoft.Extensions.Configuration.dll
|-- Microsoft.Extensions.DependencyInjection.Abstractions.dll
|-- Microsoft.Extensions.DependencyInjection.dll
|-- Microsoft.Extensions.FileProviders.Abstractions.dll
|-- Microsoft.Extensions.FileProviders.Physical.dll
|-- Microsoft.Extensions.FileSystemGlobbing.dll
|-- Microsoft.Extensions.Logging.Abstractions.dll
|-- Microsoft.Extensions.Logging.dll
|-- Microsoft.Extensions.ObjectPool.dll
|-- Microsoft.Extensions.Options.dll
|-- Microsoft.Extensions.PlatformAbstractions.dll
|-- Microsoft.Extensions.Primitives.dll
|-- Microsoft.Net.Http.Headers.dll
|-- System.Diagnostics.Contracts.dll
|-- System.Net.WebSockets.dll
|-- System.Text.Encodings.Web.dll
|-- dotnet-core-app.deps.json
|-- dotnet-core-app.dll
|-- dotnet-core-app.pdb
|-- dotnet-core-app.runtimeconfig.json
`-- web.config
```

## 執行多個應用程式
<a name="dotnet-manifest-multiapp"></a>

您可定義多個部署目標，藉此透過部署資訊清單執行多個應用程式。

以下部署資訊清單設定兩個 .NET Core 應用程式。`WebApiSampleApp` 應用程式實作簡單的 Web API，並在`/api`路徑上提供非同步請求。`DotNetSampleApp` 應用程式是一種 Web 應用程式，其在根路徑處理請求。

**Example aws-windows-deployment-manifest.json - 多個應用程式**  

```
{
  "manifestVersion": 1,
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "WebAPISample",
        "parameters": {
          "appBundle": "WebApiSampleApp.zip",
          "iisPath": "/api"
        }
      },
      {
        "name": "DotNetSample",
        "parameters": {
          "appBundle": "DotNetSampleApp.zip",
          "iisPath": "/"
        }
      }
    ]
  }
}
```

此處提供具備多個應用程式的範例應用程式：
+ **可部署原始碼套件** - [dotnet-multiapp-sample-bundle-v2.zip](samples/dotnet-multiapp-sample-bundle-v2.zip)
+ **原始碼** - [dotnet-multiapp-sample-source-v2.zip](samples/dotnet-multiapp-sample-source-v2.zip)

## 設定 IIS 網站
<a name="dotnet-manifest-websites"></a>

您可以使用部署資訊清單，使用自訂繫結和實體路徑來設定 IIS 網站。當您需要設定在特定連接埠上接聽、使用自訂主機名稱或提供特定目錄內容的網站時，此功能非常有用。

下列部署資訊清單會設定使用特定連接埠號碼和自訂實體路徑在 HTTP 上監聽的自訂 IIS 網站：

**Example aws-windows-deployment-manifest.json - IIS 網站組態**  

```
{
  "manifestVersion": 1,
  "iisConfig": {
    "websites": [
      {
        "name": "MyCustomSite",
        "physicalPath": "C:\inetpub\wwwroot\mysite",
        "bindings": [
          {
            "protocol": "http",
            "port": 8080,
            "hostName": "mysite.local"
          }
        ]
      }
    ]
  },
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "my-dotnet-core-app",
        "parameters": {
          "appBundle": "dotnet-core-app.zip",
          "iisWebSite": "MyCustomSite",
          "iisPath": "/"
        }
      }
    ]
  }
}
```

在此範例中：
+ 使用自訂實體路徑建立名為 "MyCustomSite" 的網站
+ 網站在連接埠 8080 上具有具有特定主機名稱的 HTTP 繫結
+ 使用 `iisWebSite` 參數將 ASP.NET Core 應用程式部署到此自訂網站

## 使用應用程式請求路由 (ARR)
<a name="dotnet-manifest-arr"></a>

應用程式請求路由 (ARR) 和 URL 重寫模組已預先安裝，並可在 Elastic Beanstalk Windows AMIs 中使用。這些模組使用 ebextensions 或應用程式組態，透過 IIS 組態啟用進階路由案例和 URL 操作。

下列範例顯示簡單的部署資訊清單，其中設定具有自訂連接埠的網站，並結合設定基本 ARR 路由的 ebextensions 組態：

**Example aws-windows-deployment-manifest.json - 簡易 ARR 設定**  

```
{
  "manifestVersion": 1,
  "iisConfig": {
    "websites": [
      {
        "name": "ARRSite",
        "physicalPath": "C:\\inetpub\\wwwroot\\arrsite",
        "bindings": [
          {
            "protocol": "http",
            "port": 8080,
            "hostName": "localhost"
          }
        ]
      }
    ]
  },
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "BackendApp",
        "parameters": {
          "appBundle": "backend-app.zip",
          "iisWebSite": "ARRSite",
          "iisPath": "/backend"
        }
      }
    ]
  }
}
```

ARR 組態是透過 ebextensions 完成。下列組態會設定基本 ARR 路由規則：

**Example .ebextensions/arr-config.config - 基本 ARR 組態**  

```
files:
  "C:\\temp\\configure-arr.ps1":
    content: |
      # Enable ARR proxy at server level
      Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/proxy' -Name 'enabled' -Value 'True'
      
      # Clear any existing global rules to avoid conflicts
      Clear-WebConfiguration -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/rewrite/globalRules'

      # Add global rule to route all requests to backend
      Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
        -Filter 'system.webServer/rewrite/globalRules' `
        -Name '.' `
        -Value @{
          name = 'Route_to_Backend'
          stopProcessing = 'True'
          match = @{ url = '^(?!backend/)(.*)' }
          action = @{
            type = 'Rewrite'
            url = 'http://localhost:8080/backend/{R:1}'
          }
        }

container_commands:
  01_configure_arr:
    command: powershell -ExecutionPolicy Bypass -File "C:\\temp\\configure-arr.ps1"
    waitAfterCompletion: 0
```

此組態會在連接埠 8080 上建立網站，並設定 ARR 將所有傳入請求路由到在該網站上執行的後端應用程式。

## 設定應用程式集區
<a name="dotnet-manifest-apppool"></a>

您可以在 Windows 環境中支援多個應用程式。可採用兩種方法：
+ 您可以使用 Kestrel Web 伺服器的進程外託管模型。使用此模型，您可以將多個應用程式設定為在一個應用程式集區中執行。
+ 您可以使用進程內託管模型。憑藉此模型，您可以使用多個應用程式集區來執行多個應用程式，且每個集區中只有一個應用程式。如果您使用的是 IIS 伺服器，並且需要執行多個應用程式，則必須使用此方法。

若要設定 Kestrel 在一個應用程式集區中執行多個應用程式，請新增 `hostingModel="OutofProcess"` 檔案中的 `web.config`。請考慮下列範例。

**Example web.config - 用於 Kestrel 進程外託管模型**  

```
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add 
    name="aspNetCore" 
    path="*" verb="*" 
    modules="AspNetCoreModuleV2" 
    resourceType="Unspecified" />
</handlers>
<aspNetCore 
    processPath="dotnet" 
    arguments=".\CoreWebApp-5-0.dll" 
    stdoutLogEnabled="false" 
    stdoutLogFile=".\logs\stdout" 
    hostingModel="OutofProcess" />
</system.webServer>
</location>
</configuration>
```

**Example aws-windows-deployment-manifest.json - 多個應用程式**  

```
{
"manifestVersion": 1,
  "deployments": {"msDeploy": [
      {"name": "Web-app1",
        "parameters": {"archive": "site1.zip",
          "iisPath": "/"
        }
      },
      {"name": "Web-app2",
        "parameters": {"archive": "site2.zip",
          "iisPath": "/app2"
        }
      }
    ]
  }
}
```

IIS 不支援一個應用程式集區中有多個應用程式，因為其使用進程內託管模型。因此，您需要透過將每個應用程式指派給一個應用程式集區，來設定多個應用程式。換句話說，只將一個應用程式指派給一個應用程式集區。

您可以將 IIS 設定為在 `aws-windows-deployment-manifest.json` 檔案中使用不同的應用程式集區。在您參考下一個範例檔案時，請進行下列更新：
+ 新增包含名稱為 `iisConfig` 子區段的 `appPools` 區段。
+ 在 `appPools` 區塊中，列出應用程式集區。
+ 在 `deployments` 區段中，為每個應用程式定義 `parameters` 區段。
+ 針對每個應用程式，`parameters` 區段會指定封存檔、執行它的路徑，以及要在其中執行的 `appPool`。

下列部署資訊清單會設定每 10 分鐘重新啟動應用程式的兩個應用程式集區。它們還將其應用程式附加到在指定路徑上執行的 .NET Framework Web 應用程式。

**Example aws-windows-deployment-manifest.json - 每個應用程式集區一個應用程式**  

```
{
"manifestVersion": 1,
  "iisConfig": {"appPools": [
      {"name": "MyFirstPool",
       "recycling": {"regularTimeInterval": 10}
      },
      {"name": "MySecondPool",
       "recycling": {"regularTimeInterval": 10}
      }
     ]
    },
  "deployments": {"msDeploy": [
      {"name": "Web-app1",
        "parameters": {
           "archive": "site1.zip",
           "iisPath": "/",
           "appPool": "MyFirstPool"
           }
      },
      {"name": "Web-app2",
        "parameters": {
           "archive": "site2.zip",
           "iisPath": "/app2",
           "appPool": "MySecondPool"
          }
      }
     ]
    }
}
```

## 定義自訂部署
<a name="dotnet-manifest-custom"></a>

如需進一步控制，您可定義*自訂部署*，藉此完全自訂應用程式部署。

此部署資訊清單會指示 Elastic Beanstalk 在 32 位元模式中執行 PowerShell 指令碼。它指定三個指令碼：在執行個體啟動和部署期間執行的`install`指令碼 (`siteInstall.ps1`)、在部署期間安裝新版本之前執行的`uninstall`指令碼 (`siteUninstall.ps1`)，以及當您在 AWS 管理主控台中選取[重新啟動應用程式伺服器](environments-dashboard-actions.md)時執行的`restart`指令碼 (`siteRestart.ps1`)。

**Example aws-windows-deployment-manifest.json - 自訂部署**  

```
{
  "manifestVersion": 1,
  "deployments": {
    "custom": [
      {
        "name": "Custom site",
        "architecture" : 32,
        "scripts": {
          "install": {
            "file": "siteInstall.ps1"
          },
          "restart": {
            "file": "siteRestart.ps1"
          },
          "uninstall": {
            "file": "siteUninstall.ps1"
          }
        }
      }
    ]
  }
}
```

將執行應用程式所需的成品納入具備資訊清單和指令碼的原始碼套件。

**Example Custom-site-bundle.zip**  

```
.
|-- aws-windows-deployment-manifest.json
|-- siteInstall.ps1
|-- siteRestart.ps1
|-- siteUninstall.ps1
`-- site-contents.zip
```