

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

# 控制自动扩缩组中 Amazon EC2 启动模板的使用情况
<a name="ec2-auto-scaling-launch-template-permissions"></a>

Amazon EC2 Auto Scaling 支持将 Amazon EC2 启动模板与您的 Auto Scaling 组一起使用。我们建议您允许用户从启动模板创建 Auto Scaling 组，因为这样做允许用户使用 Amazon EC2 Auto Scaling 和 Amazon EC2 的最新功能。例如，用户必须指定启动模板才能使用[混合实例策略](https://docs.amazonaws.cn/autoscaling/ec2/APIReference/API_MixedInstancesPolicy.html)。

您可以使用 `AmazonEC2FullAccess` 策略授予用户使用其账户中的 Amazon EC2 Auto Scaling 资源、启动模板和其他 EC2 资源的完全权限。或者，您可以创建自己的自定义 IAM policy，为用户授予使用启动模板的精细访问权限，如本主题所述。

**您可以为自己使用量身定制的示例策略**

下面显示您可以为自身使用量身定制的基础权限策略示例。此策略授予创建、更新和删除所有自动扩缩组的权限，但仅限于组使用标签 `purpose=testing` 时。然后，它授予所有 `Describe` 操作的权限。由于 `Describe` 操作不支持资源级权限，因此，您必须在不带条件的单独语句中必须指定它们。

具有此策略的 IAM 身份（用户或角色）有权使用启动模板创建或更新自动扩缩组，因为他们还有权使用 `ec2:RunInstances` 操作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
          {
            "Effect": "Allow",
            "Action": [
                "autoscaling:CreateAutoScalingGroup",
                "autoscaling:UpdateAutoScalingGroup",
                "autoscaling:DeleteAutoScalingGroup"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": { "autoscaling:ResourceTag/purpose": "testing" }
            }
         },
         {
            "Effect": "Allow",
            "Action": [
                "autoscaling:Describe*",
                "ec2:RunInstances"
            ],
            "Resource": "*"
        }
    ]
}
```

------

创建或更新自动扩缩组的用户可能需要一些相关权限，例如：
+ **ec2: CreateTags** — 要在创建时向实例和卷添加标签，用户必须拥有 IAM 策略中的`ec2:CreateTags`权限。有关更多信息，请参阅 [标记实例和卷所需的权限](#policy-example-launch-template-createtags)。
+ ia PassRole m**:** — 要从包含实例配置文件（IAM 角色的容器）的启动模板启动 EC2 实例，用户还必须拥有 IAM 策略中的`iam:PassRole`权限。有关更多信息和示例 IAM policy，请参阅 [在 Amazon EC2 实例上运行的应用程序的 IAM 角色](us-iam-role.md)。
+ **ssm: GetParameters** — 要从使用 Amazon Systems Manager 参数的启动模板启动 EC2 实例，用户还必须拥有 IAM 策略中的`ssm:GetParameters`权限。有关更多信息，请参阅 [IDs 在启动模板中使用 Amazon Systems Manager 参数而不是 AMI](using-systems-manager-parameters.md)。

当用户与自动扩缩组交互时，会检查启动实例时要完成的操作的这些权限。有关更多信息，请参阅 [`ec2:RunInstances` 和 `iam:PassRole` 的权限验证](#runinstances-permissions-validation)。

以下示例显示了您可用于控制 IAM 用户使用启动模板时具有的权限的策略语句。

**Topics**
+ [需要具有特定标签的启动模板](#policy-example-launch-template-ex1)
+ [需要启动模板和版本号](#policy-example-launch-template-ex2)
+ [需要使用实例元数据服务版本 2 (IMDSv2)](#instance-metadata-requireIMDSv2)
+ [限制对 Amazon EC2 资源的访问](#policy-example-launch-template-ex4)
+ [标记实例和卷所需的权限](#policy-example-launch-template-createtags)
+ [其他启动模板权限](#policy-launch-template-additional-permissions)
+ [`ec2:RunInstances` 和 `iam:PassRole` 的权限验证](#runinstances-permissions-validation)
+ [相关资源](#launch-template-permissions-related-resources)

## 需要具有特定标签的启动模板
<a name="policy-example-launch-template-ex1"></a>

在授予`ec2:RunInstances`权限时，您可以指定用户在启动带有启动模板的实例时只能使用带有特定标签的启动模板或特定于 IDs 限制权限的启动模板。您还可以通过指定 `RunInstances` 调用的其他资源级权限，控制 AMI 和使用启动模板的任何人都可以在启动实例时引用和使用的其他资源。

以下示例限制了针对 `ec2:RunInstances` 操作的权限，该操作可用于启动位于指定区域中且具有标签 `purpose=testing` 的模板。它还允许用户访问启动模板中指定的资源：实例类型 AMIs、卷、密钥对、网络接口和安全组。

有关在启动模板中使用基于标签的策略的更多信息，请参阅《Amazon EC2 用户指南》**中的[使用 IAM 权限控制启动模板的访问权限](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/permissions-for-launch-templates.html)。

## 需要启动模板和版本号
<a name="policy-example-launch-template-ex2"></a>

您还可以使用 IAM 权限强制要求在创建或更新自动扩缩组时必须指定启动模板和启动模板的版本号。

以下示例仅在指定启动模板和启动模板版本号时才允许用户创建和更新自动扩缩组。如果具有此策略的用户忽略版本号以指定 `$Latest` 或 `$Default` 启动模板版本，或者改为尝试使用启动配置，操作将失败。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:CreateAutoScalingGroup",
                "autoscaling:UpdateAutoScalingGroup"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": { "autoscaling:LaunchTemplateVersionSpecified": "true" }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "autoscaling:CreateAutoScalingGroup",
                "autoscaling:UpdateAutoScalingGroup"
            ],
            "Resource": "*",
            "Condition": {
                "Null": { "autoscaling:LaunchConfigurationName": "false" }
            }
        }
    ]
}
```

------

## 需要使用实例元数据服务版本 2 (IMDSv2)
<a name="instance-metadata-requireIMDSv2"></a>

为了提高安全性，您可以将用户的权限设置为要求使用所需的启动模板 IMDSv2。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[配置实例元数据服务](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。

以下示例指定，除非该实例也被选中要求使用 IMDSv2 （由指示`"ec2:MetadataHttpTokens":"required"`），否则用户无法调用`ec2:RunInstances`操作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RequireImdsV2",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringNotEquals": { "ec2:MetadataHttpTokens": "required" }
            }
        }
    ]
}
```

------

**提示**  
要强制替换 Auto Scaling 使用新启动模板或配置了实例元数据选项的启动模板的新版本启动模板启动，您可以启动实例刷新。有关更多信息，请参阅 [更新自动扩缩实例](update-auto-scaling-group.md#update-auto-scaling-instances)。

## 限制对 Amazon EC2 资源的访问
<a name="policy-example-launch-template-ex4"></a>

以下示例显示如何使用资源级权限和标记的资源，限制对 Amazon EC2 资源的访问。

**例 1：将 Amazon EC2 实例的启动限制为特定的资源和实例类型**  
以下示例通过限制对 Amazon EC2 资源的访问来控制用户可以启动的实例的配置。要为启动模板中指定的资源指定资源级权限，必须在 `RunInstances` 操作语句中包含这些资源。

在此示例中，有两个语句：
+ 第一条语句要求用户使用特定安全组 (`subnet-1a2b3c4d`) 并使用特定 AMI (`sg-903004f88example`) 将实例启动到特定子网 (`ami-04d5cc9b88example`) 中。它还允许用户访问启动模板中指定的资源：网络接口、密钥对和卷。
+ 第二个语句仅允许用户使用 `t2.micro` 和 `t2.small` 实例类型启动实例，您可以通过此操作控制成本。

  但请注意，目前尚无有效的方法可以完全阻止有权使用启动模板启动实例的用户启动其他实例类型。这是因为可以覆盖启动模板中指定的实例类型，以使用通过基于属性的实例类型选择进行定义的实例类型。

有关您可用于控制用户可以启动实例配置的资源级权限的完整列表，请参阅*服务授权参考*中的 [Amazon EC2 的操作、资源和条件键](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazonec2.html)。

**例 2：在 Amazon EC2 实例启动时要求提供标签并限制对资源的访问**  
以下示例策略显示如何在基于身份的策略中使用条件，以便基于标签控制对 Amazon EC2 资源的访问权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "InstanceTags",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1:555555555555:instance/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/owner": "dev"
                }
            }
        },
        {
            "Sid": "InstanceBoundaries",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1::image/*",
                "arn:aws:ec2:us-east-1:555555555555:subnet/*",
                "arn:aws:ec2:us-east-1:555555555555:network-interface/*"
            ]
        },
        {
            "Sid": "InstanceResourceTags",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1:555555555555:key-pair/*",
                "arn:aws:ec2:us-east-1:555555555555:security-group/*",
                "arn:aws:ec2:us-east-1:555555555555:launch-template/*",
                "arn:aws:ec2:us-east-1:555555555555:volume/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/purpose": "testing"
                }
            }
        }
    ]
}
```

------

在此示例中，有三个语句：
+ 在第一个语句中，只有在请求中使用带 `owner=dev` 的标签时，才允许用户在指定区域启动实例。
+ 在第二个语句中，用户可以访问指定区域的 AMI、子网和网络接口。
+ 在第三个语句中，用户可以使用带有标签 `purpose=testing` 的现有密钥对、安全组、启动模板和卷在指定区域启动实例。

有关更多信息，请参阅 *IAM 用户指南*中的[使用标签控制对 Amazon 资源的访问权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html)。

## 标记实例和卷所需的权限
<a name="policy-example-launch-template-createtags"></a>

以下示例允许用户在创建时标记实例和卷。如果在启动模板中指定了标签，则需要此策略。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[在创建过程中授予标记资源的权限](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/supported-iam-actions-tagging.html)。

## 其他启动模板权限
<a name="policy-launch-template-additional-permissions"></a>

您必须向控制台用户授予对 `ec2:DescribeLaunchTemplates` 和 `ec2:DescribeLaunchTemplateVersions` 操作的权限。如果没有这些权限，则无法在 Auto Scaling 组向导中加载启动模板数据，并且用户无法逐步通过向导使用启动模板启动实例。您可以在 IAM policy 语句的 `Action` 元素中指定这些其他操作。

## `ec2:RunInstances` 和 `iam:PassRole` 的权限验证
<a name="runinstances-permissions-validation"></a>

用户可以指定其自动扩缩组使用的启动模板版本。根据其权限，这可以是特定的编号版本，也可以是启动模板的 `$Latest` 或 `$Default` 版本。如果是后者，请特别小心。这可能会覆盖您打算限制的 `ec2:RunInstances` 和 `iam:PassRole` 的权限。

本节介绍在自动扩缩组中使用最新或默认版本的启动模板的场景。

当用户调用`CreateAutoScalingGroup`、`UpdateAutoScalingGroup` 或 `StartInstanceRefresh` API 时，Amazon EC2 Auto Scaling 会在继续处理请求之前，根据当时最新或默认版本的启动模板版本检查其权限。这将验证启动实例时要完成的操作的权限，例如 `ec2:RunInstances` 和 `iam:PassRole` 操作。为此，我们发出 Amazon [RunInstances](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/API_RunInstances.html)EC2 试运行调用，以验证用户是否具有执行该操作所需的权限，而无需实际提出请求。返回响应时，Amazon EC2 Auto Scaling 会读取该响应。如果用户的权限不允许指定的操作，则 Amazon EC2 Auto Scaling 将使请求失败，并将错误返回给用户，其中包含有关缺少权限的信息。

初始验证和请求完成后，每当实例启动时，Amazon EC2 Auto Scaling 都会使用其[服务相关角色](autoscaling-service-linked-role.md#service-linked-role-permissions)的权限以最新或默认版本启动这些实例，即使实例已更改。这意味着即使启动模板的使用用户没有 `iam:PassRole` 权限，也可以更新启动模板以将 IAM 角色传递给实例。

如果您想限制谁有权访问配置群组以使用 `$Latest` 或 `$Default` 版本，请使用 `autoscaling:LaunchTemplateVersionSpecified` 条件键。这样可以确保 Auto Scaling 组仅在用户调用`CreateAutoScalingGroup`和时接受特定的编号版本`UpdateAutoScalingGroup` APIs。有关展示如何将此条件密钥添加到 IAM policy 的示例，请参阅 [需要启动模板和版本号](#policy-example-launch-template-ex2)。

对于配置为使用`$Latest`或`$Default`启动模板版本的自动扩缩组，请考虑限制谁可以创建和管理启动模板的版本，包括允许用户指定默认启动模板版本的`ec2:ModifyLaunchTemplate`操作。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[控制版本控制权限](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/permissions-for-launch-templates.html#permissions-for-launch-template-versions)。

## 相关资源
<a name="launch-template-permissions-related-resources"></a>

要详细了解查看、创建和删除启动模板以及启动模板版本的权限，请参阅《Amazon EC2 用户指南》**中的[使用 IAM 权限控制启动模板的访问权限](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/permissions-for-launch-templates.html)。

有关可用于控制调用访问 `RunInstances` 的资源级权限的更多信息，请参阅*服务授权参考*中的 [Amazon EC2 的操作、资源和条件键](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazonec2.html)。