

# 向用户授予权限以将角色传递给 Amazon 服务
<a name="id_roles_use_passrole"></a>

要配置多项 Amazon 服务，您必须将 IAM 角色*传递*给相应服务。这允许该服务稍后代入该角色并代表您执行操作。对于大多数服务，您只需在设置期间（而不是服务每次代入角色时）将角色传递给服务。例如，假定您的一款应用程序在 Amazon EC2 实例上运行。该应用程序需要临时凭证来进行身份验证，以及授权应用程序在 Amazon 中执行操作的权限。在设置该应用程序时，您必须将角色传递给 Amazon EC2，以便与提供这些凭证的实例一起使用。通过向角色附加 IAM policy，您为在实例上运行的应用程序定义权限。该应用程序每次需要执行角色允许的操作时都会担任该角色。

要将角色（及其权限）传递至 Amazon 服务，用户必须具有*传递角色* 至服务的权限。这有助于管理员确保仅批准的用户可配置具有能够授予权限的角色的服务。要允许用户将角色传递至 Amazon 服务，您必须向用户的 IAM 用户、角色或组授予 `PassRole` 权限。

**警告**  
只能使用 `PassRole` 权限将 IAM 角色传递给使用同一 Amazon 账户的服务。要将账户 A 中的角色传递给账户 B 中的服务，必须首先在账户 B 中创建一个可以代入账户 A 中角色的 IAM 角色，然后才能将账户 B 中的角色传递给该服务。有关更多信息，请参阅 [IAM 中的跨账户资源访问](access_policies-cross-account-resource-access.md)。
请勿试图通过标记角色然后在带有 `iam:PassRole` 操作的策略中使用 `ResourceTag` 条件键来控制谁可以传递角色。这种方法没有可靠的结果。

设置 `PassRole` 权限时，应确保用户所传递角色的权限不会超过您希望该用户拥有的权限。例如，可能不允许 Alice 执行任何 Amazon S3 操作。如果 Alice 可以将角色传递给允许 Amazon S3 操作的服务，则该服务可以在执行作业时代表 Alice 执行 Amazon S3 操作。

在指定服务相关角色时，您还必须拥有将该角色传递给服务的权限。在某些服务中执行操作时，该服务自动在您的账户中创建一个服务相关角色。例如，在首次创建自动扩缩组时，Amazon EC2 Auto Scaling 会为您创建 `AWSServiceRoleForAutoScaling` 服务相关角色。如果您在创建自动扩缩组时尝试指定服务相关角色，但您没有 `iam:PassRole` 权限，则会收到错误。如果您没有明确指定角色，则不需要 `iam:PassRole` 权限，默认情况下，对该组执行的所有操作都使用 `AWSServiceRoleForAutoScaling` 角色。要了解哪些服务支持服务相关角色，请参阅[使用 IAM 的 Amazon 服务](reference_aws-services-that-work-with-iam.md)。要了解在哪些服务中执行操作时自动创建服务相关角色，请选择**是**链接并查看该服务的服务相关角色文档。

在任何使用角色分配服务权限的 API 操作中，用户都可以将角色 ARN 作为参数进行传递。该服务随后检查该用户是否拥有 `iam:PassRole` 权限。要限制用户只传递批准的角色，您可以使用 IAM policy 语句的 `iam:PassRole` 元素筛选 `Resources` 权限。

您可以在 JSON 策略中使用 `Condition` 元素来测试所有 Amazon 请求的请求上下文中所包含键的值。要了解有关在策略中使用条件键的更多信息，请参阅 [IAM JSON 策略元素：Condition](reference_policies_elements_condition.md)。`iam:PassedToService` 条件键可用于指定可将角色传递到的服务的服务主体。要了解有关在策略中使用 `iam:PassedToService` 条件键的更多信息，请参阅 [iam:PassedToService](reference_policies_iam-condition-keys.md#ck_PassedToService)。

**示例 1**  
假设您要授予用户在启动实例时能够将任意批准角色组传递至 Amazon EC2 服务的能力。您需要三个部分：
+ IAM *权限策略*附加到确定角色可执行哪些任务的角色。将权限范围限定为仅角色必须执行的操作，以及角色进行这些操作所需的资源。您可以使用 Amazon 托管的或客户创建的 IAM 权限策略。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": {
          "Effect": "Allow",
          "Action": [ "A list of the permissions the role is allowed to use" ],
          "Resource": [ "A list of the resources the role is allowed to access" ]
      }
  }
  ```

------
+ 允许服务担任角色的*信任策略*。例如，您可以将以下信任策略与具有 `UpdateAssumeRolePolicy` 操作的角色进行附加。该信任策略允许 Amazon EC2 使用角色和附加在角色上的权限。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": {
          "Sid": "TrustPolicyStatementThatAllowsEC2ServiceToAssumeTheAttachedRole",
          "Effect": "Allow",
          "Principal": { "Service": "ec2.amazonaws.com" },
         "Action": "sts:AssumeRole"
      }
  }
  ```

------
+ 附加至 IAM 用户的 IAM *permissions policy*（权限策略），允许该用户仅传递已获批准的那些策略。您通常将 `iam:GetRole` 添加至 `iam:PassRole`，使用户能够获取准备进行传递的角色的详细信息。在此示例中，用户只能传递位于指定账户中并且名称以 `EC2-roles-for-XYZ-` 开头的角色：

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iam:GetRole",
                  "iam:PassRole"
              ],
              "Resource": "arn:aws:iam::111122223333:role/EC2-roles-for-XYZ-*"
          }
      ]
  }
  ```

------

现在用户可以启动具有所分配角色的 Amazon EC2 实例。实例上运行的应用程序可以通过实例配置文件元数据访问角色的临时许可。附加到角色的许可策略确定实例可以执行的任务。

**示例 2**  
Amazon Relational Database Service (Amazon RDS) 支持名为 **Enhanced Monitoring**（增强监控）的功能。此功能使 Amazon RDS 能够使用代理监控数据库实例。它还允许 Amazon RDS 将指标记录到 Amazon CloudWatch Logs 中。要启用此功能，您必须创建一个服务角色，以便为 Amazon RDS 提供监控指标和将指标写入日志的权限。

**为 Amazon RDS 增强监控创建角色**

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 选择 **角色**，然后选择 **创建角色**。

1. 选择 **Amazon 服务**角色类型，然后在**适用于其他 Amazon Web Services 服务 的使用案例**中，选择 **RDS** 服务。选择 **RDS - Enhanced Monitoring**（RDS - 增强监控），然后选择 **Next**（下一步）。

1. 选择 **AmazonRDSEnhancedMonitoringRole** 权限策略。

1. 选择**下一步**。

1. 对于 **Role name**（角色名称），键入有助于标识此角色作用的角色名称。角色名称在您的 Amazon Web Services 账户内必须是唯一的。在策略中使用角色名称或将其作为 ARN 的一部分时，角色名称区分大小写。在控制台中向客户显示角色名称时（例如在登录过程中），角色名称不区分大小写。由于多个实体可能引用该角色，因此，角色创建完毕后，您将无法编辑角色名称。

1. （可选）对于 **Description**（描述），输入新角色的描述。

1. （可选）通过以键值对的形式附加标签来向用户添加元数据。有关在 IAM 中使用标签的更多信息，请参阅 [Amazon Identity and Access Management 资源的标签](id_tags.md)。

1. 检查角色，然后选择**创建角色**。

角色自动获得授予 `monitoring.rds.amazonaws.com` 服务担任角色权限的信任策略。在此之后，Amazon RDS 可执行 `AmazonRDSEnhancedMonitoringRole` 策略允许的所有操作。

您希望使用增强监控的用户需要包括允许用户列出 RDS 角色的语句和允许用户传递角色的语句的策略，如下所示。使用您的账号，然后使用您在步骤 6 中提供的名称替换角色名称。

```
    {
      "Sid": "PolicyStatementToAllowUserToListRoles",
      "Effect": "Allow",
      "Action": ["iam:ListRoles"],
      "Resource": "*"
    },
    {
        "Sid": "PolicyStatementToAllowUserToPassOneSpecificRole",
        "Effect": "Allow",
        "Action": [ "iam:PassRole" ],
        "Resource": "arn:aws:iam::account-id:role/RDS-Monitoring-Role"
    }
```

您可以将该语句与另一策略中的语句进行合并，或将此语句放在其自身策略中。如要指定用户可传递以 `RDS-` 开始的任何角色，您可以在资源 ARN 中使用通配符替换角色名称，如下所示。

```
        "Resource": "arn:aws:iam::account-id:role/RDS-*"
```

## Amazon CloudTrail 日志中的 `iam:PassRole` 操作
<a name="id_roles_use_passrole_logs"></a>

 `PassRole` 不是 API 调用。`PassRole` 是一种权限，意味着不会为 IAM `PassRole` 生成 CloudTrail 日志。要查看向 CloudTrail 中的哪个 Amazon Web Services 服务 传递了哪些角色，您必须查看创建或修改接收相应角色的 Amazon 资源的 CloudTrail 日志。例如，角色在创建时会传递给 Amazon Lambda 函数。`CreateFunction` 操作的日志显示了传递给该函数的角色记录。