

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

# 在 Windows Server 上自訂軟體
<a name="customize-containers-windows-ec2"></a>

您可能想要針對您的應用程式相依使用的軟體，來進行自訂和設定。這些檔案可能是應用程式所必須用到的，例如，需執行的其他套件或服務。如需自訂和設定 Elastic Beanstalk 環境的一般資訊，請參閱[設定 Elastic Beanstalk 環境](customize-containers.md)。

**注意**  
YAML 憑藉一致的縮排。請在取代範例組態檔中的內容時，讓縮排層級一致，並確認您的文字編輯器使用空格而非定位字元進行縮排。

組態檔案支援下列金鑰，這些金鑰會對執行您應用程式的 Windows 伺服器造成影響。

**Topics**
+ [套件](#windows-packages)
+ [來源](#windows-sources)
+ [檔案](#windows-files)
+ [命令](#windows-commands)
+ [服務](#windows-services)
+ [容器命令](#windows-container-commands)

這些金鑰會以此列的順序處理。

**注意**  
較舊 (未進行版本控制) 的 .NET 平台版本不會以正確的順序處理組態檔案。如需進一步了解，請參閱[遷移 Elastic Beanstalk Windows Server 平台的主要版本](dotnet-v2migration.md)。

觀看您環境的[事件](using-features.events.md)的同時，開發與測試組態檔案。Elastic Beanstalk 忽略組態檔案，其中包含驗證錯誤，例如無效的金鑰，並不處理同一個檔案其他任何金鑰。當發生這種情況，Elastic Beanstalk 會將警告事件新增到事件日誌。

## 套件
<a name="windows-packages"></a>

使用 `packages` 金鑰來下載和安裝預先整裝好的應用程式與元件。

在 Windows 環境中，Elastic Beanstalk 支援下載和安裝 MSI 套件。(Linux 環境支援其他套件管理工具。如需詳細資訊，請參閱*在 Linux 伺服器上自訂軟體*頁面的[套件](customize-containers-ec2.md#linux-packages))。

只要 URL 是可公開存取，您就可以參考任何外部位置 (例如，Amazon Simple Storage Service (Amazon S3) 物件)。

如果您指定多個 `msi:` 套件，則不保證其安裝順序。

### 語法
<a name="windows-packages-syntax"></a>

指定您的選擇名稱做為套件名稱，並以 MSI 檔案位置的 URL 做為值。您可以在 `msi:` 金鑰下指定多個套件。

```
packages: 
  msi:
    package name: package url
    ...
```

### 範例
<a name="windows-packages-snippet"></a>

下列範例指定了從 `https://dev.mysql.com/` 下載 **mysql (mysql)** 的 URL。

```
packages:
  msi:
    mysql: https://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-8.0.11.msi
```

以下範例指定 Amazon S3 物件做為 MSI 檔案位置。

```
packages:
  msi:
    mymsi: https://amzn-s3-demo-bucket.s3.amazonaws.com/myobject.msi
```

## 來源
<a name="windows-sources"></a>

使用 `sources` 金鑰，從公開 URL 下載封存檔案，並在 EC2 執行個體上的目標目錄中，將該檔案解壓縮。

### 語法
<a name="windows-sources-syntax"></a>

```
sources:  
  target directory: location of archive file
```

### 支援的格式
<a name="windows-sources-support"></a>

在 Windows 環境中，Elastic Beanstalk 支援 .zip 格式。(Linux 環境支援額外的格式。 如需詳細資訊，請參閱[來源](customize-containers-ec2.md#linux-sources)在*在 Linux 伺服器上自訂軟體*((() 頁面。)

只要 URL 是可公開存取，您就可以參考任何外部位置 (例如，Amazon Simple Storage Service (Amazon S3) 物件)。

### 範例
<a name="windows-sources-example"></a>

下列範例會從 Amazon S3 下載公有 .zip 檔案，並將其解壓縮至 `c:/myproject/myapp`。

```
sources:  
  "c:/myproject/myapp": https://amzn-s3-demo-bucket.s3.amazonaws.com/myobject.zip
```

## 檔案
<a name="windows-files"></a>

使用 `files` 金鑰，在 EC2 執行個體上建立檔案。此內容可以內嵌於組態檔案，或從 URL 取得。檔案會依詞典編纂順序寫入磁碟。若要從 Amazon S3 下載私有檔案，請提供授權用的執行個體描述檔。

### 語法
<a name="windows-files-syntax"></a>

```
files:  
  "target file location on disk":
    source: URL
    authentication: authentication name:

  "target file location on disk":
    content: |
      this is my content
    encoding: encoding format
```

### 選項
<a name="windows-files-options"></a>

`content`  
(選用) 字串。

`source`  
(選用) 載入該檔案的 URL。您無法使用 content 金鑰來指定此選項。

`encoding`  
(選用) 編碼格式。此選項只用於提供內容金鑰值。預設值為 `plain`。  
有效值：`plain` \$1 `base64`

`authentication`  
(選用) 所要使用的 [CloudFormation 身分驗證方法](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-authentication.html)名稱。您可以利用 Resources (資源) 金鑰，在 Auto Scaling 群組的中繼資料中新增身分驗證方法。

### 範例
<a name="windows-files-snippet"></a>

以下範例顯示兩種方式提供檔案內容：從 URL，或是內嵌在組態檔案。

```
files:
  "c:\\targetdirectory\\targetfile.txt":
    source: http://foo.bar/myfile
 
  "c:/targetdirectory/targetfile.txt":
    content: |
      # this is my file
      # with content
```

**注意**  
如果在檔案路徑中使用反斜線 (\$1)，則必須在 \$1 前面冠上另一個反斜線 (跳脫字元)，如先前的範例所示。

下列範例使用 資源金鑰來新增名為 S3Auth 的身分驗證方法，並使用它從 Amazon S3 下載私有檔案：

```
files:
  "c:\\targetdirectory\\targetfile.zip":
    source: https://elasticbeanstalk-us-east-2-123456789012.s3.amazonaws.com/prefix/myfile.zip
    authentication: S3Auth

Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          s: ["amzn-s3-demo-bucket"]
          roleName:
            "Fn::GetOptionSetting":
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role"
```

## 命令
<a name="windows-commands"></a>

使用 `commands` 金鑰，在 EC2 執行個體上執行命令。命令會依其名稱的字母順序處理，而且會在應用程式和 Web 伺服器設定完成及應用程式版本檔案解壓縮前，就先行執行。

指定的命令會以管理員使用者的身分執行。

若要對命令的問題進行疑難排解，您可以在[執行個體日誌](using-features.logging.md)中尋找命令的輸出。

### 語法
<a name="windows-commands-syntax"></a>

```
commands:
  command name: 
    command: command to run
```

### 選項
<a name="windows-commands-options"></a>

`command`  
以陣列或字串來指定要執行的命令。如果使用陣列，則不需跳脫空格字元或用引號括起命令參數。

`cwd`  
(選用) 工作目錄。依預設，Elastic Beanstalk 會嘗試尋找專案的目錄位置。如果找不到，則會使用 `c:\Windows\System32` 做為預設位置。

`env`  
(選用) 設定命令用的環境變數。此屬性會進行覆寫，而非附加至現有的環境。

`ignoreErrors`  
(選用) 一個布林值，在 `command` 金鑰中所包含的命令失敗時 (傳回非零的值)，可用來判定其他的命令是否應該執行。如果即使命令失敗，也想繼續執行命令，請將此值設定為 `true`。如果要在命令失敗時停止執行命令，請將此值設定為 `false`。預設值為 `false`。

`test`  
(選用) 此命令必須傳回值 `true` (結束代碼 0)，Elastic Beanstalk 才能處理 `command` 金鑰中包含的命令。

`waitAfterCompletion`  
(選用) 等命令執行完成後再執行下一個命令前的等待秒數。預設值為 **60** 秒。您也可以指定 **forever**。  
不支援在部署期間重新啟動系統。如果系統因為命令而重新啟動，執行個體初始化將會失敗，導致部署失敗。  
作為解決方法，您可以使用它[https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/configuration-files/aws-provided/instance-configuration/windows-configuration/scheduled-restart.config](https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/configuration-files/aws-provided/instance-configuration/windows-configuration/scheduled-restart.config)在部署完成後排程重新啟動。

### 範例
<a name="windows-commands-snippet"></a>

下列範例會將 `set` 命令的輸出結果儲存到指定的檔案。如果有後續的命令，則 Elastic Beanstalk 會在此命令完成後立即執行該後續命令。如果此命令需要重新啟動，則 Elastic Beanstalk 會在命令完成後立即重新啟動執行個體。

```
commands:
  test: 
    command: set > c:\\myapp\\set.txt
    waitAfterCompletion: 0
```

## 服務
<a name="windows-services"></a>

使用 `services` 金鑰，來定義執行個體啟動時應啟動或停止的服務。`services` 金鑰也可讓您指定來源、套件與檔案的相依關係，因此如果安裝中的檔案需要重新啟動，則 Elastic Beanstalk 會負責重新啟動服務。

### 語法
<a name="windows-services-syntax"></a>

```
services: 
  windows:
    name of service:
      files:
        - "file name"
      sources: 
        - "directory"	
      packages: 
        name of package manager:
            "package name[: version]"
      commands: 
        - "name of command"
```

### 選項
<a name="windows-services-options"></a>

`ensureRunning`  
(選用) 設定為 `true`，以確保服務會在 Elastic Beanstalk 完成後執行。  
設定為 `false`，以確保服務不會在 Elastic Beanstalk 完成後執行。  
如果略過此金鑰，將不會改變服務狀態。

`enabled`  
(選用) 設定為 `true`，來確保服務會在開機時自動啟動。  
設定為 `false`，來確保服務不會在開機時自動啟動。  
如果略過此金鑰，將不會改變此屬性。

`files`  
檔案清單。如果 Elastic Beanstalk 透過檔案區塊直接變更檔案，服務會重新啟動。

`sources`  
目錄清單。如果 Elastic Beanstalk 將封存解壓縮至這些目錄的其中之一，服務會重新啟動。

`packages`  
套件軟體管理工具與套件名稱清單的對應圖。如果 Elastic Beanstalk 安裝或更新這些套件的其中之一，服務會重新啟動。

`commands`  
命令名稱清單。如果 Elastic Beanstalk 執行指定的命令，服務會重新啟動。

### 範例
<a name="windows-services-snippet"></a>

```
services: 
  windows:
    myservice:
      enabled: true
      ensureRunning: true
```

## 容器命令
<a name="windows-container-commands"></a>

使用 `container_commands` 金鑰，來執行會影響您應用程式原始碼的命令。容器命令的執行會在應用程式和 Web 伺服器設定完成及應用程式版本封存檔解壓縮之後，但是在應用程式版本安裝之前。非容器的命令及其他自訂操作，則會在應用程式的原始碼解壓縮之前執行。

容器命令會從暫存目錄執行，您的原始碼會在部署到應用程式伺服器之前，先解壓縮到該目錄。當原始碼部署到最終的位置時，您使用容器命令對暫存目錄中原始碼所進行的變更，也會納入部署。

若要對容器命令的問題進行疑難排解，您可以在[執行個體日誌](using-features.logging.md)中尋找命令的輸出。

如果只要在單一執行個體上執行命令，請使用 `leader_only` 選項；或者，請將 `test` 設定為只在測試命令得出的評估值為 `true` 時，才執行命令。僅限領導者的容器命令，只會在環境建立與部署時執行；其他的命令與伺服器自訂操作，則會在每次佈建或更新執行個體時執行。僅限領導者的容器命令會因為啟動組態變更 (例如變更 AMI ID 或執行個體類型) 而不執行。

### 語法
<a name="windows-container-commands-syntax"></a>

```
container_commands:
  name of container_command:
    command: command to run
```

### 選項
<a name="windows-container-commands-options"></a>

`command`  
要執行的字串或字串陣列。

`env`  
(選用) 在執行命令前先設定環境變數，覆寫掉任何現有的值。

`cwd`  
(選用) 工作目錄。根據預設，這是已經解壓縮應用程式的暫存目錄。

`leader_only`  
(選用) 只在 Elastic Beanstalk 所選擇的單一執行個體上執行指令。僅限領導者的容器命令會先於其他容器命令執行。指令可以是只限領導者或具有 `test`，但只能是其中一種 (`leader_only` 會具有優先性)。

`test`  
(選用) 執行測試命令，此命令必須傳回 `true` 才能執行容器命令。指令可以是只限領導者或具有 `test`，但只能是其中一種 (`leader_only` 會具有優先性)。

`ignoreErrors`  
(選用) 如果容器命令傳回 0 以外的值 (成功)，則請勿讓部署失敗。設定為 `true` 以啟用。

`waitAfterCompletion`  
(選用) 等命令執行完成後再執行下一個命令前的等待秒數。預設值為 **60** 秒。您也可以指定 **forever**。  
不支援在部署期間重新啟動系統。如果系統因為命令而重新啟動，執行個體初始化將會失敗，導致部署失敗。  
作為解決方法，您可以使用它[https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/configuration-files/aws-provided/instance-configuration/windows-configuration/scheduled-restart.config](https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/configuration-files/aws-provided/instance-configuration/windows-configuration/scheduled-restart.config)在部署完成後排程重新啟動。

### 範例
<a name="windows-container-commands-snippet"></a>

下列範例會將 `set` 命令的輸出結果儲存到指定的檔案。Elastic Beanstalk 會在單一執行個體上執行指令，然後在該指令完成時立即重新啟動執行個體。

```
container_commands:
  foo:
    command: set > c:\\myapp\\set.txt
    leader_only: true
    waitAfterCompletion: 0
```