

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

# 创建和更新 Elastic Beanstalk 环境组
<a name="environment-mgmt-compose"></a>

借助 Amazon Elastic Beanstalk [ComposeEnvironments](https://docs.amazonaws.cn/elasticbeanstalk/latest/api/API_ComposeEnvironments.html)API，您可以在单个应用程序中创建和更新 Elastic Beanstalk 环境组。组中的每个环境都可以运行服务导向型架构应用程序的一个独立组件。`Compose Environments` API 使用一个应用程序版本列表和一个可选组名。Elastic Beanstalk 为每个应用程序版本创建一个环境，如果环境已经存在，则将应用程序版本部署到相应环境。

在 Elastic Beanstalk 环境之间创建链接，将一个环境指定为另一个环境的依赖项。当您使用 `Compose Environments` API 创建一组环境时，Elastic Beanstalk 仅在依赖关系启动并运行之后才会创建依赖环境。有关环境链接的更多信息，请参阅[在 Elastic Beanstalk 环境之间创建链接](environment-cfg-links.md)。

`Compose Environments` API 使用[环境清单](environment-cfg-manifest.md)存储由各个环境组共享的配置详细信息。每个组件应用程序在其应用程序源包中都必须有一个 `env.yaml` 配置文件，用于指定创建它的环境时所使用的参数。

`Compose Environments` 要求在每个组件应用程序的环境清单中指定 `EnvironmentName` 和 `SolutionStack`。

您可以将 `Compose Environments` API 与 Elastic Beanstalk 命令行接口 (EB CLI) Amazon CLI、或 SDK 一起使用。有关 EB CLI 说明，请参阅[使用 EB CLI 以组的形式管理多个 Elastic Beanstalk 环境](ebcli-compose.md)。

## 使用 `Compose Environments` API
<a name="environment-mgmt-compose-example"></a>

例如，您可以创建一个名为 `Media Library` 的应用程序，让用户通过它上传和管理 Amazon Simple Storage Service (Amazon S3) 中存储的图像和视频。该应用程序的前端环境 `front` 运行一个 Web 应用程序，用户可通过该 Web 应用程序上传和下载各个文件、查看库和启动批处理作业。

前端应用程序不直接处理作业，而是将作业添加到 Amazon SQS 队列中。第二个环境 `worker` 从队列中提取作业并进行处理。`worker` 使用一个具有高性能 GPU 的 G2 实例类型，而 `front` 可以在更为经济实用的通用实例类型上运行。

您可以通过组织项目文件夹 `Media Library` 为每个组件使用单独的目录，每个目录各在一个环境定义文件 (`env.yaml`) 中包含相应组件的源代码：

```
~/workspace/media-library
|-- front
|   `-- env.yaml
`-- worker
    `-- env.yaml
```

以下列表显示了各个组件应用程序的 `env.yaml` 文件。

**`~/workspace/media-library/front/env.yaml`**

```
EnvironmentName: front+
EnvironmentLinks:
  "WORKERQUEUE" : "worker+"
AWSConfigurationTemplateVersion: 1.1.0.0
EnvironmentTier: 
  Name: WebServer
  Type: Standard
SolutionStack: 64bit Amazon Linux 2015.09 v2.0.4 running Java 8
OptionSettings:
  aws:autoscaling:launchconfiguration:
    InstanceType: m4.large
```

**`~/workspace/media-library/worker/env.yaml`**

```
EnvironmentName: worker+
AWSConfigurationTemplateVersion: 1.1.0.0
EnvironmentTier:
  Name: Worker
  Type: SQS/HTTP
SolutionStack: 64bit Amazon Linux 2015.09 v2.0.4 running Java 8
OptionSettings:
  aws:autoscaling:launchconfiguration:
    InstanceType: g2.2xlarge
```

在为前端 (`front-v1`) 和工作程序 (`worker-v1`) 应用程序组件[创建应用程序版本](applications-versions.md)后，您可以使用版本名调用 `Compose Environments` API。在本例中，我们使用 Amazon CLI 调用该 API。

```
# Create application versions for each component: 
~$ aws elasticbeanstalk create-application-version --application-name media-library --version-label front-v1 --process --source-bundle S3Bucket="amzn-s3-demo-bucket",S3Key="front-v1.zip"
  {
    "ApplicationVersion": {
        "ApplicationName": "media-library",
        "VersionLabel": "front-v1",
        "Description": "",
        "DateCreated": "2015-11-03T23:01:25.412Z",
        "DateUpdated": "2015-11-03T23:01:25.412Z",
        "SourceBundle": {
            "S3Bucket": "amzn-s3-demo-bucket",
            "S3Key": "front-v1.zip"
        }
    }
  }
~$ aws elasticbeanstalk create-application-version --application-name media-library --version-label worker-v1 --process --source-bundle S3Bucket="amzn-s3-demo-bucket",S3Key="worker-v1.zip"
  {
    "ApplicationVersion": {
        "ApplicationName": "media-library",
        "VersionLabel": "worker-v1",
        "Description": "",
        "DateCreated": "2015-11-03T23:01:48.151Z",
        "DateUpdated": "2015-11-03T23:01:48.151Z",
        "SourceBundle": {
            "S3Bucket": "amzn-s3-demo-bucket",
            "S3Key": "worker-v1.zip"
        }
    }
  }
# Create environments:
~$ aws elasticbeanstalk compose-environments --application-name media-library --group-name dev --version-labels front-v1 worker-v1
```

第三个调用创建两个环境：`front-dev` 和 `worker-dev`。该 API 通过将 `EnvironmentName` 文件中指定的 `env.yaml` 与 `group name` 调用中指定的 `Compose Environments` 选项用连字符连接起来创建环境名。这两个选项加连字符的总长度不得超过 23 个字符的环境名最大长度限制。

在 `front-dev` 环境中运行的应用程序可以通过读取 `worker-dev` 变量来访问附加到 `WORKERQUEUE` 环境的 Amazon SQS 队列的名称。有关环境链接的更多信息，请参阅[在 Elastic Beanstalk 环境之间创建链接](environment-cfg-links.md)。