

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

# 添加和自定义 Elastic Beanstalk 环境资源
<a name="environment-resources"></a>

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

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

**注意**  
每当您添加不由 Elastic Beanstalk 管理的资源时，请务必为您的 (IAM) 用户添加具有相应权限 Amazon 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.amazonaws.cn/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 资源类型的 Amazon CloudFormation 用户指南主题](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html#d0e62250)中找到。