

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 自定义 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)
+ [Services](#windows-services)
+ [容器命令](#windows-container-commands)

将按键在此处列出的顺序对其进行处理。

**注意**  
较旧（不受版本控制）的 .NET 平台版本不会按正确顺序处理配置文件。有关更多信息，请参阅 [跨 Elastic BeanstalkWindows 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** 的 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 环境支持其他格式。有关详细信息，请参阅*在 Linux 服务器上自定义软件*页面上的 [来源](customize-containers-ec2.md#linux-sources)。）

只要该 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。不能使用内容密钥指定该选项。

`encoding`  
(可选) 编码格式。此选项只用于所提供的内容键值。默认值为 `plain`。  
有效值：`plain` \$1 `base64`

`authentication`  
（可选）要使用的 [CloudFormation 身份验证方法](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-authentication.html)的名称。您可以使用资源键将身份验证方法添加到 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)，则必须在它前面再插入一个反斜杠 (转义字符)，如上例所示。

以下示例使用资源键添加名为 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
```

## Services
<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
```