

# 切换到 IAM 角色（AWS CLI）
<a name="id_roles_use_switch-role-cli"></a>

*角色* 指定可用于访问所需的 AWS 资源的一组权限。在这种意义上，它类似于 [AWS Identity and Access Management 中的用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) (IAM)。作为用户登录时，您会获取一组特定权限。不过，您不会登录到角色，但在以用户身份登录后，您可以切换到角色。这会临时搁置原始用户权限，而向您提供分配给角色的权限。角色可以在您自己的账户中或任何其他 AWS 账户 中。有关角色、其权益以及如何创建和配置角色的更多信息，请参阅[IAM 角色](id_roles.md)和[IAM 角色创建](id_roles_create.md)。要了解在担任角色时使用的各种方法，请参阅[担任角色的方法](id_roles_manage-assume.md)。

**重要**  
不会累积您的 IAM 用户和担任的任何角色的权限。一次只有一组权限处于活动状态。在担任某个角色时，您将临时放弃以前的用户或角色权限并使用为该角色分配的权限。退出该角色后，您的用户权限将自动恢复。

在以 IAM 用户身份登录后，您可以使用角色来运行 AWS CLI 命令。在以已使用角色的 [externally authenticated user](id_roles_providers.md)（外部验证的用户）（[SAML](id_roles_providers_saml.md) 或 [OIDC](id_roles_providers_oidc.md)）身份登录后，您也可以使用角色来运行 AWS CLI 命令。此外，您还可以使用角色从通过实例配置文件附加到角色的 Amazon EC2 实例中运行 AWS CLI 命令。在以 AWS 账户根用户身份登录时，您无法担任角色。

[**角色链**](id_roles.md#iam-term-role-chaining) — 您还可以使用角色链，这将使用来自一个角色的权限访问另一个角色。

默认情况下，您的角色会话持续 1 小时。在使用 `assume-role*` CLI 操作担任该角色时，您可以为 `duration-seconds` 参数指定一个值。该值的范围在 900 秒 (15 分钟) 到角色的最大会话持续时间设置之间。如果您在控制台中切换角色，则会话持续时间最长为一小时。要了解如何查看您的角色的最大值，请参阅[更新角色的最长会话持续时间](id_roles_update-role-settings.md#id_roles_update-session-duration)。

如果使用角色链，您的会话持续时间限制为最多 1 小时。如果您随后使用 `duration-seconds` 参数提供大于 1 小时的值，操作将失败。

## 示例方案：切换到生产角色
<a name="switch-role-cli-scenario-prod-env"></a>

假设您是一名在开发环境中工作的 IAM 用户。在此场景中，您有时需要使用 [AWS CLI](https://aws.amazon.com/cli/) 通过命令行来使用生产环境。您已经有一组可用的访问密钥凭证。这可能是分配给您的标准 IAM 用户的访问密钥对。或者，如果您以 SAML 或 OIDC 联合主体身份登录，则它可能是最初为您分配的角色的访问密钥对。如果您的当前权限授予您担任特定 IAM 角色的能力，则可以在 AWS CLI 配置文件的“配置文件”中标识该角色。然后，将使用指定 IAM 角色而非原始身份的权限运行该命令。请注意，通过 AWS CLI 命令指定该配置文件时，您使用的是新角色。在这种情况下，您无法同时使用开发账户中的原始权限。原因是，一次仅一组权限能够生效。

**注意**  
为了安全起见，管理员可以[查看 AWS CloudTrail 日志](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)以了解已在 AWS 中执行操作的人员。您的管理员可能会要求您在代入角色时指定源身份或角色会话名称。有关更多信息，请参阅[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)和[`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname)。

**切换到生产角色 (AWS CLI)**

1. <a name="step-configure-default"></a>如果您从未使用过 AWS CLI，则您必须先配置默认的 CLI 配置文件。打开命令提示符并将您的 AWS CLI 安装设置为使用来自 IAM 用户或联合角色的访问密钥。有关更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[配置 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-quick-configuration)。

   运行 [aws configure](https://docs.aws.amazon.com/cli/latest/reference/configure/) 命令，如下所述：

   ```
   aws configure
   ```

   当系统提示时，请提供以下信息：

   ```
   AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
   AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   Default region name [None]: us-east-2
   Default output format [None]: json
   ```

1. 在 Unix 或 Linux 上的 `.aws/config` 文件或 Windows 上的 `C:\Users\USERNAME\.aws\config` 文件中，为角色创建新的配置文件。以下示例创建一个名为 `prodaccess` 的配置文件，它切换到 `123456789012` 账户中的 `ProductionAccessRole` 角色。您从创建该角色的账户管理员处获取角色 ARN。在调用此配置文件时，AWS CLI 使用 `source_profile` 的凭证请求该角色的凭证。因此，引用为 `source_profile` 的身份必须具有 `role_arn` 中指定的角色的 `sts:AssumeRole` 权限。

   ```
   [profile prodaccess]
       role_arn = arn:aws:iam::123456789012:role/ProductionAccessRole
       source_profile = default
   ```

1. 在创建新的配置文件后，将使用附加到 IAM 角色 `ProductionAccessRole`（而不是默认用户）的权限运行指定 `--profile prodaccess` 参数的任何 AWS CLI 命令。

   ```
   aws iam list-users --profile prodaccess
   ```

   如果分配给 `ProductionAccessRole` 的权限允许列出当前 AWS 账户中的用户，则此命令有效。

1. 要返回到原始凭证授予的权限，请运行不带 `--profile` 参数的命令。AWS CLI 将恢复使用您在[Step 1](#step-configure-default)中配置的默认配置文件中的凭证。

有关更多信息，请参阅 *AWS Command Line Interface 用户指南*中的[代入角色](https://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html)。

## 示例场景：允许实例配置文件角色切换到另一个账户中的角色
<a name="switch-role-cli-scenario-ec2-instance"></a>

假设您使用两个 AWS 账户，并希望允许 Amazon EC2 实例上运行的应用程序在两个账户中运行 [AWS CLI](https://aws.amazon.com/cli/) 命令。假设 EC2 实例位于 `111111111111` 账户中。该实例包含 `abcd` 实例配置文件角色，以允许应用程序对同一 `111111111111` 账户中的 `amzn-s3-demo-bucket1` 存储桶执行只读 Amazon S3 任务。不过，还必须允许应用程序担任 `efgh` 跨账户角色以在账户 `222222222222` 中执行任务。为此，`abcd` EC2 实例配置文件角色必须具有以下权限策略：

***账户 111111111111 `abcd` 角色权限策略***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1/*",
                "arn:aws:s3:::amzn-s3-demo-bucket1"
            ]
        },
        {
            "Sid": "AllowIPToAssumeCrossAccountRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::222222222222:role/efgh"
        }
    ]
}
```

------

假设 `efgh` 跨账户角色允许对同一 `222222222222` 账户中的 `amzn-s3-demo-bucket2` 存储桶执行只读 Amazon S3 任务。为此，`efgh` 跨账户角色必须具有以下权限策略：

***账户 222222222222 `efgh` 角色权限策略***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket2/*",
                "arn:aws:s3:::amzn-s3-demo-bucket2"
            ]
        }
    ]
}
```

------

`efgh` 角色必须允许 `abcd` 实例配置文件角色担任该角色。为此，`efgh` 角色必须具有以下信任策略：

***账户 222222222222 `efgh` 角色信任策略***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "efghTrustPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"}
        }
    ]
}
```

------

要在 `222222222222` 账户中运行 AWS CLI 命令，您必须更新 CLI 配置文件。在 AWS CLI 配置文件中将 `efgh` 角色指定为“配置文件”，并将 `abcd` EC2 实例配置文件角色指定为“凭证源”。然后，将使用 `efgh` 角色的权限运行 CLI 命令，而不是使用原始 `abcd` 角色。

**注意**  
出于安全原因，您可以使用 AWS CloudTrail 审核角色在账户中的使用。要在 CloudTrail 日志中由不同主体使用角色时区分角色会话，可以借助角色会话名称。在 AWS CLI 按照本主题所述代表用户担任某个角色时，将自动创建一个 `AWS-CLI-session-nnnnnnnn` 形式的角色会话名称。其中，*nnnnnnnn* 是一个表示 [Unix 纪元时间](http://wikipedia.org/wiki/Unix_time) (自 1970 年 1 月 1 日午夜 UTC 算起的秒数) 的整数。有关更多信息，请参阅 *AWS CloudTrail 用户指南*中的 [CloudTrail 事件引用](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/eventreference.html)。

**允许 EC2 实例配置文件角色切换到跨账户角色 (AWS CLI)**

1. 您不必配置默认 CLI 配置文件。相反，您可以从 EC2 实例配置文件元数据中加载凭证。在 `.aws/config` 文件中为角色创建新的配置文件。以下示例创建一个 `instancecrossaccount` 配置文件，它切换到 `222222222222` 账户中的 `efgh` 角色。在调用该配置文件时，AWS CLI 使用 EC2 实例配置文件元数据的凭证请求该角色的凭证。因此，EC2 实例配置文件角色必须具有 `role_arn` 中指定的角色的 `sts:AssumeRole` 权限。

   ```
   [profile instancecrossaccount]
   role_arn = arn:aws:iam::222222222222:role/efgh
   credential_source = Ec2InstanceMetadata
   ```

1. 在创建新的配置文件后，将使用附加到 `222222222222` 账户中的 `efgh` 角色的权限运行指定 `--profile instancecrossaccount` 参数的任何 AWS CLI 命令。

   ```
   aws s3 ls amzn-s3-demo-bucket2 --profile instancecrossaccount
   ```

   如果分配给 `efgh` 角色的权限允许列出当前 AWS 账户 中的用户，则该命令有效。

1. 要恢复为 `111111111111` 账户中的原始 EC2 实例配置文件权限，请不要使用 `--profile` 参数运行 CLI 命令。

有关更多信息，请参阅 *AWS Command Line Interface 用户指南*中的[代入角色](https://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html)。