

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

# 使用配置文件 (`.ebextensions`) 进行高级环境自定义
.Ebextensions

您可以将 AWS Elastic Beanstalk 配置文件 (`.ebextensions`) 添加到 Web 应用程序的源代码中，以配置您的环境并自定义其包含的 AWS 资源。配置文件是 YAML 或 JSON 格式的文档，采用 `.config` 文件扩展名，您将其放在名为 `.ebextensions` 的文件夹中，并在应用程序[源包](applications-sourcebundle.md)中部署它们。

**Example .ebextensions/ .config network-load-balancer**  
此示例进行了简单的配置更改。它修改一个配置选项，以将环境的负载均衡器的类型设置为 Network Load Balancer。  

```
option_settings:
  aws:elasticbeanstalk:environment:
    LoadBalancerType: network
```

我们建议对配置文件使用 YAML，因为它比 JSON 更可读。YAML 支持注释、多行命令、针对使用引号的多个备选项等。但是，您可以使用 YAML 或 JSON 在 Elastic Beanstalk 配置文件中以相同的方式进行任何配置更改。

**提示**  
当您开发或测试新的配置文件时，启动运行默认应用程序的干净环境并部署到此环境。格式不正确的配置文件将导致新环境启动失败，并且错误不可恢复。

配置文件的 `option_settings` 部分定义[配置选项](command-options.md)的值。配置选项允许您配置 Elastic Beanstalk 环境 AWS 、其中的资源以及运行应用程序的软件。设置配置选项有几种方法，配置文件只是其中之一。

该[`Resources`部分](environment-resources.md)允许您进一步自定义应用程序环境中的资源，并定义配置选项提供的功能之外的其他 AWS 资源。您可以添加和配置支持的任何资源 AWS CloudFormation，Elastic Beanstalk 使用这些资源来创建环境。

配置文件的其他部分（`packages`、、、`sources`、`files`、`users`、`groups``commands``container_commands`、和`services`）允许您配置在您的环境中启动的 EC2 实例。只要您的环境中有服务器启动，Elastic Beanstalk 就会运行这些部分中定义的操作，为您的应用程序准备操作系统和存储系统。

有关常用 .ebextensions 的示例，请参阅 [Elastic Beanstalk 配置文件存储库](https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files)。

**要求**
+ **位置** — Elastic Beanstalk 将处理部署中存在的所有 `.ebextensions` 文件夹。但是，我们建议您将所有配置文件放在源包根目录中名为 `.ebextensions` 的文件夹中。以点开头的文件夹可被文件浏览器隐藏，因此请确保在创建源包时添加文件夹。有关更多信息，请参阅 [创建 Elastic Beanstalk 应用程序源包](applications-sourcebundle.md)。
+ **命名** – 配置文件必须具有 `.config` 文件扩展名。
+ **格式** – 配置文件必须符合 YAML 或 JSON 规范。

  当使用 YAML 时，请始终使用空格以不同的嵌套级别缩进键。有关 YAML 的更多信息，请参阅 [YAML Ain't 标记语言 (YAML™) 版本 1.1](http://yaml.org/spec/current.html)。
+ **唯一性** – 在每个配置文件中使用每个键一次。
**警告**  
如果您在同一个配置文件中两次使用同一个键 (例如 `option_settings`)，则会删除两个部分之一。将重复的部分组合为单个部分，或将其放在不同的配置文件中。

根据您用来管理环境的客户端，部署过程可能略有不同。有关详细信息，请参阅下面几节：
+ [Elastic Beanstalk 控制台](environment-configuration-methods-during.md#configuration-options-during-console-ebextensions)
+ [EB CLI](environment-configuration-methods-during.md#configuration-options-during-ebcli-ebextensions)
+ [AWS CLI](environment-configuration-methods-during.md#configuration-options-during-awscli-ebextensions)

**Topics**
+ [

# 选项设置
](ebextensions-optionsettings.md)
+ [

# 自定义 Linux 服务器上的软件
](customize-containers-ec2.md)
+ [

# 自定义 Windows Server 上的软件
](customize-containers-windows-ec2.md)
+ [

# 添加和自定义 Elastic Beanstalk 环境资源
](environment-resources.md)

# 选项设置


您可以使用 `option_settings` 键修改 Elastic Beanstalk 配置，并定义可以使用环境变量从应用程序中检索的变量。一些命名空间可让您扩展参数的数量，并指定参数名。有关命名空间和配置选项的列表，请参阅[配置选项](command-options.md)。

也可在创建或更新环境期间将选项设置直接应用于环境。直接应用于环境的设置将覆盖配置文件中相同选项的设置。移除环境配置中的设置后，配置文件中的设置将生效。有关详细信息，请参阅 [优先级](command-options.md#configuration-options-precedence)。

## 语法


选项设置标准语法是对象数组，每一个对象都有一个 `namespace`、`option_name` 和 `value` 键。

```
option_settings:
  - namespace:  namespace
    option_name:  option name
    value:  option value
  - namespace:  namespace
    option_name:  option name
    value:  option value
```

`namespace` 键可选。如果不指定命名空间，则默认使用 `aws:elasticbeanstalk:application:environment`：

```
option_settings:
  - option_name:  option name
    value:  option value
  - option_name:  option name
    value:  option value
```

Elastic Beanstalk 还支持选项设置快速输入语法，您可以在命名空间下以键值对形式指定选项：

```
option_settings:
  namespace:
    option name: option value
    option name: option value
```

## 示例


下面的示例在 `aws:elasticbeanstalk:container:tomcat:jvmoptions` 命名空间中设置一个特定于 Tomcat 平台的选项和一个名为 `MYPARAMETER` 的环境属性。

标准 YAML 格式：

**Example .ebextensions/options.config**  

```
option_settings:
  - namespace:  aws:elasticbeanstalk:container:tomcat:jvmoptions
    option_name:  Xmx
    value:  256m
  - option_name: MYPARAMETER
    value: parametervalue
```

快速输入格式：

**Example .ebextensions/options.config**  

```
option_settings:
  aws:elasticbeanstalk:container:tomcat:jvmoptions:
    Xmx: 256m
  aws:elasticbeanstalk:application:environment:
    MYPARAMETER: parametervalue
```

在 JSON 中：

**Example .ebextensions/options.config**  

```
{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:container:tomcat:jvmoptions",
      "option_name": "Xmx",
      "value": "256m"
    },
    {
      "option_name": "MYPARAMETER",
      "value": "parametervalue"
    }
  ]
}
```

# 自定义 Linux 服务器上的软件
Linux 服务器

本节介绍您可以在配置文件中包含的信息类型，以便在运行 Linux 的 EC2 实例上自定义软件。有关自定义和配置 Elastic Beanstalk 环境的一般信息，请参阅[配置 Elastic Beanstalk 环境](customize-containers.md)。有关在运行 Windows 的 EC2 实例上自定义软件的信息，请参阅[自定义 Windows Server 上的软件](customize-containers-windows-ec2.md)。

建议自定义和配置您的应用程序所依赖的软件。您可以添加要在实例预置期间执行的命令；定义 Linux 用户和组；以及下载文件或直接在环境实例上创建文件。这些文件可能是应用程序所需的依赖项（例如 yum 存储库中的其他包），也可能是配置文件（例如代理配置的替代项，用于覆盖 Elastic Beanstalk 默认的特定设置）。

**注意**  
在 Amazon Linux 2 平台上，我们强烈建议您使用 *Buildfile*，而不是在 .ebextensions 配置文件中提供文件和命令。*Procfile* 和*平台挂钩*，（如果可能）用于在实例预置期间在环境实例上配置和运行自定义代码。有关这些机制的详细信息，请参阅[扩展 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。
YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。

配置文件支持以下键，它们影响运行您的应用程序的 Linux 服务器。

**Topics**
+ [

## 软件包
](#linux-packages)
+ [

## 组
](#linux-groups)
+ [

## Users
](#linux-users)
+ [

## 来源
](#linux-sources)
+ [

## 文件
](#linux-files)
+ [

## 命令
](#linux-commands)
+ [

## Services
](#linux-services)
+ [

## 容器命令
](#linux-container-commands)
+ [

# 示例：使用自定义 Amazon CloudWatch 指标
](customize-containers-cw.md)

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

观察您的环境的[事件](using-features.events.md)，同时开发和测试配置文件。Elastic Beanstalk 将忽略包含验证错误的配置文件（例如“密钥无效”），并且不会处理同一文件中的任何其他密钥。出现这种情况时，Elastic Beanstalk 将警告事件添加到事件日志中。

## 软件包


您可以使用 `packages` 键下载并安装预先打包的应用程序和组件。

### 语法


```
packages: 
  name of package manager:
    package name: version
    ...
  name of package manager:
    package name: version
    ...
  ...
```

您可以在每个程序包管理器密钥下指定多个软件包。

### 支持的软件包格式


目前，Elastic Beanstalk 支持以下包管理器：yum、rubygems、python 和 rpm。包的处理顺序如下：rpm、yum、rubygems 和 python。rubygems 和 python 之间没有处理顺序。在每个包管理器内，不保证包安装顺序。请使用您的操作系统支持的包管理器。

**注意**  
Elastic Beanstalk 支持两个用于 Python 的基础包管理器：pip 和 easy\$1install。但是，在配置文件语法中，您必须将包管理器名称指定为 `python`。当您使用配置文件指定 Python 包管理器时，Elastic Beanstalk 会使用 Python 2.7。如果您的应用程序依赖于不同的 Python 版本，可以在 `requirements.txt` 文件中指定要安装的包。有关更多信息，请参阅 [在 Elastic Beanstalk 上使用要求文件指定依赖项](python-configuration-requirements.md)。

### 指定版本


在每个包管理器内，会使用包名和一系列版本对每个包进行指定。版本可以是字符串、一系列版本、空字符串或者空列表。空字符串或者空列表表示您需要最新的版本。对于 rpm 管理器，版本是以磁盘或 URL 上的文件的路径的方式指定的。不支持相对路径。

如果您指定包的版本，Elastic Beanstalk 会尝试安装该版本，即使实例上已经安装了较新的包版本。如果已经安装了较新的版本，那么部署会失败。一些包管理器支持多个版本，但其他的包管理器可能不支持。有关更多信息，请查看相关的包管理器文档。如果您没有指定版本且已安装了某种版本的包，那么 Elastic Beanstalk 不会安装新的版本，因为它会认为您希望保留并使用现有的版本。

### 示例代码段


下面的代码段为 rpm 指定版本 URL，从 yum 请求最新版本并从 rubygems 请求 chef 的版本 0.10.2。

```
packages: 
  yum:
    libmemcached: [] 
    ruby-devel: []
    gcc: []
  rpm:
    epel: http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
  rubygems: 
    chef: '0.10.2'
```

## 组


您可以使用`groups`密钥创建 Linux/UNIX 群组和分配群组 IDs。要创建组，请添加新的密钥值对，将新的组名映射到可选组 ID。组键可以包含一个或多个组名。下表列出了可用的密钥。

### 语法


```
groups:
  name of group: {}
  name of group:
    gid: "group id"
```

### 选项


`gid`  
组 ID 编号。  
如果指定了组 ID，且存在该名称的组，那么创建组将失败。如果另一个组已拥有所指定的组 ID，那么操作系统可能会拒绝创建组。

### 示例代码段


以下代码段指定了一个名为“groupOne”、但没有分配组 ID 的组，以及一个名为“groupTwo”、但指定了组 ID 值为 45 的组。

```
groups:
  groupOne: {}
  groupTwo:
    gid: "45"
```

## Users


您可以使用`users`密钥在 EC2 实例上创建 Linux/UNIX 用户。

### 语法


```
users:
  name of user:
    groups:
      - name of group
    uid: "id of the user"
    homeDir: "user's home directory"
```

### 选项


`uid`  
用户 ID。如果用户名还有另一个用户 ID，那么此创建过程会失败。如果用户 ID 已指定给现有的用户，那么操作系统可能会拒绝该创建请求。

`groups`  
一系列组名。用户会添加到列表中的每个组。

`homeDir`  
用户的主目录。

创建的用户属于非交互式系统用户，带有 `/sbin/nologin` Shell。这是特意设计的，无法修改。

### 示例代码段


```
users:
  myuser:
    groups:
      - group1
      - group2
    uid: "50"
    homeDir: "/tmp"
```

## 来源


您可以使用`sources`密钥从公共 URL 下载存档文件，然后将其解压缩到 EC2 实例的目标目录中。

### 语法


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

### 支持的格式


支持的格式有 tar、tar\$1gzip、tar\$1bz2 和 Zip。只要该 URL 可公开访问，您就可以引用 Amazon Simple Storage Service (Amazon S3) 等外部位置 (例如，`https://amzn-s3-demo-bucket.s3.amazonaws.com/myobject`)。

### 示例代码段


以下示例会从 Amazon S3 存储桶下载一个公有 .zip 文件并将其解压到 `/etc/myapp` 中：

```
sources:  
  /etc/myapp: https://amzn-s3-demo-bucket.s3.amazonaws.com/myobject
```

**注意**  
多个提取不应重用相同的目标路径。将其他源提取到项目的相同目标路径上将替换内容而不是附加到内容上。

## 文件


您可以使用`files`密钥在 EC2 实例上创建文件。该内容可以內嵌在配置文件中，也可以从 URL 中提取。这些文件会按词典顺序写入磁盘。

您可以提供一个用于授权的实例配置文件，从而使用 `files` 密钥从 Amazon S3 下载私有文件。

如果您指定的文件路径已在实例上存在，则将保留现有文件，并在其名称后附加扩展名 `.bak`。

### 语法


```
files:  
  "target file location on disk": 
     mode: "six-digit octal value"
     owner: name of owning user for file
     group: name of owning group for file
     source: URL
     authentication: authentication name:

  "target file location on disk": 
     mode: "six-digit octal value"
     owner: name of owning user for file
     group: name of owning group for file
     content: |
      # this is my
      # file content
     encoding: encoding format
     authentication: authentication name:
```

### 选项


`content`  
要添加到文件的字符串内容。指定 `content` 或 `source`，但不能同时指定两者。

`source`  
要下载的文件的 URL。指定 `content` 或 `source`，但不能同时指定两者。

`encoding`  
使用 `content` 选项指定的字符串的编码格式。  
有效值：`plain` \$1 `base64`

`group`  
拥有文件的 Linux 组。

`owner`  
拥有文件的 Linux 用户。

`mode`  
是一个六位数的八进制值，表示这个文件的模式。在 Windows 系统中不受支持。将前三位数用于符号链接，将后三位数用于设置权限。要创建符号链接，请指定 `120xxx`，其中 `xxx` 定义目标文件的权限。要指定文件的权限，请使用最后三位，例如 `000644`。

`authentication`  
要使用的 [CloudFormation 身份验证方法](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-authentication.html)的名称。您可以使用资源键将身份验证方法添加到 Auto Scaling 组元数据。有关示例，请参阅以下内容。

### 示例代码段


```
files:
  "/home/ec2-user/myfile" :
    mode: "000755"
    owner: root
    group: root
    source: http://foo.bar/myfile
 
  "/home/ec2-user/myfile2" :
    mode: "000755"
    owner: root
    group: root
    content: |
      this is my
      file content
```

使用符号链接的示例。这会创建指向现有文件 `/tmp/myfile2.txt` 的链接 `/tmp/myfile1.txt`。

```
files:
  "/tmp/myfile2.txt" :
    mode: "120400"
    content: "/tmp/myfile1.txt"
```

以下示例使用资源键添加名为 S3Auth 的身份验证方法并使用该方法从 Amazon S3 存储桶下载私有文件：

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

files:
  "/tmp/data.json" :
    mode: "000755"
    owner: root
    group: root
    authentication: "S3Auth"
    source: https://elasticbeanstalk-us-west-2-123456789012.s3-us-west-2.amazonaws.com/data.json
```

## 命令


您可以使用该`commands`密钥在 EC2 实例上执行命令。这些命令在应用程序之前运行，设置 Web 服务器以及提取应用程序版本文件。

指定的命令以根用户身份运行且按名称的字母顺序进行处理。默认情况下，该命令在根目录中运行。要从另一个目录运行命令，请使用 `cwd` 选项。

要使用您的命令排查问题，您可以在[实例日志](using-features.logging.md)中查找其输出。

### 语法


```
commands:
  command name: 
    command: command to run
    cwd: working directory
    env: 
      variable name: variable value
    test: conditions for command 
    ignoreErrors: true
```

### 选项


`command`  
一个数组（YAML 语法中的[数据块序列集合](http://yaml.org/spec/1.2/spec.html#id2759963)）或一个用于指定要运行的命令的字符串。一些重要说明：  
+ 如果您使用了字符串，则不需要用引号将整个字符串引起来。如果您确实使用了引号，请对相同类型的引号的文本匹配项进行转义。
+ 如果您使用了数组，则不需要对空格字符进行转义或用引号将命令参数引起来。每个数组元素都是一个命令参数。请勿使用数组指定多个命令。
以下示例具有完全相同的效果：  

```
commands:
  command1:
    command: git commit -m "This is a comment."
  command2:
    command: "git commit -m \"This is a comment.\""
  command3:
    command: 'git commit -m "This is a comment."'
  command4:
    command:
      - git
      - commit
      - -m
      - This is a comment.
```
要指定多个命令，请使用[文本数据块标量](http://yaml.org/spec/1.2/spec.html#id2760844)，如以下示例所示。  

```
commands:
  command block:
    command: |
      git commit -m "This is a comment."
      git push
```

`env`  
(可选) 设置该命令的环境变量。这个属性会覆盖而不是追加到现有的环境。

`cwd`  
(可选) 工作目录。如果未指定，命令将从根目录 (/) 运行。

`test`  
（可选）一个命令，此命令必须返回值 `true`（退出代码为 0），以便 Elastic Beanstalk 处理 `command` 键中包含的命令，例如 shell 脚本。

`ignoreErrors`  
(可选) 一个布尔值，该值确定在 `command` 密钥中包含的命令失败时 (返回非零值) 是否应该运行其他命令。如果要在命令失败后继续运行其他命令，请将该值设置为 `true`。否则，请将该值设置为 `false`。默认值为 `false`。

### 示例代码段


以下示例代码段运行 Python 脚本。

```
commands:
  python_install:
    command: myscript.py
    cwd: /home/ec2-user
    env:
      myvarname: myvarvalue
    test: "[ -x /usr/bin/python ]"
```

## Services


您可以使用 `services` 键定义哪些服务应该在实例启动时启动或者停止。`services` 键还可让您在源、包和文件上指定依赖项，以便在由于文件安装而需要重启时，让 Elastic Beanstalk 负责服务的重启。

### 语法


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

### 选项


`ensureRunning`  
设置为 `true` 可确保在 Elastic Beanstalk 完成后服务能够运行。  
设置为 `false` 可确保该服务在 Elastic Beanstalk 完成后不运行。  
忽略该密钥，将不更改服务状态。

`enabled`  
设置为 `true`，可确保该服务在启动时自动启动。  
设置为 `false`，可确保该服务在启动时不会自动启动。  
忽略该密钥，将不更改这个属性。

`files`  
一系列文件。如果 Elastic Beanstalk 直接通过文件块更改一个文件，则该服务会重启。

`sources`  
一系列目录。如果 Elastic Beanstalk 将存档展开到这些目录中的一个，则该服务会重启。

`packages`  
包管理器与一系列包名的映射。如果 Elastic Beanstalk 安装或者更新了这些包中的一个，则该服务会重启。

`commands`  
一系列命令名称。如果 Elastic Beanstalk 运行指定的命令，则服务将重新启动。

### 示例代码段


以下是示例代码段：

```
services: 
  sysvinit:
    myservice:
      enabled: true
      ensureRunning: true
```

## 容器命令


您可以使用 `container_commands` 键执行将影响应用程序源代码的命令。容器命令将在设置应用程序和 Web 服务器并提取应用程序版本存档后，但在部署应用程序版本前运行。非容器命令和其他自定义操作将在提取应用程序源代码之前执行。

指定的命令以根用户身份运行且按名称的字母顺序进行处理。容器命令从暂存目录运行，您的源代码在部署到应用程序服务器前在这里提取。当源部署到其最终位置时，将包含您在暂存目录中使用容器命令对源代码所做的任何更改。

**注意**  
您的容器命令的输出记录在 `cfn-init-cmd.log` 实例日志中。有关检索和查看实例日志的更多信息，请参阅[查看来自 Amazon EC2 实例的日志](using-features.logging.md)。

可以使用 `leader_only` 仅对单个实例运行此命令，也可以配置 `test` 以仅在测试命令的评估结果为 `true` 时运行此命令。仅领导容器命令只在创建和部署环境期间执行，而其他命令和服务器自定义操作将在预配置或更新实例时执行。由于启动配置发生更改 (例如 AMI Id 或实例类型的更改)，未执行仅领导容器命令。

### 语法


```
container_commands:
  name of container_command:
    command: "command to run"
    leader_only: true
  name of container_command:
    command: "command to run"
```

### 选项


`command`  
要运行的字符串或字符串数组。

`env`  
(可选) 在运行命令之前设置环境变量，并覆盖任何现有值。

`cwd`  
(可选) 工作目录。默认情况下，这是解压缩应用程序的暂存目录。

`leader_only`  
（可选）仅对 Elastic Beanstalk 选定的单个实例运行命令。仅领导容器命令将在其他容器命令之前运行。命令可以是仅领导命令或具有 `test`，但不能同时具备这两个特性 (`leader_only` 优先)。

`test`  
(可选) 运行必须返回 `true` 的测试命令以便运行容器命令。命令可以是仅领导命令或具有 `test`，但不能同时具备这两个特性 (`leader_only` 优先)。

`ignoreErrors`  
(可选) 不在容器命令返回 0 以外的值 (成功) 时导致部署失败。设置为 `true` 可实现这一点。

### 示例代码段


以下是示例代码段。

```
container_commands:
  collectstatic:
    command: "django-admin.py collectstatic --noinput"
  01syncdb:
    command: "django-admin.py syncdb --noinput"
    leader_only: true
  02migrate:
    command: "django-admin.py migrate"
    leader_only: true
  99customize:
    command: "scripts/customize.sh"
```

# 示例：使用自定义 Amazon CloudWatch 指标


本主题提供了一个配置示例，该示例将基于亚马逊 Linux 2 及更高版本的平台的 Elastic Beanstalk 指标 CloudWatch 与亚马逊代理集成。配置示例使用 `.ebextensions` 配置文件中的文件和命令。

Amazon CloudWatch 是一项网络服务，可让您监控、管理和发布各种指标，并根据指标中的数据配置警报操作。您可以定义自定义指标供自己使用，Elastic Beanstalk 会将这些指标推送到亚马逊。 CloudWatch一旦亚马逊 CloudWatch 包含您的自定义指标，您就可以在亚马逊 CloudWatch 控制台中查看这些指标。

**亚马逊 CloudWatch 代理**  
Amazon CloudWatch 代理支持跨操作系统从 Amazon EC2 实例和本地服务器收集 CloudWatch 指标和日志。代理支持在系统级别收集的指标。此外，它还支持从应用程序或服务中收集自定义日志和指标。有关亚马逊 CloudWatch 代理的更多信息，请参阅*亚马逊 CloudWatch 用户指南*[中的通过 CloudWatch 代理收集指标和日志](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)。

**注意**  
Ela [stic Beanstalk 增强型](health-enhanced.md)健康报告原生支持将各种实例和环境指标发布到。 CloudWatch有关详细信息，请参阅 [为环境发布 Amazon CloudWatch 自定义指标](health-enhanced-cloudwatch.md)。

**Topics**
+ [

## .Ebextensions 配置文件
](#customize-containers-cw-update-roles)
+ [

## Permissions
](#customize-containers-cw-policy)
+ [

## 在 CloudWatch 控制台中查看指标
](#customize-containers-cw-console)

## .Ebextensions 配置文件


此示例使用.ebextensions 配置文件中的文件和命令在 Amazon Linux 2 平台 CloudWatch 上配置和运行亚马逊代理。此代理预先包装在 Amazon Linux 2 中。如果您使用的是其他操作系统，则可能需要执行其他安装代理的步骤。有关更多信息，请参阅 *Amazon CloudWatch 用户指南*中的[安装 CloudWatch 代理](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance.html)。

要使用该示例，请将其保存到名为 `cloudwatch.config` 的文件中，并将该文件放到项目目录顶层的 `.ebextensions` 目录中，然后使用 Elastic Beanstalk 控制台（在[源包](applications-sourcebundle.md)中包括 .ebextensions 目录）或 [EB CLI](eb-cli3.md) 部署您的应用程序。

有关配置文件的详细信息，请参阅 [使用配置文件 (`.ebextensions`) 进行高级环境自定义](ebextensions.md)。

此文件有以下两个部分：
+ `files` — 此部分添加代理配置文件。它指示代理应向 Amazon 发送哪些指标和日志 CloudWatch。在此示例中，我们只发送 *mem\$1used\$1percent* 指标。有关亚马逊 CloudWatch 代理支持的系统级指标的完整列表，请参阅*亚马逊 CloudWatch 用户指南*[中的 CloudWatch 代理收集的指标](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html)。
+ `container_commands` — 本部分包含启动代理的命令，并将配置文件作为参数传递。有关 `container_commands` 的更多详细信息，请参阅 [容器命令](customize-containers-ec2.md#linux-container-commands)。

**.ebextensions/cloudwatch.config**

```
files:  
  "/opt/aws/amazon-cloudwatch-agent/bin/config.json": 
    mode: "000600"
    owner: root
    group: root
    content: |
      {
        "agent": {
          "metrics_collection_interval": 60,
          "run_as_user": "root"
        },
        "metrics": {
          "namespace": "System/Linux",
          "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}"
          },
          "metrics_collected": {
            "mem": {
              "measurement": [
                "mem_used_percent"
              ]
            }
          }
        }
      }  
container_commands:
  start_cloudwatch_agent: 
    command: /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a append-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
```

## Permissions


您环境中的实例需要适当的 IAM 权限才能使用亚马逊 CloudWatch 代理发布自定义亚马逊 CloudWatch 指标。您可以将您的环境中的实例添加到此环境的[实例配置文件](concepts-roles-instance.md)中，从而向它们授予权限。您可以在部署应用程序前/后为此实例配置文件添加权限。

**授予发布 CloudWatch 指标的权限**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**角色**。

1. 选择您的环境的实例配置文件角色。在使用 Elastic Beanstalk 控制台或 [EB CLI](eb-cli3.md) 创建环境时，该角色默认为 `aws-elasticbeanstalk-ec2-role`。

1. 选择**权限**选项卡。

1. 在 **Permissions Policies**（权限策略）下，**Permissions**（权限）部分中，选择 **Attach policies**（附加策略）。

1. 在 “**附加权限**” 下，选择 AWS 托管策略**CloudWatchAgentServerPolicy**。然后单击 **Attach policy**（附加策略）。

有关如何管理策略的更多信息，请参阅《IAM 用户指南》**中的[使用策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/ManagingPolicies.html)。

## 在 CloudWatch 控制台中查看指标


将 CloudWatch 配置文件部署到您的环境后，请查看 [Amazon CloudWatch 控制台](https://console.aws.amazon.com/cloudwatch/home)以查看您的指标。自定义指标将位于**CWAgent**命名空间中。

有关更多信息，请参阅《*Amazon CloudWatch 用户指南*》中的[查看可用指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/viewing_metrics_with_cloudwatch.html)。

# 自定义 Windows Server 上的软件
Windows 服务器

建议自定义和配置您的应用程序所依赖的软件。这些文件可能是该应用程序所要求的依赖项，例如需要运行的其他软件包或服务。有关自定义和配置 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 将警告事件添加到事件日志中。

## 软件包


使用 `packages` 键下载并安装预先打包的应用程序和组件。

在 Windows 环境中，Elastic Beanstalk 支持下载和安装 MSI 软件包。（Linux 环境支持其他软件包管理器。有关详细信息，请参阅*在 Linux 服务器上自定义软件*页面上的 [软件包](customize-containers-ec2.md#linux-packages)。）

只要该 URL 可公开访问，您就可以引用 Amazon Simple Storage Service (Amazon S3) 对象等任意外部位置。

如果您指定了多个 `msi:` 程序包，则无法保证其安装顺序。

### 语法


指定您选择的名称作为软件包名称，而且指定 MSI 文件位置的 URL 作为该值。您可以在 `msi:` 密钥下指定多个程序包。

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

### 示例


下面的示例指定了从 `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
```

## 来源


使用 `sources` 键从公有 URL 下载存档文件并将其解压到 EC2 实例上的目标目录中。

### 语法


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

### 支持的格式


在 Windows 环境中，Elastic Beanstalk 支持 .zip 格式。（Linux 环境支持其他格式。有关详细信息，请参阅*在 Linux 服务器上自定义软件*页面上的 [来源](customize-containers-ec2.md#linux-sources)。）

只要该 URL 可公开访问，您就可以引用 Amazon Simple Storage Service (Amazon S3) 对象等任意外部位置。

### 示例


以下示例会从 Amazon S3 下载一个公有 .zip 文件并将其解压到 `c:/myproject/myapp` 中。

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

## 文件


使用 `files` 键在 EC2 实例上创建文件。内容可以内嵌在配置文件中，也可以取自 URL。这些文件会按词典顺序写入磁盘。要从 Amazon S3 下载私有文件，请提供实例配置文件以进行授权。

### 语法


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

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

### 选项


`content`  
(可选) 一个字符串。

`source`  
(可选) 加载文件的 URL。不能使用内容密钥指定该选项。

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

`authentication`  
（可选）要使用的 [CloudFormation 身份验证方法](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-authentication.html)的名称。您可以使用资源键将身份验证方法添加到 Auto Scaling 组元数据。

### 示例


以下示例显示了提供文件内容的两种方式：通过 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"
```

## 命令


使用 `commands` 键在 EC2 实例上执行命令。该命令是按名称的字母顺序处理的，它们会在安裝应用程序和 Web 服务器以及提取应用程序版本文件前运行。

管理员用户身份可运行指定的命令。

要使用您的命令排查问题，您可以在[实例日志](using-features.logging.md)中查找其输出。

### 语法


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

### 选项


`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) 来安排在部署完成后进行重启。

### 示例


下面的示例将 `set` 命令的输出保存到指定的文件。如果有后续命令，Elastic Beanstalk 会在此命令完成后立即运行后续命令。如果命令需要重新启动，则 Elastic Beanstalk 会在命令完成后立即重新启动实例。

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

## Services


使用 `services` 键定义哪些服务应该在实例启动时启动或者停止。`services` 键还可让您指定源、包和文件的依赖项，以便在由于文件安装而需要重启时，让 Elastic Beanstalk 负责服务的重启。

### 语法


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

### 选项


`ensureRunning`  
（可选）设置为 `true` 可确保在 Elastic Beanstalk 完成后服务能够运行。  
设置为 `false` 可确保该服务在 Elastic Beanstalk 完成后不运行。  
忽略该密钥，将不更改服务状态。

`enabled`  
(可选) 设为 `true` 以确保此服务在启动时自动启动。  
设置为 `false`，可确保该服务在启动时不会自动启动。  
忽略该密钥，将不更改这个属性。

`files`  
一系列文件。如果 Elastic Beanstalk 直接通过文件块更改一个文件，则该服务会重启。

`sources`  
一系列目录。如果 Elastic Beanstalk 将存档展开到这些目录中的一个，则该服务会重启。

`packages`  
包管理器与一系列包名的映射。如果 Elastic Beanstalk 安装或者更新了这些包中的一个，则该服务会重启。

`commands`  
一系列命令名称。如果 Elastic Beanstalk 运行指定的命令，则服务将重新启动。

### 示例


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

## 容器命令


使用 `container_commands` 键执行将影响应用程序源代码的命令。容器命令将在设置应用程序和 Web 服务器并提取应用程序版本存档后，但在部署应用程序版本前运行。非容器命令和其他自定义操作将在提取应用程序源代码之前执行。

容器命令从暂存目录运行，您的源代码在部署到应用程序服务器前在这里提取。当源部署到其最终位置时，将包含您在暂存目录中使用容器命令对源代码所做的任何更改。

要使用您的容器命令排查问题，您可以在[实例日志](using-features.logging.md)中查找其输出。

可以使用 `leader_only` 选项只对单个实例运行此命令，也可以配置 `test` 以只在测试命令的评估结果为 `true` 时运行此命令。仅领导容器命令只在创建和部署环境期间执行，而其他命令和服务器自定义操作将在预配置或更新实例时执行。由于启动配置发生更改 (例如 AMI Id 或实例类型的更改)，未执行仅领导容器命令。

### 语法


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

### 选项


`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) 来安排在部署完成后进行重启。

### 示例


下面的示例将 `set` 命令的输出保存到指定的文件。Elastic Beanstalk 在一个实例上运行此命令，并在命令完成后立即重新启动实例。

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

# 添加和自定义 Elastic Beanstalk 环境资源
自定义资源

您可能希望自定义属于 Elastic Beanstalk 环境一部分的环境资源。例如，您可能想要添加 Amazon SQS 队列和队列深度警报，或者您可能想要添加一个 Ama ElastiCache zon 集群。在部署应用程序版本的同时，您就可以轻松地自定义环境，只需使用源包将配置文件添加进来即可。

您可以使用[配置文件](ebextensions.md)中的`Resources`密钥在您的环境中创建和自定义 AWS 资源。配置文件中定义的资源将添加到用于启动环境的 CloudFormation 模板中。支持所有 CloudFormation [资源类型](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)。

**注意**  
每当您添加不由 Elastic Beanstalk 管理的资源时，请务必为您的 (IAM) 用户添加具有相应权限 AWS Identity and Access Management 的用户策略。Elastic Beanstalk 提供的[托管用户策略](AWSHowTo.iam.managed-policies.md)仅涵盖对 Elastic Beanstalk 托管资源的权限。

例如，以下配置文件将 Auto Scaling 生命周期挂钩添加到 Elastic Beanstalk 创建的默认 Auto Scaling 组中：

**`~/my-app/.ebextensions/as-hook.config`**

```
Resources:
  hookrole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument: {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [ "autoscaling.amazonaws.com" ]
                  },
                  "Action": [ "sts:AssumeRole" ]
               } ]
            }
      Policies: [ {
               "PolicyName": "SNS",
               "PolicyDocument": {
                      "Version": "2012-10-17",		 	 	 
                      "Statement": [{
                          "Effect": "Allow",
                          "Resource": "*",
                          "Action": [
                              "sqs:SendMessage",
                              "sqs:GetQueueUrl",
                              "sns:Publish"
                          ]
                        }
                      ]
                  }
               } ]
  hooktopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: "my-email@example.com"
          Protocol: email
  lifecyclehook:
    Type: AWS::AutoScaling::LifecycleHook
    Properties:
      AutoScalingGroupName: { "Ref" : "AWSEBAutoScalingGroup" }
      LifecycleTransition: autoscaling:EC2_INSTANCE_TERMINATING
      NotificationTargetARN: { "Ref" : "hooktopic" }
      RoleARN: { "Fn::GetAtt" : [ "hookrole", "Arn"] }
```

此示例定义三个资源：`hookrole`、`hooktopic` 和 `lifecyclehook`。前两个资源是 IAM 角色，它授予 Amazon A EC2 uto Scaling 向亚马逊 SNS 发布消息的权限，以及一个 SNS 主题，用于将来自 Auto Scaling 组的消息中继到电子邮件地址。Elastic Beanstalk 使用指定的属性和类型创建这些资源。

最后一个资源 `lifecyclehook` 是生命周期钩子本身：

```
  lifecyclehook:
    Type: AWS::AutoScaling::LifecycleHook
    Properties:
      AutoScalingGroupName: { "Ref" : "AWSEBAutoScalingGroup" }
      LifecycleTransition: autoscaling:EC2_INSTANCE_TERMINATING
      NotificationTargetARN: { "Ref" : "hooktopic" }
      RoleARN: { "Fn::GetAtt" : [ "hookrole", "Arn"] }
```

生命周期钩子使用两个[函数](ebextensions-functions.md)填充钩子属性值。`{ "Ref" : "AWSEBAutoScalingGroup" }` 检索 Elastic Beanstalk 为环境创建的 Auto Scaling 组的名称。`AWSEBAutoScalingGroup` 是 Elastic Beanstalk 提供的标准[资源名称](customize-containers-format-resources-eb.md)之一。

对于 `[AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#d0e48356)`，`Ref` 只返回角色名称，而不返回 ARN。要获取 `RoleARN` 参数的 ARN，需要改用另一个内部函数 `Fn::GetAtt`，该函数获取一个资源的所有属性。`RoleARN: { "Fn::GetAtt" : [ "hookrole", "Arn"] }` 将从 `hookrole` 资源获取 `Arn` 属性。

`{ "Ref" : "hooktopic" }` 获取之前在配置文件中创建的 Amazon SNS 主题的 ARN。返回的值因资源类型`Ref`而异，可以在该[ AWS::SNS::Topic 资源类型的 CloudFormation 用户指南主题](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html#d0e62250)中找到。

# 修改 Elastic Beanstalk 为环境创建的资源
Elastic Beanstalk 资源

Elastic Beanstalk 为您的环境创建的资源有名称。您可以使用这些名称通过[函数](ebextensions-functions.md)来获取有关资源的信息，或修改资源中的属性来自定义其行为。本主题介绍了 Elastic Beanstalk 在不同类型的环境中使用的 AWS 资源。

**注意**  
上一主题[自定义资源](environment-resources.md)提供了一些用于自定义环境资源的使用案例和示例。另外，您可以在后面的主题 [自定义资源示例](customize-environment-resources-examples.md) 中找到更多配置文件示例。

Web 服务器环境具有以下资源。

**Web 服务器环境**
+ `AWSEBAutoScalingGroup`（[AWS::AutoScaling::AutoScaling群组](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html)）— 连接到您的环境的 Auto Scaling 群组。
+ 以下两种资源之一。
  + `AWSEBAutoScalingLaunchConfiguration`([AWS::AutoScaling::LaunchConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html))-附加到您环境的 Auto Scaling 组的启动配置。
  + `AWSEBEC2LaunchTemplate`([AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html)) — 您的环境的 Auto Scaling 组使用的 Amazon EC2 启动模板。
**注意**  
如果您的环境使用需要 Amazon EC2 启动模板的功能，并且您的用户策略缺少所需权限，则创建或更新环境可能会失败。[使用 **AdministratorAccess-AWSElastic Beanstalk**[托管用户策略](AWSHowTo.iam.managed-policies.md)，或向您的自定义策略添加所需的权限。](AWSHowTo.iam.managed-policies.md#AWSHowTo.iam.policies)
+ `AWSEBEnvironmentName`([AWS::ElasticBeanstalk::Environment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-beanstalk-environment.html)) — 您的环境。
+ `AWSEBSecurityGroup`([AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html)) — 附加到您的 Auto Scaling 组的安全组。
+ `AWSEBRDSDatabase`([AWS:: RDS:: DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html)) — 连接到您的环境的 Amazon RDS 数据库实例（如果适用）。

在负载均衡的环境中，您可以访问与负载均衡器相关的其他资源。传统负载均衡器有一个资源用于负载均衡器，一个资源用于连接到它的安全组。应用程序和网络负载均衡器还有附加资源可用于负载均衡器的默认侦听器、侦听器规则和目标组。

**负载均衡环境**
+ `AWSEBLoadBalancer`([AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html))-您的环境的经典负载均衡器。
+ `AWSEBV2LoadBalancer`([AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html))-您的环境的应用程序或网络负载均衡器。
+ `AWSEBLoadBalancerSecurityGroup`([AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html)) — 仅在自定义[亚马逊虚拟私有云](https://docs.aws.amazon.com/vpc/latest/userguide/)（亚马逊 VPC）中，Elastic Beanstalk 为负载均衡器创建的安全组的名称。在默认 VPC 或 EC2 Classic 中，Elastic Load Balancing 会将默认安全组分配给负载均衡器。
+ `AWSEBV2LoadBalancerListener`([AWS::ElasticLoadBalancingV2::Listener](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html)) — 允许负载均衡器检查连接请求并将其转发给一个或多个目标组的侦听器。
+ `AWSEBV2LoadBalancerListenerRule`([AWS::ElasticLoadBalancingV2::ListenerRule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenerrule.html)) — 定义 Elastic Load Balancing 侦听器对哪些请求采取操作以及它采取的操作。
+ `AWSEBV2LoadBalancerTargetGroup`([AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html)) — 一个 Elastic Load Balancing 目标组，用于将请求路由到一个或多个注册目标，例如 Amazon EC2 实例。

工作线程环境具有用于可缓存传入请求的 SQS 队列的资源，还有一个 Amazon DynamoDB 表，实例可使用该表来选择领导。

**工作线程环境**
+ `AWSEBWorkerQueue`([AWS::SQS::Queue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-queues.html)) — Amazon SQS 队列，守护程序从中提取需要处理的请求。
+ `AWSEBWorkerDeadLetterQueue`([AWS::SQS::Queue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-queues.html)) — Amazon SQS 队列，用于存储守护程序无法传送或未成功处理的消息。
+ `AWSEBWorkerCronLeaderRegistry`([AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html)) — Amazon DynamoDB 表，它是守护程序用于执行定期任务的内部注册表。

# 其他 CloudFormation 模板密钥
参数和其它密钥

我们已经引入了 CloudFormation 诸如`Resources``files`、和之类的配置文件密钥`packages`。Elastic Beanstalk 将配置文件 CloudFormation 内容添加到支持您的环境的模板中，因此 CloudFormation 您可以使用其他部分在配置文件中执行高级任务。

**Topics**
+ [

## 参数
](#ebextensions-otherkeys-parameters)
+ [

## 输出
](#ebextensions-otherkeys-outputs)
+ [

## 映像
](#ebextensions-otherkeys-mappings)

## 参数


参数是 Elastic Beanstalk 自己的[自定义选项](configuration-options-custom.md)的替代项，您可以用来定义要在配置文件的其他位置使用的值。与自定义选项相似，您可以使用参数在一个位置，收集用户可配置值。与自定义选项不同，您不能使用 Elastic Beanstalk 的 API 来设置参数值，并且可以在模板中定义的参数数量受到限制。 CloudFormation

您可能想要使用参数的原因之一是让您的配置文件兼作 CloudFormation 模板。如果您使用参数而不是自定义选项，则可以使用配置文件在中 CloudFormation 创建与其自己的堆栈相同的资源。例如，您可能有一个配置文件用于向环境中添加用于测试的 Amazon EFS 文件系统，然后使用同一个文件创建独立的文件系统，不绑定到用于生产用途的环境生命周期。

以下示例演示使用参数在配置文件顶部收集用户可配置的值。

**Example [L oadbalancer-accesslogs-existingbucket .config](https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/configuration-files/aws-provided/resource-configuration/loadbalancer-accesslogs-existingbucket.config) — 参数**  

```
Parameters:
  bucket:
    Type: String
    Description: "Name of the Amazon S3 bucket in which to store load balancer logs"
    Default: "amzn-s3-demo-bucket"
  bucketprefix:
    Type: String
    Description: "Optional prefix. Can't start or end with a /, or contain the word AWSLogs"
    Default: ""
```

## 输出


您可以使用 `Outputs` 数据块，将有关已创建资源的信息导出到 CloudFormation。然后，你可以使用该`Fn::ImportValue`函数将该值提取到 Elastic Beanstalk 之外的 CloudFormation 模板中。

以下示例创建了一个 Amazon SNS 主题，并将其 ARN 导出到名称为。 CloudFormation `NotificationTopicArn`

**Example [sns-topic.config](https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/configuration-files/aws-provided/resource-configuration/sns-topic.config)**  

```
Resources:
  NotificationTopic:
    Type: AWS::SNS::Topic

Outputs:
  NotificationTopicArn:
    Description: Notification topic ARN
    Value: { "Ref" : "NotificationTopic" }
    Export:
      Name: NotificationTopicArn
```

在其他环境的配置文件或 Elastic Beanstalk 之外的 CloudFormation 模板中，`Fn::ImportValue`您可以使用该函数来获取导出的 ARN。此示例将导出的值分配给名为 `TOPIC_ARN` 的环境属性。

**Example env.config**  

```
option_settings:
  aws:elasticbeanstalk:application:environment:
    TOPIC_ARN: '`{ "Fn::ImportValue" : "NotificationTopicArn" }`'
```

## 映像


您可以使用映射，来存储按命名空间组织的键-值对。映射可以帮助组织您在配置中使用的值，或根据其它值来更改参数值。例如，以下配置根据当前区域来设置账户 ID 参数的值。

**Example [L oadbalancer-accesslogs-newbucket .config](https://github.com/awsdocs/elastic-beanstalk-samples/tree/main/configuration-files/aws-provided/resource-configuration/loadbalancer-accesslogs-newbucket.config) — 映射**  

```
Mappings: 
  Region2ELBAccountId: 
    us-east-1: 
      AccountId: "111122223333"
    us-west-2: 
      AccountId: "444455556666"
    us-west-1: 
      AccountId: "123456789012"
    eu-west-1: 
      AccountId: "777788889999"
...
            Principal: 
              AWS: 
                ? "Fn::FindInMap"
                : 
                  - Region2ELBAccountId
                  - 
                    Ref: "AWS::Region"
                  - AccountId
```

# 函数


您可以在配置文件中使用函数，通过来自其他资源或来自 Elastic Beanstalk 配置选项设置的信息填充资源属性的值。Elastic B CloudFormation eanstalk 支持`Ref`函数 `Fn::GetAtt` (`Fn::Join`、、) 和一个特定于 Elastic BeanStalk 的函数。`Fn::GetOptionSetting`

**Topics**
+ [

## Ref
](#ebextensions-functions-ref)
+ [

## Fn:: GetAtt
](#ebextensions-functions-getatt)
+ [

## Fn::Join
](#ebextensions-functions-join)
+ [

## Fn:: GetOptionSetting
](#ebextensions-functions-getoptionsetting)

## Ref


`Ref`用于检索 AWS 资源的默认字符串表示形式。`Ref` 返回的值取决于资源类型，有时也取决于其他因素。例如，安全组 ([AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html)) 返回安全组的名称或 ID，具体取决于该安全组是在默认的[亚马逊虚拟私有云 (Amazon](https://docs.aws.amazon.com/vpc/latest/userguide/) VPC)、 EC2经典还是自定义 VPC 中。

```
{ "Ref" : "resource name" }
```

**注意**  
有关每个资源类型的详细信息（包括 `Ref` 的返回值），请参阅 *CloudFormation 用户指南*中的 [AWS 资源类型参考](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)。

在 [Auto Scaling 生命周期挂钩](environment-resources.md)示例中：

```
Resources:
  lifecyclehook:
    Type: AWS::AutoScaling::LifecycleHook
    Properties:
      AutoScalingGroupName: { "Ref" : "AWSEBAutoScalingGroup" }
```

您还可以使用`Ref`检索在同一文件或其他配置文件中其他位置定义的 CloudFormation 参数的值。

## Fn:: GetAtt


`Fn::GetAtt`用于检索 AWS 资源上属性的值。

```
{ "Fn::GetAtt" : [ "resource name", "attribute name"] }
```

在 [Auto Scaling 生命周期挂钩](environment-resources.md)示例中：

```
Resources:
  lifecyclehook:
    Type: AWS::AutoScaling::LifecycleHook
    Properties:
      RoleARN: { "Fn::GetAtt" : [ "hookrole", "Arn"] }
```

有关更多信息，请参阅 [Fn:: GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html)。

## Fn::Join


使用 `Fn::Join` 可组合带有一个分隔符的字符串。这些字符串可以进行硬编码，也可以使用来自 `Fn::GetAtt` 或 `Ref` 的输出。

```
{ "Fn::Join" : [ "delimiter", [ "string1", "string2" ] ] }
```

有关更多信息，请参阅 [Fn::Join](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html)。

## Fn:: GetOptionSetting


使用 `Fn::GetOptionSetting` 可检索应用于环境的[配置选项](command-options.md)设置的值。

```
"Fn::GetOptionSetting":
  Namespace: "namespace"
  OptionName: "option name"
  DefaultValue: "default value"
```

在[存储私有密钥](https-storingprivatekeys.md)示例中：

```
Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          buckets: ["elasticbeanstalk-us-west-2-123456789012"]
          roleName: 
            "Fn::GetOptionSetting": 
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role"
```

# 自定义资源示例


以下是可以用于自定义 Elastic Beanstalk 环境的一系列示例配置文件：
+ [DynamoDB CloudWatch、和 SNS](https://elasticbeanstalk.s3.amazonaws.com/extensions/DynamoDB-with-CloudWatch-Alarms.config)
+ [Elastic Load Balancin CloudWatch](https://elasticbeanstalk.s3.amazonaws.com/extensions/ELB-Alarms.config)
+ [ElastiCache](https://elasticbeanstalk.s3.amazonaws.com/extensions/ElastiCache.config)
+ [RDS 和 CloudWatch](https://elasticbeanstalk.s3.amazonaws.com/extensions/RDS-Alarms.config)
+ [SQS、SNS 和 CloudWatch](https://elasticbeanstalk.s3.amazonaws.com/extensions/SNS.config)

本页的子主题提供了一些在 Elastic Beanstalk 环境中添加和配置自定义资源的扩展示例。

**Topics**
+ [

# 例如： ElastiCache
](customize-environment-resources-elasticache.md)
+ [

# 示例：SQS CloudWatch、和 SNS
](customize-environment-resources-sqs.md)
+ [

# 示例：DynamoDB CloudWatch、和 SNS
](customize-environment-resources-dynamodb.md)

# 例如： ElastiCache


以下示例将亚马逊 ElastiCache 集群添加到 EC2-Classic 和 EC2-VPC（包括默认和自定义[亚马逊虚拟私有云](https://docs.aws.amazon.com/vpc/latest/userguide/)（亚马逊 VPC））平台。有关这些平台以及如何确定 EC2 支持您所在地区和 AWS 账户的平台的更多信息，请参阅[https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-platforms.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-platforms.html)。然后请参阅本主题中适用于您的平台的部分。
+ [EC2-classic 平台](#customize-environment-resources-elasticache-classic)
+ [EC2-VPC (默认)](#customize-environment-resources-elasticache-defaultvpc)
+ [EC2-VPC (自定义)](#customize-environment-resources-elasticache-targetedvpc)

## EC2-classic 平台


此示例将一个 Amazon ElastiCache 集群添加到一个环境中，其实例已启动到 EC2-Classic 平台。此示例中列出的所有属性是为每种资源类型必须设置的最低要求。你可以在示例中下载示[ElastiCache例](https://elasticbeanstalk.s3.amazonaws.com/extensions/ElastiCache.config)。

**注意**  
此示例创建了 AWS 资源，您可能需要为此付费。有关 AWS 定价的更多信息，请参阅[https://aws.amazon.com/pricing/](https://aws.amazon.com/pricing/)。有些服务属于 AWS 免费使用套餐的一部分。如果您是新客户，则可免费试用这些服务。请参阅[https://aws.amazon.com/free/](https://aws.amazon.com/free/)了解更多信息。

要使用此示例，请执行下列操作：

1. 在源包的顶级目录中创建 `[.ebextensions](ebextensions.md)` 目录。

1. 创建两个扩展名为 `.config` 的配置文件并将其放入您的 `.ebextensions` 目录。一个配置文件定义资源，另一个配置文件定义选项。

1. 将应用程序部署到 Elastic Beanstalk。

   YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。

创建定义资源的配置文件 (例如，`elasticache.config`)。在此示例中，我们通过指定 ElastiCache 群集资源的名称 (`MyElastiCache`)、声明其类型，然后配置群集的属性来创建群集。 ElastiCache 该示例引用了在此配置文件中创建和定义 ElastiCache 的安全组资源的名称。接下来，我们创建一个 ElastiCache 安全组。我们会定义这个资源的名称、声明它的类型和添加该安全组的描述。最后，我们将安全组的入口规则设置为仅允许来自 ElastiCache 安全组 (`MyCacheSecurityGroup`) 和 Elastic Beanstalk ElastiCache 安全组 () 内部的实例进行访问。`AWSEBSecurityGroup`参数名 `AWSEBSecurityGroup` 是 Elastic Beanstalk 提供的固定资源名称。您必须`AWSEBSecurityGroup`向 ElastiCache 安全组添加入口规则，这样您的 Elastic Beanstalk 应用程序才能连接到集群中的实例。 ElastiCache 

```
#This sample requires you to create a separate configuration file that defines the custom option settings for CacheCluster properties.
          
Resources:
  MyElastiCache:
    Type: AWS::ElastiCache::CacheCluster
    Properties:
      CacheNodeType: 
         Fn::GetOptionSetting:
             OptionName : CacheNodeType
             DefaultValue: cache.m1.small
      NumCacheNodes: 
           Fn::GetOptionSetting:
             OptionName : NumCacheNodes
             DefaultValue: 1
      Engine: 
           Fn::GetOptionSetting:
             OptionName : Engine
             DefaultValue: memcached
      CacheSecurityGroupNames:
        - Ref: MyCacheSecurityGroup
  MyCacheSecurityGroup:
    Type: AWS::ElastiCache::SecurityGroup
    Properties:
      Description: "Lock cache down to webserver access only"
  MyCacheSecurityGroupIngress:
    Type: AWS::ElastiCache::SecurityGroupIngress
    Properties:
      CacheSecurityGroupName: 
        Ref: MyCacheSecurityGroup
      EC2SecurityGroupName:
        Ref: AWSEBSecurityGroup
```

有关此示例配置文件中使用的资源的更多信息，请参阅以下参考：
+ [AWS::ElastiCache::CacheCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html)
+ [AWS::ElastiCache::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group.html)
+ [AWS::Elasti缓存：SecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group-ingress.html)

创建名为 `options.config` 的单独配置文件，并定义自定义选项设置。

```
option_settings:
  "aws:elasticbeanstalk:customoption":
     CacheNodeType : cache.m1.small
     NumCacheNodes : 1
     Engine : memcached
```

**这些行告诉 Elastic Beanstalk **CacheNodeType从配置文件（我们的示例中**CacheNodeType为 NumCacheNodes options.config）中获取、**和引擎属性的值， NumCacheNodes该**文件包含一个 option\$1settings 部分，其中有一个 aws: elasticbeanstalk: customoption 部分，其中包含包含要使用的实际值的名称-值对。**在以上示例中，这意味着 cache.m1.small、1 和 memcached 将用于这些值。有关 `Fn::GetOptionSetting` 的更多信息，请参阅 [函数](ebextensions-functions.md)。

## EC2-VPC (默认)


此示例将 Amazon ElastiCache 集群添加到已启动到 EC2-VPC 平台的实例的环境中。具体来说，此部分中的信息适用于 EC2 在默认 VPC 中启动实例的情景。此示例中的所有属性是为每种资源类型必须设置的最低要求。有关默认的更多信息 VPCs，请参阅[您的默认 VPC 和子网](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)。

**注意**  
此示例创建了 AWS 资源，您可能需要为此付费。有关 AWS 定价的更多信息，请参阅[https://aws.amazon.com/pricing/](https://aws.amazon.com/pricing/)。有些服务属于 AWS 免费使用套餐的一部分。如果您是新客户，则可免费试用这些服务。请参阅[https://aws.amazon.com/free/](https://aws.amazon.com/free/)了解更多信息。

要使用此示例，请执行下列操作：

1. 在源包的顶级目录中创建 `[.ebextensions](ebextensions.md)` 目录。

1. 创建两个扩展名为 `.config` 的配置文件并将其放入您的 `.ebextensions` 目录。一个配置文件定义资源，另一个配置文件定义选项。

1. 将应用程序部署到 Elastic Beanstalk。

   YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。

现在将资源配置文件命名为 `elasticache.config`。要创建 ElastiCache 群集，此示例指定 ElastiCache 群集资源的名称 (`MyElastiCache`)，声明其类型，然后配置群集的属性。该示例引用在此配置文件中创建和定义的安全组资源的 ID。

接下来，我们会创建 EC2 安全组。我们定义此资源的名称，声明其类型，添加描述，并为安全组设置传入规则以便仅允许从 Elastic Beanstalk 安全组 (`AWSEBSecurityGroup`) 中的实例进行访问。（参数名称是 Elastic Beanstalk 提供的固定资源名称。`AWSEBSecurityGroup` 您必须`AWSEBSecurityGroup`向 ElastiCache 安全组添加入口规则，这样您的 Elastic Beanstalk 应用程序才能连接到集群中的实例。） ElastiCache 

EC2 安全组的传入规则还定义缓存节点可以用于接受连接的 IP 协议和端口号。对于 Redis，默认端口号是 `6379`。

```
#This sample requires you to create a separate configuration file that defines the custom option settings for CacheCluster properties.

Resources:
  MyCacheSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "Lock cache down to webserver access only"
      SecurityGroupIngress :
        - IpProtocol : "tcp"
          FromPort :
            Fn::GetOptionSetting:
              OptionName : "CachePort"
              DefaultValue: "6379"
          ToPort :
            Fn::GetOptionSetting:
              OptionName : "CachePort"
              DefaultValue: "6379"
          SourceSecurityGroupName:
            Ref: "AWSEBSecurityGroup"
  MyElastiCache:
    Type: "AWS::ElastiCache::CacheCluster"
    Properties:
      CacheNodeType:
        Fn::GetOptionSetting:
          OptionName : "CacheNodeType"
          DefaultValue : "cache.t2.micro"
      NumCacheNodes:
        Fn::GetOptionSetting:
          OptionName : "NumCacheNodes"
          DefaultValue : "1"
      Engine:
        Fn::GetOptionSetting:
          OptionName : "Engine"
          DefaultValue : "redis"
      VpcSecurityGroupIds:
        -
          Fn::GetAtt:
            - MyCacheSecurityGroup
            - GroupId

Outputs:
  ElastiCache:
    Description : "ID of ElastiCache Cache Cluster with Redis Engine"
    Value :
      Ref : "MyElastiCache"
```

有关此示例配置文件中使用的资源的更多信息，请参阅以下参考：
+ [AWS::ElastiCache::CacheCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html)
+ [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html)

接下来，将选项配置文件命名为 `options.config`，然后定义自定义选项设置。

```
option_settings:
  "aws:elasticbeanstalk:customoption":
    CacheNodeType : cache.t2.micro
    NumCacheNodes : 1
    Engine : redis
    CachePort : 6379
```

这些行告知 Elastic Beanstalk 从配置文件（在我们的示例中为 `options.config`）中的 `CacheNodeType`、`NumCacheNodes`、`Engine` 和 `CachePort` 值获取 `CacheNodeType`、`NumCacheNodes`、`Engine` 和 `CachePort` 属性的值。该文件包含 `aws:elasticbeanstalk:customoption` 节 (在 `option_settings` 下)，其中含有要使用的实际值的名称/值对。在前面的示例中，会对这些值使用 `cache.t2.micro`、`1`、`redis` 和 `6379`。有关 `Fn::GetOptionSetting` 的更多信息，请参阅 [函数](ebextensions-functions.md)。

## EC2-VPC (自定义)


如果您在 EC2-VPC 平台上创建自定义 VPC 并将其指定为 EC2 在其中启动实例的 VPC，则向您的环境中添加 Amazon ElastiCache 集群的过程与默认 VPC 的过程不同。主要区别在于您必须为 ElastiCache 集群创建子网组。此示例中的所有属性是为每种资源类型必须设置的最低要求。

**注意**  
此示例创建了 AWS 资源，您可能需要为此付费。有关 AWS 定价的更多信息，请参阅[https://aws.amazon.com/pricing/](https://aws.amazon.com/pricing/)。有些服务属于 AWS 免费使用套餐的一部分。如果您是新客户，则可免费试用这些服务。请参阅[https://aws.amazon.com/free/](https://aws.amazon.com/free/)了解更多信息。

要使用此示例，请执行下列操作：

1. 在源包的顶级目录中创建 `[.ebextensions](ebextensions.md)` 目录。

1. 创建两个扩展名为 `.config` 的配置文件并将其放入您的 `.ebextensions` 目录。一个配置文件定义资源，另一个配置文件定义选项。

1. 将应用程序部署到 Elastic Beanstalk。

   YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。

现在将资源配置文件命名为 `elasticache.config`。要创建 ElastiCache 群集，此示例指定 ElastiCache 群集资源的名称 (`MyElastiCache`)，声明其类型，然后配置群集的属性。示例中的属性引用了 ElastiCache 集群子网组的名称以及我们在此配置文件中创建和定义的安全组资源的 ID。

接下来，我们会创建 EC2 安全组。我们定义此资源的名称，声明其类型，添加描述和 VPC ID，并为安全组设置传入规则以便仅允许从 Elastic Beanstalk 安全组 (`AWSEBSecurityGroup`) 中的实例进行访问。（参数名称是 Elastic Beanstalk 提供的固定资源名称。`AWSEBSecurityGroup` 您必须`AWSEBSecurityGroup`向 ElastiCache 安全组添加入口规则，这样您的 Elastic Beanstalk 应用程序才能连接到集群中的实例。） ElastiCache 

EC2 安全组的传入规则还定义缓存节点可以用于接受连接的 IP 协议和端口号。对于 Redis，默认端口号是 `6379`。最后，此示例为 ElastiCache 群集创建了一个子网组。我们定义此资源的名称，声明其类型，并在子网组中添加子网的描述和 ID。

**注意**  
我们建议您为 ElastiCache 集群使用私有子网。有关具有私有子网的 VPC 的更多信息，请参阅 [https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html)。

```
#This sample requires you to create a separate configuration file that defines the custom option settings for CacheCluster properties.

Resources:
  MyElastiCache:
    Type: "AWS::ElastiCache::CacheCluster"
    Properties:
      CacheNodeType:
        Fn::GetOptionSetting:
          OptionName : "CacheNodeType"
          DefaultValue : "cache.t2.micro"
      NumCacheNodes:
        Fn::GetOptionSetting:
          OptionName : "NumCacheNodes"
          DefaultValue : "1"
      Engine:
        Fn::GetOptionSetting:
          OptionName : "Engine"
          DefaultValue : "redis"
      CacheSubnetGroupName:
        Ref: "MyCacheSubnets"
      VpcSecurityGroupIds:
        - Ref: "MyCacheSecurityGroup"
  MyCacheSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "Lock cache down to webserver access only"
      VpcId:
        Fn::GetOptionSetting:
          OptionName : "VpcId"
      SecurityGroupIngress :
        - IpProtocol : "tcp"
          FromPort :
            Fn::GetOptionSetting:
              OptionName : "CachePort"
              DefaultValue: "6379"
          ToPort :
            Fn::GetOptionSetting:
              OptionName : "CachePort"
              DefaultValue: "6379"
          SourceSecurityGroupId:
            Ref: "AWSEBSecurityGroup"
  MyCacheSubnets:
    Type: "AWS::ElastiCache::SubnetGroup"
    Properties:
      Description: "Subnets for ElastiCache"
      SubnetIds:
        Fn::GetOptionSetting:
          OptionName : "CacheSubnets"
Outputs:
  ElastiCache:
    Description : "ID of ElastiCache Cache Cluster with Redis Engine"
    Value :
      Ref : "MyElastiCache"
```

有关此示例配置文件中使用的资源的更多信息，请参阅以下参考：
+ [AWS::ElastiCache::CacheCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html)
+ [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html)
+ [AWS::ElastiCache::SubnetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-subnetgroup.html)

接下来，将选项配置文件命名为 `options.config`，然后定义自定义选项设置。

**注意**  
在以下示例中，将示例 `CacheSubnets` 和 `VpcId` 值替换为自己的子网和 VPC。

```
option_settings:
  "aws:elasticbeanstalk:customoption":
    CacheNodeType : cache.t2.micro
    NumCacheNodes : 1
    Engine : redis
    CachePort : 6379
    CacheSubnets:
      - subnet-1a1a1a1a
      - subnet-2b2b2b2b
      - subnet-3c3c3c3c
    VpcId: vpc-4d4d4d4d
```

这些行告知 Elastic Beanstalk 从配置文件（在我们的示例中为 `options.config`）中的 `CacheNodeType`、`NumCacheNodes`、`Engine`、`CachePort`、`CacheSubnets` 和 `VpcId` 值获取 `CacheNodeType`、`NumCacheNodes`、`Engine`、`CachePort`、`CacheSubnets` 和 `VpcId` 属性的值。该文件包含 `aws:elasticbeanstalk:customoption` 节 (在 `option_settings` 下)，其中含有具有示例值的名称/值对。在以上示例中，对这些值使用 `cache.t2.micro`、`1`、`redis`、`6379`、`subnet-1a1a1a1a`、`subnet-2b2b2b2b`、`subnet-3c3c3c3c` 和 `vpc-4d4d4d4d`。有关 `Fn::GetOptionSetting` 的更多信息，请参阅 [函数](ebextensions-functions.md)。

# 示例：SQS CloudWatch、和 SNS


此示例给环境添加 Amazon SQS 队列以及有关队列深度的警报。此示例中显示的属性是必须具备的最低程度的属性，必须为每个资源进行设置。您可以在 [SQS、SNS 和](https://elasticbeanstalk.s3.amazonaws.com/extensions/SNS.config)上下载该示例。 CloudWatch

**注意**  
此示例创建了 AWS 资源，您可能需要为此付费。有关 AWS 定价的更多信息，请参阅[https://aws.amazon.com/pricing/](https://aws.amazon.com/pricing/)。有些服务属于 AWS 免费使用套餐的一部分。如果您是新客户，则可免费试用这些服务。请参阅[https://aws.amazon.com/free/](https://aws.amazon.com/free/)了解更多信息。

要使用此示例，请执行下列操作：

1. 在源包的顶级目录中创建 `[.ebextensions](ebextensions.md)` 目录。

1. 创建两个扩展名为 `.config` 的配置文件并将其放入您的 `.ebextensions` 目录。一个配置文件定义资源，另一个配置文件定义选项。

1. 将应用程序部署到 Elastic Beanstalk。

   YAML 依赖一致的缩进。当替换示例配置文件中的内容时，应匹配缩进级别，并且确保您的文本编辑器使用空格而不是字符来进行缩进。

创建定义资源的配置文件 (例如，sqs.config)。在此示例中，我们创建 SQS 队列并定义 `VisbilityTimeout` 资源中的 `MySQSQueue` 属性。下一步，我们创建 SNS `Topic`，并指定电子邮件在警报激发时发送到 `someone@example.com`。最后，如果队列超过 10 条消息，我们会创建 CloudWatch警报。在 `Dimensions` 属性中，我们指定维度的名称以及代表维度度量的值。我们使用 `Fn::GetAtt` 从 `QueueName` 中返回 `MySQSQueue` 的值。

```
#This sample requires you to create a separate configuration file to define the custom options for the SNS topic and SQS queue.
Resources:
  MySQSQueue:
    Type: AWS::SQS::Queue
    Properties: 
      VisibilityTimeout:
        Fn::GetOptionSetting:
          OptionName: VisibilityTimeout
          DefaultValue: 30
  AlarmTopic:
    Type: AWS::SNS::Topic
    Properties: 
      Subscription:
        - Endpoint:
            Fn::GetOptionSetting:
              OptionName: AlarmEmail
              DefaultValue: "nobody@amazon.com"
          Protocol: email
  QueueDepthAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: "Alarm if queue depth grows beyond 10 messages"
      Namespace: "AWS/SQS"
      MetricName: ApproximateNumberOfMessagesVisible
      Dimensions:
        - Name: QueueName
          Value : { "Fn::GetAtt" : [ "MySQSQueue", "QueueName"] }
      Statistic: Sum
      Period: 300
      EvaluationPeriods: 1
      Threshold: 10
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - Ref: AlarmTopic
      InsufficientDataActions:
        - Ref: AlarmTopic

Outputs :
  QueueURL: 
    Description : "URL of newly created SQS Queue"
    Value : { Ref : "MySQSQueue" }
  QueueARN :
    Description : "ARN of newly created SQS Queue"
    Value : { "Fn::GetAtt" : [ "MySQSQueue", "Arn"]}
  QueueName :
    Description : "Name newly created SQS Queue"
    Value : { "Fn::GetAtt" : [ "MySQSQueue", "QueueName"]}
```

有关此示例配置文件中使用的资源的更多信息，请参阅以下参考：
+ [AWS::SQS::Queue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-queues.html)
+ [AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html)
+ [AWS::CloudWatch::Alarm](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-alarm.html)

创建名为 `options.config` 的单独配置文件，并定义自定义选项设置。

```
option_settings:
  "aws:elasticbeanstalk:customoption":
     VisibilityTimeout : 30
     AlarmEmail : "nobody@example.com"
```

**这些行告诉 Elastic Beanstalk **VisibilityTimeout 从配置文件（我们的示例中**VisibilityTimeout 为 options.config）中获取和**订阅端点属性的值，该**文件包含一个 option\$1settings 部分，其中有一个 aws: elasticbeanstalk: customoption 部分，其中包含包含要使用的实际值的名称-值对。**在以上示例中，这意味着 30 和“nobody@amazon.com”将用于这些值。有关 `Fn::GetOptionSetting` 的更多信息，请参阅 [函数](ebextensions-functions.md)。

# 示例：DynamoDB CloudWatch、和 SNS


此配置文件将 DynamoDB 表设置为使用适用于 PHP 的 SDK 2 的基于 PHP 的应用程序的 AWS 会话处理程序。要使用此示例，您必须拥有 IAM 实例配置文件，该文件会添加到环境中的实例，并用来访问 DynamoDB 表。

 您可以在 [DynamoDB 会话支持示例](https://elasticbeanstalk.s3.amazonaws.com/extensions/PHP-DynamoDB-Session-Support.zip)中下载该示例，我们在本步骤会用到这个示例。此示例包含以下文件：
+ 示例应用程序 `index.php`
+ 一个配置文件`dynamodb.config`，用于创建和配置 DynamoDB 表 AWS 和其他资源，并在 Elastic Beanstalk 环境中托管应用程序的 EC2 实例上安装软件
+ 配置文件 `options.config`，该文件会使用此特定安装的特定设置覆盖 `dynamodb.config` 中的默认设置

**`index.php`**

```
<?php

// Include the SDK using the Composer autoloader
require '../vendor/autoload.php';

use Aws\DynamoDb\DynamoDbClient;

// Grab the session table name and region from the configuration file
list($tableName, $region) = file(__DIR__ . '/../sessiontable');
$tableName = rtrim($tableName);
$region = rtrim($region);

// Create a DynamoDB client and register the table as the session handler
$dynamodb = DynamoDbClient::factory(array('region' => $region));
$handler = $dynamodb->registerSessionHandler(array('table_name' => $tableName, 'hash_key' => 'username'));

// Grab the instance ID so we can display the EC2 instance that services the request
$instanceId = file_get_contents("http://169.254.169.254/latest/meta-data/instance-id");
?>
<h1>Elastic Beanstalk PHP Sessions Sample</h1>
<p>This sample application shows the integration of the Elastic Beanstalk PHP
container and the session support for DynamoDB from the AWS SDK for PHP 2.
Using DynamoDB session support, the application can be scaled out across
multiple web servers. For more details, see the
<a href="https://aws.amazon.com/php/">PHP Developer Center</a>.</p>

<form id="SimpleForm" name="SimpleForm" method="post" action="index.php">
<?php
echo 'Request serviced from instance ' . $instanceId . '<br/>';
echo '<br/>';

if (isset($_POST['continue'])) {
  session_start();
  $_SESSION['visits'] = $_SESSION['visits'] + 1;
  echo 'Welcome back ' . $_SESSION['username'] . '<br/>';
  echo 'This is visit number ' . $_SESSION['visits'] . '<br/>';
  session_write_close();
  echo '<br/>';
  echo '<input type="Submit" value="Refresh" name="continue" id="continue"/>';
  echo '<input type="Submit" value="Delete Session" name="killsession" id="killsession"/>';
} elseif (isset($_POST['killsession'])) {
  session_start();
  echo 'Goodbye ' . $_SESSION['username'] . '<br/>';
  session_destroy();
  echo 'Username: <input type="text" name="username" id="username" size="30"/><br/>';
  echo '<br/>';
  echo '<input type="Submit" value="New Session" name="newsession" id="newsession"/>';
} elseif (isset($_POST['newsession'])) {
  session_start();
  $_SESSION['username'] = $_POST['username'];
  $_SESSION['visits'] = 1;
  echo 'Welcome to a new session ' . $_SESSION['username'] . '<br/>';
  session_write_close();
  echo '<br/>';
  echo '<input type="Submit" value="Refresh" name="continue" id="continue"/>';
  echo '<input type="Submit" value="Delete Session" name="killsession" id="killsession"/>';
} else {
  echo 'To get started, enter a username.<br/>';
  echo '<br/>';
  echo 'Username: <input type="text" name="username" id="username" size="30"/><br/>';
  echo '<input type="Submit" value="New Session" name="newsession" id="newsession"/>';
}
?>
</form>
```

**`.ebextensions/dynamodb.config`**

```
Resources:
  SessionTable:
    Type: AWS::DynamoDB::Table
    Properties:
      KeySchema: 
        HashKeyElement:
          AttributeName:
            Fn::GetOptionSetting:
              OptionName : SessionHashKeyName
              DefaultValue: "username"
          AttributeType:
            Fn::GetOptionSetting:
              OptionName : SessionHashKeyType
              DefaultValue: "S"
      ProvisionedThroughput:
        ReadCapacityUnits:
          Fn::GetOptionSetting:
            OptionName : SessionReadCapacityUnits
            DefaultValue: 1
        WriteCapacityUnits:
          Fn::GetOptionSetting:
            OptionName : SessionWriteCapacityUnits
            DefaultValue: 1

  SessionWriteCapacityUnitsLimit:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: { "Fn::Join" : ["", [{ "Ref" : "AWSEBEnvironmentName" }, " write capacity limit on the session table." ]]}
      Namespace: "AWS/DynamoDB"
      MetricName: ConsumedWriteCapacityUnits
      Dimensions:
        - Name: TableName
          Value: { "Ref" : "SessionTable" }
      Statistic: Sum
      Period: 300
      EvaluationPeriods: 12
      Threshold:
          Fn::GetOptionSetting:
            OptionName : SessionWriteCapacityUnitsAlarmThreshold
            DefaultValue: 240
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - Ref: SessionAlarmTopic
      InsufficientDataActions:
        - Ref: SessionAlarmTopic

  SessionReadCapacityUnitsLimit:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: { "Fn::Join" : ["", [{ "Ref" : "AWSEBEnvironmentName" }, " read capacity limit on the session table." ]]}
      Namespace: "AWS/DynamoDB"
      MetricName: ConsumedReadCapacityUnits
      Dimensions:
        - Name: TableName
          Value: { "Ref" : "SessionTable" }
      Statistic: Sum
      Period: 300
      EvaluationPeriods: 12
      Threshold:
          Fn::GetOptionSetting:
            OptionName : SessionReadCapacityUnitsAlarmThreshold
            DefaultValue: 240
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - Ref: SessionAlarmTopic
      InsufficientDataActions:
        - Ref: SessionAlarmTopic

  SessionThrottledRequestsAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: { "Fn::Join" : ["", [{ "Ref" : "AWSEBEnvironmentName" }, ": requests are being throttled." ]]}
      Namespace: AWS/DynamoDB
      MetricName: ThrottledRequests
      Dimensions:
        - Name: TableName
          Value: { "Ref" : "SessionTable" }
      Statistic: Sum
      Period: 300
      EvaluationPeriods: 1
      Threshold: 
        Fn::GetOptionSetting:
          OptionName: SessionThrottledRequestsThreshold
          DefaultValue: 1
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - Ref: SessionAlarmTopic
      InsufficientDataActions:
        - Ref: SessionAlarmTopic

  SessionAlarmTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint:
            Fn::GetOptionSetting:
              OptionName: SessionAlarmEmail
              DefaultValue: "nobody@amazon.com"
          Protocol: email

files:
  "/var/app/sessiontable":
    mode: "000444"
    content: |
      `{"Ref" : "SessionTable"}`
      `{"Ref" : "AWS::Region"}`

  "/var/app/composer.json":
    mode: "000744"
    content:
      {
        "require": {
           "aws/aws-sdk-php": "*"
        }
      }

container_commands:
 "1-install-composer":
   command: "cd /var/app; curl -s http://getcomposer.org/installer | php"
 "2-install-dependencies":
   command: "cd /var/app; php composer.phar install"
 "3-cleanup-composer":
   command: "rm -Rf /var/app/composer.*"
```

在示例配置文件中，我们首先创建 DynamoDB 表，并配置该表的主密钥结构和容量单位，以便分配足够的资源提供所要求的吞吐量。接下来，我们为`WriteCapacity`和创建 CloudWatch 警报`ReadCapacity`。我们会创建 SNS 主题，该主题会在警报阈值被突破时将电子邮件发送到“nobody@amazon.com”。

在我们为环境创建和配置 AWS 资源之后，我们需要自定义 EC2 实例。我们使用`files`密钥将 DynamoDB 表的详细信息传递给我们环境中的 EC2 实例，并在文件中`composer.json`为适用于 AWS PHP 的 SDK 2 添加一个 “要求”。最后，我们会运行容器命令安装编辑器和必需的依赖项，然后删除安装程序。

**`.ebextensions/options.config`**

```
option_settings:
  "aws:elasticbeanstalk:customoption":
     SessionHashKeyName                      : username
     SessionHashKeyType                      : S
     SessionReadCapacityUnits                : 1
     SessionReadCapacityUnitsAlarmThreshold  : 240
     SessionWriteCapacityUnits               : 1 
     SessionWriteCapacityUnitsAlarmThreshold : 240
     SessionThrottledRequestsThreshold       : 1
     SessionAlarmEmail                       : me@example.com
```

将该 SessionAlarmEmail 值替换为您想要发送警报通知的电子邮件。`options.config` 文件包含 `dynamodb.config` 中用于定义的部分变量的值。例如，`dynamodb.config` 包含以下行：

```
Subscription:
  - Endpoint:
      Fn::GetOptionSetting:
        OptionName: SessionAlarmEmail
        DefaultValue: "nobody@amazon.com"
```

****这些行告诉 Elastic Beanstalk **SessionAlarmEmail**从配置`options.config`文件（在我们的示例应用程序中）中的值中获取 Endpoint 属性的值，该文件包含一个 option\$1settings 部分，其中有一个 aws: elasticbeanstalk: customoption 部分，其中包含包含要使用的实际值的名称-值对。****在上面的示例中，这意味着**SessionAlarmEmail**将分配该值`nobody@amazon.com`。

有关本示例中使用的 CloudFormation 资源的更多信息，请参阅以下参考资料：
+ [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html)
+ [AWS::CloudWatch::Alarm](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-alarm.html)
+ [AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html)