用于控制访问 Amazon EC2 API 的示例策略 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

用于控制访问 Amazon EC2 API 的示例策略

您可以使用 IAM 策略向用户授予使用 Amazon EC2 所需的权限。有关分步说明,请参阅《IAM 用户指南》中的创建 IAM 策略

以下示例显示了您可用于向用户授予使用 Amazon EC2 的权限的策略语句。这些策略设计用于采用 Amazon CLI 或 Amazon SDK 发出的请求。在以下示例中,将每个 user input placeholder 替换为您自己的信息。

有关用于 Amazon EC2 控制台的策略示例,请参阅 用于控制对 Amazon EC2 控制台的访问的示例策略

示例:只读访问权限

以下策略为用户授予使用名称以 Describe 开头的所有 Amazon EC2 API 操作的权限。Resource 元素使用通配符表示用户可以通过这些 API 操作指定所有资源。在 API 操作不支持资源级权限的情况下,也需要 * 通配符。有关哪些 ARN 可用于哪些 Amazon EC2 API 操作的更多信息,请参阅 Amazon EC2 的操作、资源和条件键

用户无权对资源执行任何操作 (除非其他语句为用户授予执行此操作的权限),因为在默认情况下会对用户拒绝使用 API 操作的权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" } ] }

示例:限制对特定区域的访问权限

以下策略拒绝用户使用所有 Amazon EC2 API 操作的权限,除非区域为欧洲(法兰克福)。该区域使用全局条件键 aws:RequestedRegion,所有 Amazon EC2 API 操作均支持此条件键。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:*", "Resource": "*", "Condition": { "StringNotEquals": { "aws:RequestedRegion": "eu-central-1" } } } ] }

或者,您也可以使用条件键 ec2:Region,此条件键是 Amazon EC2 特定的,所有 Amazon EC2 API 操作均支持它。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:*", "Resource": "*", "Condition": { "StringNotEquals": { "ec2:Region": "eu-central-1" } } } ] }

使用实例

示例:描述、启动、停止和终止所有实例

以下策略为用户授予使用 Action 元素中指定的 API 操作的权限。Resource 元素使用 * 通配符表示用户可以通过这些 API 操作指定所有资源。在 API 操作不支持资源级权限的情况下,也需要 * 通配符。有关哪些 ARN 可用于哪些 Amazon EC2 API 操作的更多信息,请参阅 Amazon EC2 的操作、资源和条件键

用户无权使用任何其他 API 操作 (除非其他语句允许用户执行此操作),因为用户在默认情况下没有使用 API 操作的权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeImages", "ec2:DescribeKeyPairs", "ec2:DescribeSecurityGroups", "ec2:DescribeAvailabilityZones", "ec2:RunInstances", "ec2:TerminateInstances", "ec2:StopInstances", "ec2:StartInstances" ], "Resource": "*" } ] }

示例:描述所有实例,以及仅停止、启动和终止特定实例

以下策略允许用户描述所有实例,但只能启动和停止实例 i-1234567890abcdef0 和 i-0598c7d356eba48d7,且只能终止在 美国东部(弗吉尼亚北部)地区 (us-east-1) 中具有“purpose=test”资源标签的实例。

第一条语句为 Resource 元素使用 * 通配符以指示用户可以在操作中指定所有资源;在本例中,用户可以列出所有实例。在 API 操作不支持资源级权限的情况下 (在此情况下,为 ec2:DescribeInstances),也需要 * 通配符。有关哪些 ARN 可用于哪些 Amazon EC2 API 操作的更多信息,请参阅 Amazon EC2 的操作、资源和条件键

第二条语句为 StopInstancesStartInstances 操作使用资源级权限。特定实例在 Resource 元素中通过其 ARN 进行指示。

第三条语句允许用户终止在美国东部(弗吉尼亚北部)区域(us-east-1)中属于指定 Amazon 账户的所有实例(但仅在实例具有 "purpose=test" 标签的情况下)。当策略语句生效时,Condition 元素具备资格。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:DescribeInstances", "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:StopInstances", "ec2:StartInstances" ], "Resource": [ "arn:aws:ec2:us-east-1:account-id:instance/i-1234567890abcdef0", "arn:aws:ec2:us-east-1:account-id:instance/i-0598c7d356eba48d7" ] }, { "Effect": "Allow", "Action": "ec2:TerminateInstances", "Resource": "arn:aws:ec2:us-east-1:account-id:instance/*", "Condition": { "StringEquals": { "aws:ResourceTag/purpose": "test" } } } ] }

启动实例 (RunInstances)

RunInstances API 操作可启动一个或多个按需实例或一个或多个 Spot 实例。RunInstances 需要 AMI 并创建实例。用户可以在请求中指定键对和安全组。启动到 VPC 中需要子网,会创建网络接口。从 Amazon EBS-backed AMI 启动将创建卷。因此,用户必须具有使用这些 Amazon EC2 资源的权限。您可以创建要求用户对 RunInstances 指定可选参数或限制用户针对某个参数使用特定值的策略语句。

有关启动实例所需的资源级权限的更多信息,请参阅 Amazon EC2 的操作、资源和条件键

默认情况下,用户没有描述、启动、停止或终止生成的实例的权限。授予用户管理所生成实例的权限的一种方法是:为每个实例创建一个特定标签,然后创建一个允许用户使用该标签管理实例的语句。有关更多信息,请参阅 使用实例

AMI

以下策略仅允许用户使用指定的 AMI、ami-9e1670f7ami-45cf5c3c 启动实例。用户无法使用其他 AMI 启动实例(除非其他语句允许用户执行此操作)。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-9e1670f7", "arn:aws:ec2:region::image/ami-45cf5c3c", "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*" ] } ] }

另外,以下策略允许用户从 Amazon 或某些受信任和经过验证的合作伙伴拥有的所有 AMI 启动实例。第一个语句的 Condition 元素测试 ec2:Owner 是不是 amazon。用户无法使用其他 AMI 启动实例(除非其他语句允许用户执行此操作)。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-*" ], "Condition": { "StringEquals": { "ec2:Owner": "amazon" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

实例类型

以下策略仅允许用户使用 t2.microt2.small 实例类型启动实例,您也可以通过此操作控制成本。用户无法启动更大的实例,因为第一条语句的 Condition 元素会测试 ec2:InstanceType 是否是 t2.microt2.small

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:instance/*" ], "Condition": { "StringEquals": { "ec2:InstanceType": ["t2.micro", "t2.small"] } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

或者,您也可以创建一个策略,以拒绝用户启动 t2.microt2.small 实例类型之外的任何实例的权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:instance/*" ], "Condition": { "StringNotEquals": { "ec2:InstanceType": ["t2.micro", "t2.small"] } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

子网

以下策略仅允许用户使用指定子网 subnet-12345678 启动实例。组无法将实例启动到任何其他子网中 (除非其他语句授予执行此操作的用户权限)。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:subnet/subnet-12345678", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region::image/ami-*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

或者,您也可以创建一个策略,以拒绝用户将实例启动到任何其他子网的权限。该语句通过拒绝创建网络接口的权限来执行此操作,除非指定了子网 subnet-12345678。此拒绝会覆盖创建的任何其他策略以允许将实例启动到其他子网中。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region:account-id:network-interface/*" ], "Condition": { "ArnNotEquals": { "ec2:Subnet": "arn:aws:ec2:region:account-id:subnet/subnet-12345678" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region::image/ami-*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:instance/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:key-pair/*", "arn:aws:ec2:region:account-id:security-group/*" ] } ] }

EBS 卷

仅当实例的 EBS 卷为加密卷时,下面的策略才允许用户启动实例。用户必须从使用加密快照创建的 AMI 启动实例,以确保根卷是加密的。此外,用户在启动期间附加到此实例的任何其他卷也必须是加密的。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*:*:volume/*" ], "Condition": { "Bool": { "ec2:Encrypted": "true" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*::image/ami-*", "arn:aws:ec2:*:*:network-interface/*", "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:subnet/*", "arn:aws:ec2:*:*:key-pair/*", "arn:aws:ec2:*:*:security-group/*" ] } ] }

标签

在创建时标记实例

下面的策略允许用户启动实例并在创建期间标记实例。对于应用标签的资源创建操作,用户必须具有使用 CreateTags 操作的权限。第二个语句使用 ec2:CreateAction 条件键使用户只能在 RunInstances 上下文中且只能为实例创建标签。用户无法标记现有资源,并且用户无法使用 RunInstances 请求标记卷。

有关更多信息,请参阅 在创建过程中授予标记 Amazon EC2 资源的权限

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:us-east-1:account-id:instance/*", "Condition": { "StringEquals": { "ec2:CreateAction" : "RunInstances" } } } ] }

在创建时使用特定标签标记实例和卷

下面的策略包含 aws:RequestTag 条件键,该条件键要求用户标记使用标签 RunInstancesenvironment=production 通过 purpose=webserver 创建的任何卷。如果用户不传递这些特定标签,或者根本不指定任何标签,则请求失败。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:region::image/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:security-group/*", "arn:aws:ec2:region:account-id:key-pair/*" ] }, { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:instance/*" ], "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" , "aws:RequestTag/purpose": "webserver" } } }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "ec2:CreateAction" : "RunInstances" } } } ] }

在创建时使用至少一个特定标记标记实例和卷

下面的策略对 ForAnyValue 条件使用了 aws:TagKeys 修饰符,以指示必须在请求中指定至少一个标签,并且其必须包含键 environmentwebserver。标签必须应用于实例及卷。可以在请求中指定任何标签值。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:region::image/*", "arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*", "arn:aws:ec2:region:account-id:security-group/*", "arn:aws:ec2:region:account-id:key-pair/*" ] }, { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:region:account-id:volume/*", "arn:aws:ec2:region:account-id:instance/*" ], "Condition": { "ForAnyValue:StringEquals": { "aws:TagKeys": ["environment","webserver"] } } }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "ec2:CreateAction" : "RunInstances" } } } ] }

如果在创建时标记实例,则必须使用特定标签标记它们

在下面的策略中,用户不必在请求中指定标签,但如果用户指定标签,则标签必须为 purpose=test。不允许使用任何其他标签。用户可以在 RunInstances 请求中向任何可标记资源应用标签。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "aws:RequestTag/purpose": "test", "ec2:CreateAction" : "RunInstances" }, "ForAllValues:StringEquals": { "aws:TagKeys": "purpose" } } } ] }

禁止任何人在创建时为 RunInstances 调用标签

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] }, { "Sid": "VisualEditor0", "Effect": "Deny", "Action": "ec2:CreateTags", "Resource": "*" } ] }

仅允许为 spot-instances-request 使用特定标签。第二个意外的不一致之处在这里发挥了作用。在正常情况下,不指定标签将导致 Unauthenticated 错误。对于 spot-instances-request,如果没有 spot-instances-request 标签,则不会评估此策略,因此无标签的 Spot on Run 请求将成功。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", ] }, { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" } } } ] }

启动模板中的标签

在以下示例中,用户可以启动实例,但前提是他们使用特定的启动模板 (lt-09477bcd97b0d310e)。ec2:IsLaunchTemplateResource 条件键禁止用户覆盖在启动模板中指定的任何资源。语句的第二部分允许用户在创建时标记实例 — 如果在启动模板中为实例指定了标签,则该语句部分是必需的。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/lt-09477bcd97b0d310e" }, "Bool": { "ec2:IsLaunchTemplateResource": "true" } } }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:instance/*", "Condition": { "StringEquals": { "ec2:CreateAction" : "RunInstances" } } } ] }

Elastic GPUs

在以下策略中,用户可以启动实例并指定要附加到实例的 Elastic GPU。用户可以在任何区域中启动实例,但他们只能在 us-east-2 区域中启动期间附加 Elastic GPU。

ec2:ElasticGpuType 条件键确保实例使用 eg1.mediumeg1.large 弹性 GPU 类型。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:*:account-id:elastic-gpu/*" ], "Condition": { "StringEquals": { "ec2:Region": "us-east-2", "ec2:ElasticGpuType": [ "eg1.medium", "eg1.large" ] } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*::image/ami-*", "arn:aws:ec2:*:account-id:network-interface/*", "arn:aws:ec2:*:account-id:instance/*", "arn:aws:ec2:*:account-id:subnet/*", "arn:aws:ec2:*:account-id:volume/*", "arn:aws:ec2:*:account-id:key-pair/*", "arn:aws:ec2:*:account-id:security-group/*" ] } ] }

启动模板

在以下示例中,用户可以启动实例,但前提是他们使用特定的启动模板 (lt-09477bcd97b0d310e)。用户可以在 RunInstances 操作中指定参数以覆盖启动模板中的任何参数。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/lt-09477bcd97b0d310e" } } } ] }

在该示例中,只有在用户使用启动模板时,他们才能启动实例。该策略使用 ec2:IsLaunchTemplateResource 条件键防止用户覆盖启动模板中任何预先存在的 ARN。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/*" }, "Bool": { "ec2:IsLaunchTemplateResource": "true" } } } ] }

以下示例策略允许用户启动实例,但前提是他们使用启动模板。用户无法覆盖请求中的子网和网络接口参数;只能在启动模板中指定这些参数。语句的第一部分使用 NotResource 元素允许子网和网络接口以外的所有其他资源。语句的第二部分允许子网和网络接口资源,但前提是它们来自于启动模板。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "NotResource": ["arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*" ], "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/*" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": ["arn:aws:ec2:region:account-id:subnet/*", "arn:aws:ec2:region:account-id:network-interface/*" ], "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/*" }, "Bool": { "ec2:IsLaunchTemplateResource": "true" } } } ] }

以下示例允许用户启动实例,但前提是他们使用启动模板,并且启动模板具有标签 Purpose=Webservers。用户无法覆盖 RunInstances 操作中的任何启动模板参数。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "NotResource": "arn:aws:ec2:region:account-id:launch-template/*", "Condition": { "ArnLike": { "ec2:LaunchTemplate": "arn:aws:ec2:region:account-id:launch-template/*" }, "Bool": { "ec2:IsLaunchTemplateResource": "true" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:region:account-id:launch-template/*", "Condition": { "StringEquals": { "aws:ResourceTag/Purpose": "Webservers" } } } ] }

使用竞价型实例

您可以使用 RunInstances 操作创建竞价型实例请求,并在创建时标记竞价型实例请求。要为 RunInstances 指定的资源为 spot-instances-request

在 IAM policy 中评估 spot-instances-request 资源,如下所示:

  • 如果您在创建时未标记竞价型实例请求,则 Amazon EC2 不会在 RunInstances 语句中评估 spot-instances-request 资源。

  • 如果您在创建时标记竞价型实例请求,则 Amazon EC2 会在 RunInstances 语句中评估 spot-instances-request 资源。

因此,对于 spot-instances-request 资源,以下规则适用于 IAM policy:

  • 如果您使用 RunInstances 创建竞价型实例请求,并且您不打算在创建时标记竞价型实例请求,则无需明确允许 spot-instances-request 资源;调用将成功。

  • 如果您使用 RunInstances 创建竞价型实例请求并打算在创建时标记竞价型实例请求,则必须在 RunInstances 允许语句中包含 spot-instances-request 资源,否则调用将失败。

  • 如果您使用 RunInstances 创建竞价型实例请求并打算在创建时标记竞价型实例请求,则必须在 CreateTags 允许语句中指定 spot-instances-request 资源或 * 通配符,否则调用将失败。

您可以使用 RunInstances 或 RequestSpotInstances 请求竞价型实例。以下示例 IAM policy 仅在使用 RunInstances 请求竞价型实例时适用。

示例:使用 RunInstances 请求竞价型实例

以下策略允许用户使用 RunInstances 操作请求竞价型实例。由 RunInstances 创建的 spot-instances-request 资源将请求 Spot 实例。

注意

要使用 RunInstances 创建竞价型实例请求,您可以从 spot-instances-request 列表中省略 Resource(如果您不打算在创建时标记竞价型实例请求)。这是因为,如果在创建时未标记竞价型实例请求,则 Amazon EC2 不会在 RunInstances 语句中评估 spot-instances-request 资源。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] } ] }
警告

不支持 – 示例:拒绝用户使用 RunInstances 请求竞价型实例的权限

spot-instances-request 资源不支持以下策略。

以下策略旨在向用户授予启动按需型实例的权限,但拒绝用户请求竞价型实例的权限。由 RunInstances 创建的 spot-instances-request 资源是请求 Spot 实例的资源。第二个语句旨在拒绝针对 spot-instances-request 资源的 RunInstances 操作。但不支持此条件,这是因为,如果在创建时未标记竞价型实例请求,则 Amazon EC2 不会在 RunInstances 语句中评估 spot-instances-request 资源。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*" ] }, { "Sid": "DenySpotInstancesRequests - NOT SUPPORTED - DO NOT USE!", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*" } ] }

示例:在创建时标记竞价型实例请求

以下策略允许用户标记在实例启动期间创建的所有资源。第一个语句允许 RunInstances 创建列出的资源。由 RunInstances 创建的 spot-instances-request 资源是请求 Spot 实例的资源。第二个语句提供了一个 * 通配符,以允许在实例启动时创建所有资源时对其进行标记。

注意

如果您在创建时标记竞价型实例请求,则 Amazon EC2 会在 RunInstances 语句中评估 spot-instances-request 资源。因此,您必须明确允许 RunInstances 操作的 spot-instances-request 资源,否则调用将失败。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] }, { "Sid": "TagResources", "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "*" } ] }

示例:拒绝在创建时标记竞价型实例请求

以下策略拒绝用户标记在实例启动期间创建的资源的权限。

第一个语句允许 RunInstances 创建列出的资源。由 RunInstances 创建的 spot-instances-request 资源是请求 Spot 实例的资源。第二个语句提供了一个 * 通配符,以拒绝在实例启动时创建所有资源时对其进行标记。如果在创建时标记 spot-instances-request 或任何其他资源,则 RunInstances 调用将失败。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] }, { "Sid": "DenyTagResources", "Effect": "Deny", "Action": "ec2:CreateTags", "Resource": "*" } ] }
警告

不支持 – 示例:仅在为竞价型实例请求分配了特定标签时允许创建该请求

spot-instances-request 资源不支持以下策略。

以下策略旨在向 RunInstances 授予权限以仅在使用特定标签标记竞价型实例请求时创建该请求。

第一个语句允许 RunInstances 创建列出的资源。

第二个语句旨在向用户授予权限以仅在竞价型实例请求具有标签 environment=production 时创建该请求。如果将此条件应用于由 RunInstances 创建的其他资源,则不指定标签会导致 Unauthenticated 错误。但是,如果没有为竞价型实例请求指定标签,则 Amazon EC2 不会在 RunInstances 语句中评估 spot-instances-request 资源,这会导致 RunInstances 创建未标记的竞价型实例请求。

请注意,请指定 environment=production 之外的其他标签会导致错误 Unauthenticated,这是因为,如果用户标记竞价型实例请求,则 Amazon EC2 会在 RunInstances 语句中评估 spot-instances-request 资源。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*" ] }, { "Sid": "RequestSpotInstancesOnlyIfTagIs_environment=production - NOT SUPPORTED - DO NOT USE!", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" } } }, { "Sid": "TagResources", "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "*" } ] }

示例:在为竞价型实例请求分配了特定标签的情况下拒绝创建该请求

如果使用 environment=production 标记了竞价型实例请求,则以下策略将拒绝 RunInstances 创建该请求的权限。

第一个语句允许 RunInstances 创建列出的资源。

第二个语句在竞价型实例请求具有标签 environment=production 时拒绝用户创建该请求的权限。指定 environment=production 作为标签会导致 Unauthenticated 错误。指定其他标签或不指定标签将导致创建竞价型实例请求。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRun", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] }, { "Sid": "DenySpotInstancesRequests", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" } } }, { "Sid": "TagResources", "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "*" } ] }

示例:使用预留实例

下面的策略向用户授予在账户中查看、修改和购买预留实例的权限。

无法为个别的预留实例设置资源级别的许可。此策略表示用户可以访问账户中的所有预留实例。

Resource 元素使用 * 通配符指示用户可以在操作中指定所有资源;在本例中,他们可以列出并修改账户中的所有 预留实例。他们还可以使用账户凭证购买预留实例。在 API 操作不支持资源级权限的情况下,也需要 * 通配符。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeReservedInstances", "ec2:ModifyReservedInstances", "ec2:PurchaseReservedInstancesOffering", "ec2:DescribeAvailabilityZones", "ec2:DescribeReservedInstancesOfferings" ], "Resource": "*" } ] }

要允许用户查看和修改账户中的 预留实例,但不允许购买新的 预留实例,请使用以下命令:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeReservedInstances", "ec2:ModifyReservedInstances", "ec2:DescribeAvailabilityZones" ], "Resource": "*" } ] }

示例:标记资源

仅当标签包含键 CreateTags 和值 environment 时,下面的策略才允许用户使用 production 操作向实例应用标签。不允许使用其他标签,并且用户无法为任何其他资源类型添加标签。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:instance/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "production" } } } ] }

以下策略允许用户标记已具有键为 owner、值为用户名的标签的任何可标记资源。此外,用户还必须在请求中指定键为 anycompany:environment-type、值为 testprod 的标签。用户可以在请求中指定其他的标签。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "aws:RequestTag/anycompany:environment-type": ["test","prod"], "aws:ResourceTag/owner": "${aws:username}" } } } ] }

您可以创建允许用户删除资源的特定标签的 IAM policy。例如,当在请求中指定的标签键为 environmentcost-center 时,下面的策略允许用户删除卷的标签。可以为此标签指定任何值,但标签键必须匹配某个指定键。

注意

如果删除资源,则所有与资源相关的标签都将被删除。用户不需要使用 ec2:DeleteTags 操作删除具有标签的资源的权限,他们仅需要执行删除操作的权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:DeleteTags", "Resource": "arn:aws:ec2:us-east-1:account-id:volume/*", "Condition": { "ForAllValues:StringEquals": { "aws:TagKeys": ["environment","cost-center"] } } } ] }

该策略仅允许用户删除任何资源上的 environment=prod 标签,但前提是已使用键为 owner、值为用户名的标签标记该资源。用户无法删除资源的任何其他标签。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DeleteTags" ], "Resource": "arn:aws:ec2:region:account-id:*/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": "prod", "aws:ResourceTag/owner": "${aws:username}" }, "ForAllValues:StringEquals": { "aws:TagKeys": ["environment"] } } } ] }

示例:使用 IAM 角色

以下策略允许用户将 IAM 角色附加、替换到具有标签 department=test 的实例或与之分离。替换或分离 IAM 角色需要一个关联 ID,因此该策略还授予用户使用 ec2:DescribeIamInstanceProfileAssociations 操作的权限。

用户必须具有使用 iam:PassRole 操作的权限,才能将角色传递到实例。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssociateIamInstanceProfile", "ec2:ReplaceIamInstanceProfileAssociation", "ec2:DisassociateIamInstanceProfile" ], "Resource": "arn:aws:ec2:us-east-1:account-id:instance/*", "Condition": { "StringEquals": { "aws:ResourceTag/department":"test" } } }, { "Effect": "Allow", "Action": "ec2:DescribeIamInstanceProfileAssociations", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/DevTeam*" } ] }

以下策略允许用户为所有实例附加或替换 IAM 角色。用户只能附加或替换名称以 TestRole- 开头的 IAM 角色。对于 iam:PassRole 操作,请确保您指定的是 IAM 角色的名称而不是实例配置文件的名称(如果名称不同)。有关更多信息,请参阅 实例配置文件

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssociateIamInstanceProfile", "ec2:ReplaceIamInstanceProfileAssociation" ], "Resource": "*" }, { "Effect": "Allow", "Action": "ec2:DescribeIamInstanceProfileAssociations", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/TestRole-*" } ] }

示例:使用路由表

以下策略允许用户添加、删除和替换仅与 VPC vpc-ec43eb89 关联的路由表的路由。要为 ec2:Vpc 条件键指定 VPC,必须指定 VPC 的完整 ARN。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DeleteRoute", "ec2:CreateRoute", "ec2:ReplaceRoute" ], "Resource": [ "arn:aws:ec2:region:account-id:route-table/*" ], "Condition": { "StringEquals": { "ec2:Vpc": "arn:aws:ec2:region:account-id:vpc/vpc-ec43eb89" } } } ] }

示例:允许特定实例查看其他 Amazon 服务中的资源

下面是您可能附加到 IAM 角色的策略的示例。该策略允许实例查看不同 Amazon 服务中的资源。它使用 ec2:SourceInstanceARN 全局条件键指定从中发出请求的实例必须是实例 i-093452212644b0dd6。如果同一个 IAM 角色还与另一个实例关联,则另一个实例无法执行任何这些操作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeVolumes", "s3:ListAllMyBuckets", "dynamodb:ListTables", "rds:DescribeDBInstances" ], "Resource": [ "*" ], "Condition": { "ArnEquals": { "ec2:SourceInstanceARN": "arn:aws:ec2:region:account-id:instance/i-093452212644b0dd6" } } } ] }

示例:使用启动模板

以下策略允许用户创建启动模板版本和修改启动模板,但仅适用于特定的启动模板 (lt-09477bcd97b0d3abc)。用户无法使用其他启动模板。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ec2:CreateLaunchTemplateVersion", "ec2:ModifyLaunchTemplate" ], "Effect": "Allow", "Resource": "arn:aws:ec2:region:account-id:launch-template/lt-09477bcd97b0d3abc" } ] }

以下策略允许用户删除任何启动模板和启动模板版本,但前提是启动模板具有标签 Purpose=Testing

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ec2:DeleteLaunchTemplate", "ec2:DeleteLaunchTemplateVersions" ], "Effect": "Allow", "Resource": "arn:aws:ec2:region:account-id:launch-template/*", "Condition": { "StringEquals": { "aws:ResourceTag/Purpose": "Testing" } } } ] }

使用实例元数据

以下策略确保用户只能使用 实例元数据服务版本 2 (IMDSv2) 检索实例元数据。您可以将以下四个策略合并为一个具有四个语句的策略。当合并为一个策略时,您可以将该策略用作服务控制策略 (SCP)。它可以很好地用作应用于现有 IAM policy 的拒绝 策略(取消和限制现有权限),也可以很好地用作在账户、组织单位 (OU) 或整个组织间全局应用的 SCP。

注意

以下 RunInstances 元数据选项策略必须与授予委托人使用 RunInstances 启动实例的权限的策略结合使用。如果委托人没有同时具有 RunInstances 权限,则无法启动实例。有关更多信息,请参阅使用实例启动实例 (RunInstances) 中的策略。

重要

如果您使用 Auto Scaling 组且需要要求对所有新实例使用 IMDSv2,您的 Auto Scaling 组必须使用启动模板

当 Auto Scaling 组使用启动模板时,会在创建新 Auto Scaling 组时检查 IAM 委托人的 ec2:RunInstances 权限。当更新现有 Auto Scaling 组以使用新启动模板或新版本的启动模板时,也会检查这些内容。

只有在创建或更新正在使用启动模板的 Auto Scaling 组时,才会检查对 RunInstances 的 IAM 委托人使用 IMDSv1 的限制。对于配置为使用 LatestDefault 启动模板的 Auto Scaling 组,在创建启动模板的新版本时不会检查权限。要检查权限,您必须将 Auto Scaling 组配置为使用特定版本 的启动模板。

要在 Auto Scaling 组启动的实例上强制使用 IMDSv2,需要执行以下附加步骤:
  1. 通过对创建的新委托人使用服务控制策略 (SCP) 或 IAM 权限边界,请对组织中的所有账户禁用启动配置。对于具有 Auto Scaling 组权限的现有 IAM 委托人,请使用此条件键更新其关联策略。要禁用启动配置,请使用值指定为 "autoscaling:LaunchConfigurationName"null 条件键创建或修改相关 SCP、权限边界或 IAM policy。

  2. 对于新启动模板,请在启动模板中配置实例元数据选项。对于现有启动模板,创建启动模板的新版本,并在新版本中配置实例元数据选项。

  3. 在向任何委托人授予使用启动模板的权限的策略中,通过指定 $latest 来限制 $default"autoscaling:LaunchTemplateVersionSpecified": "true" 的关联。通过限制只使用特定版本的启动模板,您可以确保使用在其中配置实例元数据选项的版本启动新实例。有关更多信息,请参阅 Amazon EC2 Auto Scaling API 参考 中的 LaunchTemplateSpecification,特别是 Version 参数。

  4. 对于使用启动配置的 Auto Scaling 组,请将启动配置替换为启动模板。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南 中的使用启动模板替换启动配置

  5. 对于使用启动模板的 Auto Scaling 组,请确保它使用配置了实例元数据选项的新启动模板,或使用配置了实例元数据选项的新版本的当前启动模板。有关更多信息,请参阅 Amazon CLI Command Reference 中的 update-auto-scaling-group

要求使用 IMDSv2

以下策略指定您不能调用 RunInstances API,除非该实例也选择需要使用 IMDSv2(由 "ec2:MetadataHttpTokens": "required" 指示)。如果您未指定实例需要 IMDSv2,则在调用 RunInstances API 时会收到 UnauthorizedOperation 错误。

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

拒绝退出 IMDSv2

以下策略指定您不能调用 ModifyInstanceMetadataOptions API 并允许选择 IMDSv1 或 IMDSv2。如果您调用 ModifyInstanceMetadataOptions API,则必须将 HttpTokens 属性设置为 required

{ "Version": "2012-10-17", "Statement": [{ "Sid": "DenyIMDSv1HttpTokensModification", "Effect": "Deny", "Action": "ec2:ModifyInstanceMetadataOptions", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringNotEquals": { "ec2:Attribute/HttpTokens": "required" }, "Null": { "ec2:Attribute/HttpTokens": false } } }] }

指定最大跃点数限制

以下策略指定您不能调用 RunInstances API,除非您还指定了跃点限制,且跃点限制不能超过 3。如果您无法执行此操作,则在调用 RunInstances API 时会收到 UnauthorizedOperation 错误。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "MaxImdsHopLimit", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "NumericGreaterThan": { "ec2:MetadataHttpPutResponseHopLimit": "3" } } } ] }

限制可以修改实例元数据选项的用户

以下策略仅允许具有 ec2-imds-admins 角色的用户对实例元数据选项进行更改。如果除 ec2-imds-admins 角色以外的任何委托人尝试调用 ModifyInstanceMetadataOptions API,则会收到 UnauthorizedOperation 错误。此语句可用于控制 ModifyInstanceMetadataOptions API 的使用;目前对于 ModifyInstanceMetadataOptions API 没有精细访问控制(条件)。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowOnlyImdsAdminsToModifySettings", "Effect": "Deny", "Action": "ec2:ModifyInstanceMetadataOptions", "Resource": "*", "Condition": { "StringNotLike": { "aws:PrincipalARN": "arn:aws:iam::*:role/ec2-imds-admins" } } } ] }

要求从 IMDSv2 检索角色凭证

以下策略指定如果将此策略应用于某个角色,并且该角色由 EC2 服务代入且生成的凭证用于对请求进行签名,则必须由从 IMDSv2 中检索的 EC2 角色凭证对该请求进行签名。否则,它的所有 API 调用都会收到 UnauthorizedOperation 错误。此语句/策略可广泛应用,因为如果请求未由 EC2 角色证书签名,则其为无效。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireAllEc2RolesToUseV2", "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NumericLessThan": { "ec2:RoleDelivery": "2.0" } } } ] }

使用 Amazon EBS 卷和快照

有关使用 Amazon EBS 卷和快照的策略示例,请参阅 Amazon EBS 的基于身份的策略示例