

# AWS CLI 身份验证和访问凭证
<a name="cli-chap-authentication"></a>

在使用 AWS 服务进行开发时，必须确定 AWS CLI 如何使用 AWS 进行身份验证。要为 AWS CLI 配置用于编程访问的凭证，请选择下列选项之一。这些选项按推荐顺序排列。


****  

| 身份验证类型 | 用途 | 说明 | 
| --- | --- | --- | 
|  AWS 管理控制台凭证  | **（推荐）**使用您的控制台凭证登录 AWS CLI，来使用短期凭证。如果使用根用户、IAM 用户或 IAM 联合身份验证来访问 AWS 账户，则建议您采用这种方式 | [使用控制台凭证登录以进行 AWS 本地开发](cli-configure-sign-in.md) | 
|  IAM Identity Center 员工用户短期凭证  | 为 IAM Identity Center 员工用户提供短期凭证。最佳安全实践是将 AWS Organizations 与 IAM Identity Center 结合使用。它能够将短期凭证与用户目录（例如内置 IAM Identity Center 目录或 Active Directory）结合在一起。 | [使用 AWS CLI 配置 IAM Identity Center 身份验证](cli-configure-sso.md) | 
| IAM 用户短期凭证 | 使用 IAM 用户短期凭证，它比长期凭证更安全。如果您的凭证遭到泄露，则在凭证过期之前的使用时间有限。 | [在 AWS CLI 中使用短期凭证进行身份验证](cli-authentication-short-term.md) | 
| Amazon EC2 实例上的 IAM 或 IAM Identity Center 用户。 | 通过分配给 Amazon EC2 实例的角色，使用 Amazon EC2 实例元数据查询临时凭证。 | [在 AWS CLI 中将 Amazon EC2 实例元数据用作凭证](cli-configure-metadata.md) | 
| 代入角色以获得权限 | 将另一个凭证方法配对并代入一个角色以临时访问您的用户可能无法访问的 AWS 服务。 | [在 AWS CLI 中使用 IAM 角色](cli-configure-role.md) | 
| IAM 用户长期凭证 | （不推荐）使用不会过期的长期凭证。 | [在 AWS CLI 中使用 IAM 用户凭证进行身份验证](cli-authentication-user.md) | 
| IAM 或 IAM Identity Center 员工用户的外部存储  | （不推荐）将另一个凭证方法配对，但存储位于 AWS CLI 外部的凭证值。此方法的安全性取决于存储凭证的外部位置。 | [在 AWS CLI 中使用外部进程获取凭证](cli-configure-sourcing-external.md) | 

## 配置和凭证优先顺序
<a name="cli-chap-authentication-precedence"></a>

凭证和配置设置位于不同位置（例如，系统或用户环境变量、本地 AWS 配置文件）或在命令行上显式声明为参数。某些身份验证优先于其他身份验证。AWS CLI 身份验证设置的优先顺序如下：

1. **[命令行选项](cli-configure-options.md)** – 覆盖任何其他位置的设置，例如 `--region`、`--output` 和 `--profile` 参数。

1. **[环境变量](cli-configure-envvars.md)** – 您可以在系统的环境变量中存储值。

1. **[代入角色](cli-configure-role.md)**：通过配置或 [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html) 命令代入 IAM 角色的权限。

1. **[使用 Web 身份代入角色](cli-configure-role.md)**：通过配置或 [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html) 命令使用 Web 身份代入 IAM 角色的权限。

1. **[AWS IAM Identity Center](cli-configure-files.md)** – 在您运行 `aws configure sso` 命令时，存储在 `config` 文件中的 IAM Identity Center 配置设置将更新。运行 `aws sso login` 命令时会对凭证进行身份验证。`config` 文件位于 `~/.aws/config`（在 Linux 或 macOS 上）或 `C:\Users\USERNAME\.aws\config`（在 Windows 上）。

1. **[凭证文件](cli-configure-files.md)** – 在运行命令 `aws configure` 时，将更新 `credentials` 和 `config` 文件。`credentials` 文件位于 `~/.aws/credentials`（在 Linux 或 macOS 上）或 `C:\Users\USERNAME\.aws\credentials`（在 Windows 上）。

1. **[自定义流程](cli-configure-sourcing-external.md)** – 从外部来源获取您的凭证。

1. **[配置文件](cli-configure-files.md)** – 在运行命令 `aws configure` 时，将更新 `credentials` 和 `config` 文件。`config` 文件位于 `~/.aws/config`（在 Linux 或 macOS 上）或 `C:\Users\USERNAME\.aws\config`（在 Windows 上）。

1. **[容器凭证](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)** – 您可以将 IAM 角色与每个 Amazon Elastic Container Service (Amazon ECS) 作业定义关联。之后，该任务的容器就可以使用该角色的临时凭证。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的[任务的 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。

1. **[Amazon EC2 实例配置文件凭证](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)** – 您可以将 IAM 角色与每个 Amazon Elastic Compute Cloud (Amazon EC2) 实例关联。之后，在该实例上运行的代码就可以使用该角色的临时凭证。凭证通过 Amazon EC2 元数据服务提供。有关更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)和《IAM 用户指南》**中的[使用实例配置文件](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)。

## 此部分中的其他主题
<a name="cli-chap-authentication-topics"></a>
+ [使用 AWS CLI 配置 IAM Identity Center 身份验证](cli-configure-sso.md)
+ [在 AWS CLI 中使用短期凭证进行身份验证](cli-authentication-short-term.md)
+ [在 AWS CLI 中使用 IAM 角色](cli-configure-role.md)
+ [在 AWS CLI 中使用 IAM 用户凭证进行身份验证](cli-authentication-user.md)
+ [在 AWS CLI 中将 Amazon EC2 实例元数据用作凭证](cli-configure-metadata.md)
+ [在 AWS CLI 中使用外部进程获取凭证](cli-configure-sourcing-external.md)

# 使用控制台凭证登录以进行 AWS 本地开发
<a name="cli-configure-sign-in"></a>

您可以使用现有的 AWS 管理控制台登录凭证以编程方式访问 AWS 服务。在基于浏览器的身份验证流程之后，AWS 会生成可在各种本地开发工具（例如 AWS CLI、AWS Tools for PowerShell 和 AWS SDK）中使用的临时凭证。此功能简化了配置和管理 AWS CLI 凭证的过程，尤其适合您更希望使用交互式身份验证而不是管理长期访问密钥的情况。

通过此身份验证流程，您可以使用在初始账户设置期间创建的根凭证、IAM 用户或来自身份提供商的联合身份进行身份验证，AWS CLI 会自动为您管理临时凭证。这种方法无需在本地存储长期凭证，从而增强了安全性。

运行 `aws login` 命令时，您可以从活动控制台会话中进行选择，也可以通过基于浏览器的身份验证流程登录，这将自动生成临时凭证。CLI 将自动刷新这些凭证，时间最长可达 12 小时。

在配置后，您的会话即可在 AWS CLI 以及其他 AWS SDK 和工具中使用。

**Topics**
+ [先决条件](#cli-configure-sign-in-prerequisites)
+ [使用 `aws login` 命令登录 AWS CLI。](#cli-configure-sign-in-login-command)
+ [使用您的配置文件运行命令](#cli-configure-sign-in-with-profile)
+ [使用 aws 注销命令退出会话](#cli-configure-sign-in-sign-out)
+ [问题排查](#cli-configure-sign-in-troubleshooting)
+ [相关资源](#cli-configure-sign-in-resources)

## 先决条件
<a name="cli-configure-sign-in-prerequisites"></a>
+ 安装 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md)。最低需要版本 2.32.0 才能使用 `aws login` 命令。
+ 以根用户和 IAM 用户身份或通过 IAM 联合身份验证登录 AWS 管理控制台的访问权限。如果您使用 IAM Identity Center，请转到[使用 AWS CLI 配置 IAM Identity Center 身份验证](cli-configure-sso.md)。
+ 确保 IAM 身份具有适当的权限。将 [SignInLocalDevelopmentAccess](https://docs.aws.amazon.com/signin/latest/userguide/security-iam-awsmanpol.html) 托管式策略附加到您的 IAM 用户、角色或组。如果您以根用户身份登录，则不需要额外的权限。

## 使用 `aws login` 命令登录 AWS CLI。
<a name="cli-configure-sign-in-login-command"></a>

运行 `aws login` 命令以使用您现有的 AWS 管理控制台凭证进行身份验证。如果您之前未配置过配置文件，系统会提示您提供额外的信息。要登录或配置配置文件，请按照以下步骤操作。

1. 在首选终端中运行 `aws login` 命令。

   ```
   $ aws login
   ```

   要登录到指定的配置文件或者创建新配置文件，请使用 `--profile` 选项。

   ```
   $ aws login --profile my-dev-profile
   ```
   + 如果这是新配置文件或者未指定 AWS 区域，AWS CLI 会提示您提供一个区域。

     ```
     No AWS region has been configured. The AWS region is the geographic location of 
     your AWS resources. 
     
     If you've used AWS before and already have resources in your account, tell us 
     which region they were created in. If you haven't created resources in your account 
     before, you can pick the region closest to you: 
     https://docs.aws.amazon.com/global-infrastructure/latest/regions/aws-regions.html. 
     You are able to change the region in the CLI at any time with the command 
     `aws configure set region NEW_REGION`.
     
     AWS Region [us-east-1]:
     ```
   + 如果使用 AWS CLI 的设备不具有浏览器，您可以使用 `--remote` 选项提供一个 URL，以便在启用浏览器的设备上打开。

     ```
     $ aws login --remote
     ```
**注意**  
您可以控制对同设备 (`aws login`) 和跨设备 (`aws login --remote`) 身份验证的访问权限。在任何相关的 IAM 策略中使用以下资源 ARN。  
`arn:aws:signin:region:account-id:oauth2/public-client/localhost`：使用此 ARN 通过 `aws login` 进行同设备身份验证。
`arn:aws:signin:region:account-id:oauth2/public-client/remote`：使用此 ARN 通过 `aws login --remote` 进行跨设备身份验证。

1. AWS CLI 会尝试打开您的默认浏览器，以便开始您的 AWS 账户的登录过程。

   ```
   Attempting to open the login page for `us-east-1` in your default browser. 
   If the browser does not open, use the following URL to complete your login:
   https://signin.us-east-1.amazonaws.com/authorize?<abbreviated>
   
   If you cannot connect to this URL, make sure that you have specified a valid region.
   ```
   + 如果您使用的是 `--remote` 选项，则会显示手动启动登录过程的说明，具体取决于您使用的授权类型。显示的 URL 是唯一 URL，开头为 https://us-east-1.signin.amazonaws.com/authorize. 登录上浏览器后，您需要复制生成的授权码并粘贴回 CLI 中。

     ```
     Browser will not be automatically opened.
     Please visit the following URL:
     https://region.signin.amazonaws.com/authorize?<abbreviated>
     
     Please enter the authorization code displayed in the browser:
     ```

1. 在浏览器中显示的列表内，选择要使用的凭证，然后返回到您的终端。
   + 如果您正在配置的配置文件有一个先前配置的登录会话，而该会话与您的新会话不匹配，AWS CLI 将提示您确认是否正在切换到与现有配置文件对应的会话。

     ```
     Profile signin is already configured to use session arn:aws:iam::0123456789012:user/ReadOnly. 
     Do you want to overwrite it to use arn:aws:iam::0123456789012:user/Admin instead? (y/n):.
     ```

1. 最后一条消息描述了完成的配置文件配置。现在，您可以使用此配置文件请求凭证。使用 `aws login` 命令请求和检索运行命令所需的凭证。

   身份验证令牌缓存到磁盘上的 `.aws/login/cache` 目录下，其文件名基于已解析的配置文件。

### 生成的配置文件
<a name="cli-configure-sign-in-generated-config"></a>

执行这些步骤会在 `config` 文件中创建 `default` 配置文件，具体如下所示：

```
[default]
login_session = arn:aws:iam::0123456789012:user/username
region = us-east-1
```

## 使用您的配置文件运行命令
<a name="cli-configure-sign-in-with-profile"></a>

登录后，您可以使用您的凭证通过关联的配置文件来调用 AWS CLI 命令。以下示例使用 `default` 配置文件调用 `get-caller-identity` 命令：

```
$ aws sts get-caller-identity
```

要登录特定会话，请使用 `--profile` 选项。

```
$ aws sts get-caller-identity --profile my-dev-profile
```

AWS CLI 和 SDK 将根据需要每 15 分钟自动刷新一次缓存的凭证。整个会话的有效时间将持续到 IAM 主体设置的会话时长（最长 12 小时），之后您必须重新运行 `aws login`。

## 使用 aws 注销命令退出会话
<a name="cli-configure-sign-in-sign-out"></a>

使用完会话后，您可以让您的凭证过期，或者运行 `aws logout` 命令来删除缓存的凭证。如果在命令行或 `AWS_PROFILE` 环境变量中未指定配置文件，该命令会将您从默认配置文件中注销。以下示例会将您从默认配置文件中注销。

```
$ aws logout
```

要从特定会话中注销，请使用 `--profile` 选项。

```
$ aws logout --profile my-dev-profile
```

要注销使用登录凭证的所有配置文件，请使用 `--all` 选项。

```
$ aws logout --all
```

### 缓存的凭证
<a name="cli-configure-sign-in-sharing-login-creds"></a>

临时缓存的凭证以及刷新它们所需的元数据默认存储在 Linux 和 macOS 的 `~/.aws/login/cache` 中，或存储在 Windows 上的 `%USERPROFILE%\.aws\login\cache` 中。

要将短期凭证缓存存储在其他位置，请设置 `AWS_LOGIN_CACHE_DIRECTORY` 环境变量。

#### 将登录凭证共享为进程凭证
<a name="cli-configure-sign-in-cached-credentials"></a>

旧版本的 AWS SDK 或其他开发工具可能尚不支持控制台凭证。一种解决方法是，您可以配置 AWS CLI 作为进程凭证提供者。CLI 将根据需要继续刷新凭证，同时将凭证共享给配置为使用 credential\$1process 配置文件的工具。

在此示例中，首先使用 AWS CLI 登录以进行配置文件登录：

```
$ aws login --profile signin
```

然后，使用 credential\$1process 选项手动配置一个配置文件，该选项指回登录配置文件。现在您可以配置 SDK 或工具以使用进程配置文件，这将调用 CLI 从登录配置文件共享凭证。

```
[profile signin]
login_session = arn:aws:iam::0123456789012:user/username
region = us-east-1

[profile process] 
credential_process = aws configure export-credentials --profile signin --format process
region = us-east-1
```

## 问题排查
<a name="cli-configure-sign-in-troubleshooting"></a>

此页面中包含一些问题的故障排除建议，使用 AWS CLI 控制台凭证登录进行 AWS 本地开发时可能遇到这些问题。

**注意**  
要解决使用 AWS CLI 时可能遇到的其他问题，请参阅[排查 AWS CLI 错误](cli-chap-troubleshooting.md)。

### 使用“aws login”后出现 ExpiredToken 或 AccessDeniedException 错误
<a name="expired-token-login-troubleshooting"></a>

在为给定配置文件运行 `aws login` 后执行 AWS CLI 命令时，您可能会遇到凭证过期或无效的错误。

```
$ aws s3 ls

An error occurred (ExpiredToken) when calling the ListBuckets operation: The provided token has expired.
```

**可能的原因：**您在该配置文件中混合使用了现有凭证和新的登录凭证

运行 `aws configure list` 或 `aws configure list --profile <profile name>`，以输出 CLI 为默认配置文件或给定配置文件解析凭证的位置。

如果 TYPE 列的值不是 login，这意味着目标配置文件中仍然设置了其他类型的凭证。

在此示例中，凭证是从主目录中的共享凭证文件中解析的，该文件优先于登录凭证。

```
$  aws configure list
NAME       : VALUE                    : TYPE             : LOCATION
profile    : <not set>                : None             : None
access_key : ****************MPLE     : shared-credentials-file :
secret_key : ****************EKEY     : shared-credentials-file :
region     : us-east-1                : config-file      : ~/.aws/config
```

要解决此问题，请从配置和凭证文件中手动删除目标配置文件的所有现有凭证。执行此操作后，再次运行 `aws configure list` 时，您应该会看到登录凭证。

```
$  aws configure list
NAME       : VALUE                    : TYPE             : LOCATION
profile    : <not set>                : None             : None
access_key : ****************MPLE     : login            :
secret_key : ****************EKEY     : login            :
region     : us-east-1                : config-file      : ~/.aws/config
```

此外，使用 `--debug` 选项将显示 CLI 解析凭证的位置。

### 运行“aws login”时，防火墙阻止网络访问
<a name="firewall-blocking-login-troubleshooting"></a>

运行 `aws login` 时，您可能会遇到防火墙软件弹出窗口或消息，阻止 AWS CLI 访问您的网络

**可能的原因：**您的防火墙或安全软件阻止了 AWS CLI 打开用于处理 OAuth 回调的端口。

为避免此问题，请改用 `--remote` 选项。这将提示您复制并粘贴授权码，而不是使用 OAuth 回调。

```
$ aws login --remote
```

## 相关资源
<a name="cli-configure-sign-in-resources"></a>

其他资源如下所示。
+ [安装或更新最新版本的 AWS CLI](getting-started-install.md)
+ [《AWS CLI 版本 2 参考》中的 `aws login`](https://docs.aws.amazon.com/cli/latest/reference/)
+ [《AWS CLI 版本 2 参考》中的 `aws logout`](https://docs.aws.amazon.com/cli/latest/reference/)

# 使用 AWS CLI 配置 IAM Identity Center 身份验证
<a name="cli-configure-sso"></a>

本主题提供的说明可帮助您了解如何使用 AWS IAM Identity Center（IAM Identity Center）配置 AWS CLI，以检索运行 AWS CLI 命令所需的凭证。可采用两种主要方式来使用 IAM Identity Center 验证用户身份，从而获取通过 `config` 文件运行 AWS CLI 命令所需的凭证：
+ **（推荐）**SSO 令牌提供程序配置。
+ 遗留的不可刷新配置。

有关使用持有者身份验证（不使用账户 ID 和角色）的信息，请参阅《Amazon CodeCatalyst 用户指南》中**的[进行设置以将 AWS CLI 与 CodeCatalyst 一起使用](https://docs.aws.amazon.com/codecatalyst/latest/userguide/set-up-cli.html)。

**注意**  
有关使用带 AWS CLI 命令的 IAM Identity Center 的指导过程，请参阅[教程：使用 IAM 身份中心在 AWS CLI 中运行 Amazon S3 命令](cli-configure-sso-tutorial.md)。

**主题**
+ [先决条件](#cli-configure-sso-prereqs)
+ [使用 `aws configure sso` 向导配置您的配置文件](#cli-configure-sso-configure)
+ [使用 `aws configure sso-session` 向导仅配置您的 `sso-session` 部分](#cli-configure-sso-session)
+ [使用 `config` 文件手动配置](#cli-configure-sso-manual)
+ [登录到 IAM Identity Center 会话](#cli-configure-sso-login)
+ [使用 IAM Identity Center 配置文件运行命令](#cli-configure-sso-use)
+ [退出 IAM Identity Center 会话](#cli-configure-sso-logout)
+ [问题排查](#cli-configure-sso-tshoot)
+ [相关资源](#cli-configure-sso-resources)

## 先决条件
<a name="cli-configure-sso-prereqs"></a>
+ 安装 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md)。
+ 您必须先有权访问 IAM Identity Center 中的 SSO 身份验证。选择下列方法之一来访问您的 AWS 凭证。

### 我尚未通过 IAM Identity Center 确立访问权限
<a name="idc-access"></a>

请按照《AWS IAM Identity Center 用户指南》**的[入门](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)中的说明操作。此过程激活 IAM Identity Center，创建管理用户并添加适当的最低权限集。

**注意**  
创建应用最低权限的权限集。除非您的雇主已为此目的创建自定义权限集，否则建议使用预定义的 `PowerUserAccess` 权限集。

退出门户并重新登录以查看您的 AWS 账户、编程访问详细信息以及 `Administrator` 和 `PowerUserAccess` 选项。在使用开发工具包时选择 `PowerUserAccess`。

### 我已通过我的雇主管理的联邦身份提供者（例如 Azure AD 或 Okta）获得对 AWS 的访问权限
<a name="federated-access"></a>

通过身份提供者的门户登录 AWS。如果您的云管理员已向您授予 `PowerUserAccess`（开发人员）权限，您将看到您有权访问的 AWS 账户和您的权限集。在您的权限集名称旁边，可以看到有关使用该权限集手动或以编程方式访问账户的选项。

自定义实现可能会产生不同的体验，例如不同的权限集名称。如果您不确定要使用哪个权限集，请联系 IT 团队以寻求帮助。

### 我已通过雇主管理的 AWS 访问门户获得对 AWS 的访问权限
<a name="accessportal-access"></a>

通过您的 AWS 访问门户登录到 AWS。如果您的云管理员已向您授予 `PowerUserAccess`（开发人员）权限，您将看到您有权访问的 AWS 账户和您的权限集。在您的权限集名称旁边，可以看到有关使用该权限集手动或以编程方式访问账户的选项。

### 我已通过我的雇主管理的联合自定义身份提供者获得对 AWS 的访问权限
<a name="customfederated-access"></a>

请联系您的 IT 团队以寻求帮助。

访问 IAM Identity Center 后，通过执行以下操作收集 IAM Identity Center 信息：

1. 收集运行 `aws configure sso` 所需的 `SSO Start URL` 和 `SSO Region` 值

   1. 在 AWS 访问门户中，选择用于开发的权限集，然后选择**访问密钥**链接。

   1. 在**获取凭证**对话框中，选择与您的操作系统匹配的选项卡。

   1. 选择 **IAM Identity Center 凭证**方法以获取 `SSO Start URL` 和 `SSO Region` 值。

1. 或者，从版本 2.22.0 开始，您可以使用发布者 URL 来代替启动 URL。发布者 URL 位于 AWS IAM Identity Center 控制台上的下列位置之一：
   + 在**控制面板**页面上，发布者 URL 位于设置摘要中。
   + 在**设置**页面上，发布者 URL 位于**身份源**设置中。

1. 有关要注册哪些范围值的信息，请参阅《IAM Identity Center 用户指南》**中的 [OAuth 2.0 访问范围](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html#oidc-concept)。

## 使用 `aws configure sso` 向导配置您的配置文件
<a name="cli-configure-sso-configure"></a>

**在 AWS CLI 中配置 IAM Identity Center 配置文件：**

1. 在首选终端中运行 `aws configure sso` 命令。

------
#### [ (Recommended) IAM Identity Center ]

   创建会话名称，并提供 IAM Identity Center 启动 URL 或发布者 URL、托管 IAM Identity Center 目录的 AWS 区域和注册范围。

   ```
   $ aws configure sso
   SSO session name (Recommended): my-sso
   SSO start URL [None]: https://my-sso-portal.awsapps.com/start
   SSO region [None]: us-east-1
   SSO registration scopes [None]: sso:account:access
   ```

   要获得双栈支持，请使用双栈 SSO 起始 URL：

   ```
   $ aws configure sso
   SSO session name (Recommended): my-sso
   SSO start URL [None]: https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
   SSO region [None]: us-east-1
   SSO registration scopes [None]: sso:account:access
   ```

   从版本 **2.22.0** 开始，代码交换的证明密钥（PKCE）授权默认用于 AWS CLI，并且必须在带浏览器的设备上使用。要继续使用设备授权，请附加 `--use-device-code` 选项。

   ```
   $ aws configure sso --use-device-code
   ```

------
#### [ Legacy IAM Identity Center ]

   跳过该会话名称并提供 IAM Identity Center 启动 URL 以及托管 Identity Center 目录的 AWS 区域。

   ```
   $ aws configure sso
   SSO session name (Recommended):
   SSO start URL [None]: https://my-sso-portal.awsapps.com/start
   SSO region [None]:us-east-1
   ```

   对于双栈支持：

   ```
   $ aws configure sso
   SSO session name (Recommended):
   SSO start URL [None]: https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
   SSO region [None]:us-east-1
   ```

------

1. AWS CLI 将尝试打开您的默认浏览器，以便登录到您的 IAM Identity Center 账户。此过程可能会提示您允许 AWS CLI 访问您的数据。由于 AWS CLI 基于 SDK for Python 而构建，因此权限消息可能包含 `botocore` 名称的变体。
   + **如果 AWS CLI 无法打开浏览器**，则会显示手动启动登录过程的说明，具体取决于所使用的授权类型。

------
#### [ PKCE authorization ]

     从版本 2.22.0 开始，代码交换的证明密钥（PKCE）授权默认用于 AWS CLI。显示的 URL 是唯一 URL，开头为：
     + IPv4：*https://oidc.us-east-1.amazonaws.com/authorize*
     + 双栈：*https://oidc.us-east-1.api.aws/authorize*

     PKCE 授权 URL 必须在您登录到的同一台设备上打开，并且必须用于带浏览器的设备。

     ```
     Attempting to automatically open the SSO authorization page in your 
     default browser.
     If the browser does not open or you wish to use a different device to 
     authorize the request, open the following URL:
     
     https://oidc.us-east-1.amazonaws.com/authorize?<abbreviated>
     ```

------
#### [ Device authorization ]

     对于版本 2.22.0 之前的版本，AWS CLI 默认使用 OAuth 2.0 设备授权。对于更新的版本，您可以使用 `--use-device-code` 选项启用此方法。

     设备授权 URL 无需在您登录到的同一台设备上打开，并且可用于带或不带浏览器的设备。端点格式取决于您的配置：
     + IPv4：*https://device.sso.us-west-2.amazonaws.com/*
     + 双栈：*https://device.sso.us-west-2.api.aws/*

     ```
     If the browser does not open or you wish to use a different device to 
     authorize this request, open the following URL:
     https://device.sso.us-west-2.amazonaws.com/
     
     Then enter the code:
     QCFK-N451
     ```

------

1. 从所示列表中选择要使用的 AWS 账户。如果您只被授权使用一个账户，AWS CLI 会自动选择该账户并跳过提示。

   ```
   There are 2 AWS accounts available to you.
   > DeveloperAccount, developer-account-admin@example.com (123456789011) 
     ProductionAccount, production-account-admin@example.com (123456789022)
   ```

1. 从所示列表中选择要使用的 IAM 角色。如果只有一个角色可用，AWS CLI 会自动选择该角色并跳过提示。

   ```
   Using the account ID 123456789011
   There are 2 roles available to you.
   > ReadOnly
     FullAccess
   ```

1. 指定[默认输出格式](cli-configure-files.md#cli-config-output)、向其发送命令的[默认 AWS 区域](cli-configure-files.md#cli-config-region)，以及[配置文件的名称](cli-configure-files.md)。如果指定 `default` 作为配置文件名称，此配置文件将变为使用的默认配置文件。在以下示例中，用户输入默认区域、默认输出格式和配置文件的名称。

   ```
   Default client Region [None]: us-west-2<ENTER>
   CLI default output format (json if not specified) [None]: json<ENTER>
   Profile name [123456789011_ReadOnly]: my-dev-profile<ENTER>
   ```

1. 最后一条消息描述了完成的配置文件配置。现在，您可以使用此配置文件请求凭证。使用 `aws sso login` 命令请求和检索运行命令所需的凭证。有关说明，请参阅[登录到 IAM Identity Center 会话](#cli-configure-sso-login)。

### 生成的配置文件
<a name="cli-configure-sso-generated"></a>

执行这些步骤会在 `config` 文件中创建 `sso-session` 部分和命名配置文件，具体如下所示：

------
#### [ IAM Identity Center ]

```
[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 123456789011
sso_role_name = readOnly
region = us-west-2
output = json

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access
```

对于双栈支持：

```
[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 123456789011
sso_role_name = readOnly
region = us-west-2
output = json

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
sso_registration_scopes = sso:account:access
```

------
#### [ Legacy IAM Identity Center ]

```
[profile my-dev-profile]
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_region = us-east-1
sso_account_id = 123456789011
sso_role_name = readOnly
region = us-west-2
output = json
```

对于双栈支持：

```
[profile my-dev-profile]
sso_start_url = https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
sso_region = us-east-1
sso_account_id = 123456789011
sso_role_name = readOnly
region = us-west-2
output = json
```

------

## 使用 `aws configure sso-session` 向导仅配置您的 `sso-session` 部分
<a name="cli-configure-sso-session"></a>

**注意**  
此配置与旧版 IAM Identity Center 不兼容。

`aws configure sso-session` 命令会更新 `~/.aws/config` 文件中的 `sso-session` 部分。运行 `aws configure sso-session` 命令并提供 IAM Identity Center 启动 URL 或发布者 URL 以及托管 IAM Identity Center 目录的 AWS 区域。

```
$ aws configure sso-session
SSO session name: my-sso
SSO start URL [None]: https://my-sso-portal.awsapps.com/start
SSO region [None]: us-east-1
SSO registration scopes [None]: sso:account:access
```

要获得双栈支持，请使用双栈 SSO 起始 URL：

```
$ aws configure sso-session
SSO session name: my-sso
SSO start URL [None]: https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
SSO region [None]: us-east-1
SSO registration scopes [None]: sso:account:access
```

## 使用 `config` 文件手动配置
<a name="cli-configure-sso-manual"></a>

IAM Identity Center 配置信息存储在 `config` 文件中，可以使用文本编辑器对其进行编辑。要手动向命名配置文件中添加 IAM Identity Center 支持，必须向 `config` 文件中添加密钥和值。

### IAM Identity Center 配置文件
<a name="cli-configure-sso-manual-config"></a>

`config` 文件的 `sso-session` 部分用于对获取 SSO 访问令牌的配置变量进行分组，然后可以用来获取 AWS 凭证。使用了以下设置：
+ **（必需）**`sso\$1start\$1url`
+ **（必需）**`sso\$1region`
+ `sso\$1account\$1id`
+ `sso\$1role\$1name`
+ `sso\$1registration\$1scopes`

您可以定义 `sso-session` 部分并将其与配置文件相关联。必须在 `sso-session` 部分配置 `sso_region` 和 `sso_start_url` 设置。通常，必须在 `profile` 部分配置 `sso_account_id` 和 `sso_role_name` 设置，以便 SDK 可以请求 SSO 凭证。

以下示例将 SDK 配置为请求 SSO 凭证并支持自动令牌刷新：

```
[profile dev]
sso_session = my-sso
sso_account_id = 111122223333
sso_role_name = SampleRole

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
```

要获得双栈支持，请使用双栈 SSO 起始 URL 格式：

```
[profile dev]
sso_session = my-sso
sso_account_id = 111122223333
sso_role_name = SampleRole

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
```

这也允许在多个配置文件中重复使用 `sso-session` 配置：

```
[profile dev]
sso_session = my-sso
sso_account_id = 111122223333
sso_role_name = SampleRole

[profile prod]
sso_session = my-sso
sso_account_id = 111122223333
sso_role_name = SampleRole2

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
```

要获得双栈支持，请使用双栈 SSO 起始 URL 格式：

```
[profile dev]
sso_session = my-sso
sso_account_id = 111122223333
sso_role_name = SampleRole

[profile prod]
sso_session = my-sso
sso_account_id = 111122223333
sso_role_name = SampleRole2

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
```

但是，并不是所有 SSO 令牌配置场景都需要 `sso_account_id` 和 `sso_role_name`。如果您的应用程序仅使用支持持有者身份验证的 AWS 服务，则不需要传统 AWS 凭证。持有者身份验证是一种 HTTP 身份验证方案，它使用称为持有者令牌的安全令牌。在这种情况下，不需要 `sso_account_id` 和 `sso_role_name`。请参阅 AWS 服务的单独指南，以确定其是否支持持有者令牌授权。

此外，可以作为 `sso-session` 的一部分配置注册范围。范围是 OAuth 2.0 中的一种机制，用于限制应用程序对用户账户的访问。应用程序可以请求一个或多个范围，向应用程序签发的访问令牌将仅限于授予的范围。这些范围定义了为已注册的 OIDC 客户端请求授权的权限和客户端检索的访问令牌。以下示例将 `sso_registration_scopes` 设置为提供已列出账户/角色的访问权限：

```
[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access
```

对于双栈支持：

```
[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
sso_registration_scopes = sso:account:access
```

身份验证令牌缓存到 `sso/cache` 目录下的磁盘上，文件名基于会话名称。

### 遗留的 IAM Identity Center 配置文件
<a name="cli-configure-sso-manual-legacy"></a>

**注意**  
使用遗留的不可刷新配置不支持自动令牌刷新。建议使用 SSO 令牌配置。

要手动向命名配置文件中添加 IAM Identity Center 支持，必须将以下键和值添加到 `config` 文件中的配置文件定义中。
+ `sso\$1start\$1url`
+ `sso\$1region`
+ `sso\$1account\$1id`
+ `sso\$1role\$1name`

您可以在 `.aws/config` 文件中包括有效的任何其他键和值。下面是一个 IAM Identity Center 配置文件示例：

```
[profile my-sso-profile]
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_region = us-west-2
sso_account_id = 111122223333
sso_role_name = SSOReadOnlyRole
region = us-west-2
output = json
```

对于双栈支持：

```
[profile my-sso-profile]
sso_start_url = https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
sso_region = us-west-2
sso_account_id = 111122223333
sso_role_name = SSOReadOnlyRole
region = us-west-2
output = json
```

要运行命令，您必须首先[登录到 IAM Identity Center 会话](#cli-configure-sso-login)来请求和检索临时凭证。

有关 `config` 和 `credentials` 文件的更多信息，请参阅[AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)。

## 登录到 IAM Identity Center 会话
<a name="cli-configure-sso-login"></a>

**注意**  
登录过程可能会提示您允许 AWS CLI 访问您的数据。由于 AWS CLI 基于 SDK for Python 而构建，因此权限消息可能包含 `botocore` 名称的变体。

要检索和缓存一组 IAM Identity Center 凭证，请运行以下 AWS CLI 命令，打开您的默认浏览器并验证您的 IAM Identity Center 登录信息。

```
$ aws sso login --profile my-dev-profile
SSO authorization page has automatically been opened in your default browser. 
Follow the instructions in the browser to complete this authorization request.
Successfully logged into Start URL: https://my-sso-portal.awsapps.com/start
```

将缓存您的 IAM Identity Center 会话凭证，并且 AWS CLI 会使用它们安全地检索在配置文件中指定的用于 IAM 角色的 AWS 凭证。

### 如果 AWS CLI 无法打开您的浏览器
<a name="cli-configure-sso-login-browser"></a>

如果 AWS CLI 无法自动打开浏览器，则会显示手动启动登录过程的说明，具体取决于所使用的授权类型。

------
#### [ PKCE authorization ]

从版本 2.22.0 开始，代码交换的证明密钥（PKCE）授权默认用于 AWS CLI。显示的 URL 是唯一 URL，开头为：
+ IPv4：*https://oidc.us-east-1.amazonaws.com/authorize*
+ 双栈：*https://oidc.us-east-1.api.aws/authorize*

PKCE 授权 URL 必须在您登录到的同一台设备上打开，并且必须用于带浏览器的设备。

```
Attempting to automatically open the SSO authorization page in your 
default browser.
If the browser does not open or you wish to use a different device to 
authorize the request, open the following URL:

https://oidc.us-east-1.amazonaws.com/authorize?<abbreviated>
```

------
#### [ Device authorization ]

对于版本 2.22.0 之前的版本，AWS CLI 默认使用 OAuth 2.0 设备授权。对于更新的版本，您可以使用 `--use-device-code` 选项启用此方法。

设备授权 URL 无需在您登录到的同一台设备上打开，并且可用于带或不带浏览器的设备。

```
If the browser does not open or you wish to use a different device to 
authorize this request, open the following URL:
https://device.sso.us-west-2.amazonaws.com/

Then enter the code:
QCFK-N451
```

------

在使用 `aws sso login` 命令的 `--sso-session` 参数登录时，您还可以指定使用哪个 `sso-session` 配置文件。该 `sso-session` 选项不适用于旧版 IAM Identity Center。

```
$ aws sso login --sso-session my-dev-session
```

从版本 2.22.0 开始，默认使用 PKCE 授权。要使用设备授权进行登录，请添加 `--use-device-code` 选项。

```
$ aws sso login --profile my-dev-profile --use-device-code
```

身份验证令牌缓存到 `~/.aws/sso/cache` 目录下的磁盘上，其文件名基于 `sso_start_url`。

## 使用 IAM Identity Center 配置文件运行命令
<a name="cli-configure-sso-use"></a>

登录后，您可以使用您的凭证通过关联的命名配置文件来调用 AWS CLI 命令。以下示例显示使用配置文件的命令：

```
$ aws sts get-caller-identity --profile my-dev-profile
```

只要您登录 IAM Identity Center 并且这些缓存的凭证未过期，AWS CLI 就会在需要时自动续订过期的 AWS 凭证。但是，如果您的 IAM Identity Center 凭证过期，则必须通过再次登录您的 IAM Identity Center 账户来显式续订它们。

## 退出 IAM Identity Center 会话
<a name="cli-configure-sso-logout"></a>

使用完 IAM Identity Center 配置文件后，可以让凭证过期，或运行以下命令，删除缓存的凭证。

```
$ aws sso logout
Successfully signed out of all SSO profiles.
```

## 问题排查
<a name="cli-configure-sso-tshoot"></a>

如果您遇到 AWS CLI 使用问题，请参阅[排查 AWS CLI 错误](cli-chap-troubleshooting.md)以了解故障排除步骤。

## 相关资源
<a name="cli-configure-sso-resources"></a>

其他资源如下所示。
+ [AWS CLI 的 AWS IAM Identity Center 概念](cli-configure-sso-concepts.md)
+ [教程：使用 IAM 身份中心在 AWS CLI 中运行 Amazon S3 命令](cli-configure-sso-tutorial.md)
+ [安装或更新最新版本的 AWS CLI](getting-started-install.md)
+ [AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/configure/sso.html](https://docs.aws.amazon.com/cli/latest/reference/configure/sso.html)**
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/configure/sso-session.html](https://docs.aws.amazon.com/cli/latest/reference/configure/sso-session.html)**
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/sso/login.html](https://docs.aws.amazon.com/cli/latest/reference/sso/login.html)**
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/sso/logout.html](https://docs.aws.amazon.com/cli/latest/reference/sso/logout.html)**
+ 《Amazon CodeCatalyst 用户指南》**中的[设置为将 AWS CLI 与 CodeCatalyst 一起使用](https://docs.aws.amazon.com/codecatalyst/latest/userguide/set-up-cli.html)
+ 《IAM Identity Center 用户指南》**中的 [OAuth 2.0 访问范围](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html#oidc-concept)
+ 《IAM Identity Center 用户指南》**中的[入门教程](https://docs.aws.amazon.com/singlesignon/latest/userguide/tutorials.html)

# AWS CLI 的 AWS IAM Identity Center 概念
<a name="cli-configure-sso-concepts"></a>

本主题介绍 AWS IAM Identity Center（IAM Identity Center）的关键概念。IAM Identity Center 是一项基于云的 IAM 服务，通过与现有身份提供者（IdP）集成，可简化多个 AWS 账户、SDK 和工具的用户访问管理。它通过集中式用户门户实现安全的单点登录、权限管理和审计，从而简化了组织的身份和访问管理。

**Topics**
+ [什么是 IAM Identity Center](#cli-configure-sso-concepts-what)
+ [术语](#cli-configure-sso-terms)
+ [IAM Identity Center 的工作原理](#cli-configure-sso-concepts-process)
+ [其他资源](#cli-configure-sso-concepts-resources)

## 什么是 IAM Identity Center
<a name="cli-configure-sso-concepts-what"></a>

IAM Identity Center 是一项基于云的身份和访问管理（IAM）服务，可帮助您集中管理对多个 AWS 账户和业务应用程序的访问。

它提供一个用户门户，授权用户可以在该门户中使用其现有的公司凭证访问 AWS 账户和获得相应权限的应用程序。这使组织能够实施一致的安全策略并简化用户访问管理。

无论您使用哪个 IdP，IAM Identity Center 都会将这些区别抽象出来。例如，您可以连接 Microsoft Azure AD，如博客文章 [IAM Identity Center 的下一个演进](https://aws.amazon.com/blogs/aws/the-next-evolution-in-aws-single-sign-on/)中所述。

**注意**  
有关使用持有者身份验证（不使用账户 ID 和角色）的信息，请参阅《Amazon CodeCatalyst 用户指南》中**的[进行设置以将 AWS CLI 与 CodeCatalyst 一起使用](https://docs.aws.amazon.com/codecatalyst/latest/userguide/set-up-cli.html)。

## 术语
<a name="cli-configure-sso-terms"></a>

使用 IAM Identity Center 时的常用术语如下所示：

**身份提供者（IdP）**  
一个身份管理系统，例如 IAM Identity Center、Microsoft Azure AD、Okta 或您自己的公司目录服务。

**AWS IAM Identity Center**  
IAM Identity Center 是 AWS 自有的 IdP 服务。SDK 和工具以前称为 AWS 单点登录，它们保留了 `sso` API 命名空间以实现向后兼容。有关更多信息，请参阅《AWS IAM Identity Center 用户指南》**中的 [IAM Identity Center 重命名](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html#renamed)。

**AWS 访问门户 URL、SSO 启动 URL、启动 URL**  
您组织唯一的 IAM Identity Center URL，用于访问您的授权 AWS 账户、服务和资源。

**发布者 URL**  
您组织唯一的 IAM Identity Center 发布者 URL，用于通过编程方式访问您的授权 AWS 账户、服务和资源。从版本 2.22.0 的 AWS CLI 开始，发布者 URL 可以与启动 URL 互换使用。

**联合身份验证**  
在 IAM Identity Center 和身份提供者之间建立信任以启用单点登录（SSO）的过程。

**AWS 账户**  
您通过 AWS IAM Identity Center 为用户提供访问权的 AWS 账户。

**权限集、AWS 凭证、凭证、sigv4 凭证**  
预定义的权限集合，可以将其分配给用户或组以授予对 AWS 服务 的访问权限。

**注册范围、访问范围、范围**  
范围是 OAuth 2.0 中的一种机制，用于限制应用程序对用户账户的访问。应用程序可以请求一个或多个范围，向应用程序签发的访问令牌将仅限于授予的范围。有关范围的信息，请参阅《IAM Identity Center 用户指南》**中的[访问范围](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html#oidc-concept)。

**令牌、刷新令牌、访问令牌**  
令牌是在身份验证时向您颁发的临时安全凭证。这些令牌包含有关您的身份和您被授予的权限的信息。  
当您通过 IAM Identity Center 门户访问 AWS 资源或应用程序时，系统会将您的令牌提供给 AWS 以进行身份验证和授权。这使得 AWS 能够验证您的身份，并确保您具有执行所请求操作所需的权限。  
身份验证令牌缓存在磁盘上的 `~/.aws/sso/cache` 目录下，JSON 文件名基于会话名称。

**会话**  
IAM Identity Center 会话是指用户通过身份验证并获得访问 AWS 资源或应用程序的授权的时间段。当用户登录 IAM Identity Center 门户时，即会建立会话，并且该用户的令牌在指定的持续时间内有效。有关设置会话持续时间的更多信息，请参阅《AWS IAM Identity Center 用户指南》**中的[设置会话持续时间](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtosessionduration.html)。  
在会话期间，只要不同 AWS 账户和应用程序的会话保持活动状态，您就可以在这些账户和应用程序之间导航，而无需重新进行身份验证。会话到期后，请重新登录以续订您的访问权限。  
IAM Identity Center 会话可帮助提供无缝的用户体验，同时还可以通过限制用户访问证书的有效性来强制实施最佳安全实践。

**具有 PKCE（代码交换的证明密钥）的授权代码授予**  
从版本 2.22.0 开始，代码交换的证明密钥（PKCE）是适用于带浏览器的设备的 OAuth 2.0 身份验证授予流程。利用 PKCE，可在桌面设备和移动设备上使用 Web 浏览器轻松安全地进行身份验证并获得对您的 AWS 资源的访问权限。这是默认授权行为。有关 PKCE 的更多信息，请参阅《AWS IAM Identity Center 用户指南》**中的[具有 PKCE 的授权代码授予](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html#auth-code-grant-pkce)。

**设备授权授予**  
适用于带或不带 Web 浏览器的设备的 OAuth 2.0 身份验证授予流程。有关设置会话持续时间的更多信息，请参阅《AWS IAM Identity Center 用户指南》**中的[设备授权授予](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html#device-auth-grant)。

## IAM Identity Center 的工作原理
<a name="cli-configure-sso-concepts-process"></a>

IAM Identity Center 可与组织的身份提供者（例如 IAM Identity Center、Microsoft Azure AD 或 Okta）集成。用户对该身份提供者进行身份验证，然后 IAM Identity Center 会将这些身份映射到您的 AWS 环境中的相应权限和访问权限。

以下 IAM Identity Center 工作流假设您已将 AWS CLI 配置为使用 IAM Identity Center：

1. 在首选终端中运行 `aws sso login` 命令。

1. 登录 AWS 访问门户，启动新会话。
   + 启动新会话时，您将收到刷新令牌和缓存的访问令牌。
   + 如果您已经有一个活动会话，将重用现有会话并且该会话将在现有会话过期时过期。

1. 根据您在 `config` 文件中设置的配置文件，IAM Identity Center 将采用相应的权限集，以便授予对相关 AWS 账户和应用程序的访问权限。

1. AWS CLI、SDK 和工具使用您担任的 IAM 角色调用 AWS 服务（例如创建 Amazon S3 存储桶），直到该会话过期。

1. 系统每小时检查一次来自 IAM Identity Center 的访问令牌，并使用刷新令牌自动刷新该访问令牌。
   + 如果访问令牌已过期，SDK 或工具将使用刷新令牌来尝试获取新的访问令牌。然后比较这些令牌的会话持续时间，如果刷新令牌未过期，IAM Identity Center 将提供新的访问令牌。
   + 如果刷新令牌已过期，则不会提供新的访问令牌，并且您的会话已结束。

1. 会话将在刷新令牌过期后，或者当您使用 `aws sso logout` 命令手动注销时结束。缓存的凭证将被删除。要继续使用 IAM Identity Center 访问服务，您必须使用 `aws sso login` 命令启动新会话。

## 其他资源
<a name="cli-configure-sso-concepts-resources"></a>

其他资源如下所示。
+ [使用 AWS CLI 配置 IAM Identity Center 身份验证](cli-configure-sso.md)
+ [教程：使用 IAM 身份中心在 AWS CLI 中运行 Amazon S3 命令](cli-configure-sso-tutorial.md)
+ [安装或更新最新版本的 AWS CLI](getting-started-install.md)
+ [AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/configure/sso.html](https://docs.aws.amazon.com/cli/latest/reference/configure/sso.html)**
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/configure/sso-session.html](https://docs.aws.amazon.com/cli/latest/reference/configure/sso-session.html)**
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/sso/login.html](https://docs.aws.amazon.com/cli/latest/reference/sso/login.html)**
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/sso/logout.html](https://docs.aws.amazon.com/cli/latest/reference/sso/logout.html)**
+ 《Amazon CodeCatalyst 用户指南》**中的[设置为将 AWS CLI 与 CodeCatalyst 一起使用](https://docs.aws.amazon.com/codecatalyst/latest/userguide/set-up-cli.html)
+ 《AWS IAM Identity Center 用户指南》**中的 [IAM Identity Center 重命名](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html#renamed)
+ 《IAM Identity Center 用户指南》**中的 [OAuth 2.0 访问范围](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html#oidc-concept)
+ 《AWS IAM Identity Center 用户指南》**中的[设置会话持续时间](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtosessionduration.html)
+ 《IAM Identity Center 用户指南》**中的[入门教程](https://docs.aws.amazon.com/singlesignon/latest/userguide/tutorials.html)

# 教程：使用 IAM 身份中心在 AWS CLI 中运行 Amazon S3 命令
<a name="cli-configure-sso-tutorial"></a>

本主题介绍如何配置 AWS CLI，通过使用当前 AWS IAM Identity Center（IAM Identity Center）验证用户身份，来获取针对 Amazon Simple Storage Service（Amazon S3）运行 AWS Command Line Interface（AWS CLI）命令的凭证。

**Topics**
+ [步骤 1：使用 IAM Identity Center 进行身份验证](#cli-configure-sso-tutorial-authentication)
+ [步骤 2：收集 IAM Identity Center 信息](#cli-configure-sso-tutorial-gather)
+ [步骤 3：创建 Amazon S3 存储桶](#cli-configure-sso-tutorial-buckets)
+ [第 4 步：安装 AWS CLI](#cli-configure-sso-tutorial-install)
+ [步骤 5：配置 AWS CLI 配置文件](#cli-configure-sso-tutorial-configure)
+ [步骤 6：登录到 IAM Identity Center](#cli-configure-sso-tutorial-login.title)
+ [步骤 7：运行 Amazon S3 命令](#cli-configure-sso-tutorial-commands)
+ [步骤 8：注销 IAM Identity Center](#cli-configure-sso-tutorial-logout)
+ [步骤 9：清理资源](#cli-configure-sso-tutorial-cleanup)
+ [问题排查](#cli-configure-sso-tutorial-tshoot)
+ [其他资源](#cli-configure-sso-tutorial-resources.title)

## 步骤 1：使用 IAM Identity Center 进行身份验证
<a name="cli-configure-sso-tutorial-authentication"></a>

获取在 IAM Identity Center 中访问 SSO 身份验证的权限。选择下列方法之一来访问您的 AWS 凭证。

### 我尚未通过 IAM Identity Center 确立访问权限
<a name="idc-access"></a>

请按照《AWS IAM Identity Center 用户指南》**的[入门](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)中的说明操作。此过程激活 IAM Identity Center，创建管理用户并添加适当的最低权限集。

**注意**  
创建应用最低权限的权限集。除非您的雇主已为此目的创建自定义权限集，否则建议使用预定义的 `PowerUserAccess` 权限集。

退出门户并重新登录以查看您的 AWS 账户、编程访问详细信息以及 `Administrator` 和 `PowerUserAccess` 选项。在使用开发工具包时选择 `PowerUserAccess`。

### 我已通过我的雇主管理的联邦身份提供者（例如 Azure AD 或 Okta）获得对 AWS 的访问权限
<a name="federated-access"></a>

通过身份提供者的门户登录 AWS。如果您的云管理员已向您授予 `PowerUserAccess`（开发人员）权限，您将看到您有权访问的 AWS 账户和您的权限集。在您的权限集名称旁边，可以看到有关使用该权限集手动或以编程方式访问账户的选项。

自定义实现可能会产生不同的体验，例如不同的权限集名称。如果您不确定要使用哪个权限集，请联系 IT 团队以寻求帮助。

### 我已通过雇主管理的 AWS 访问门户获得对 AWS 的访问权限
<a name="accessportal-access"></a>

通过您的 AWS 访问门户登录到 AWS。如果您的云管理员已向您授予 `PowerUserAccess`（开发人员）权限，您将看到您有权访问的 AWS 账户和您的权限集。在您的权限集名称旁边，可以看到有关使用该权限集手动或以编程方式访问账户的选项。

### 我已通过我的雇主管理的联合自定义身份提供者获得对 AWS 的访问权限
<a name="customfederated-access"></a>

请联系您的 IT 团队以寻求帮助。

## 步骤 2：收集 IAM Identity Center 信息
<a name="cli-configure-sso-tutorial-gather"></a>

获得对 AWS 访问权限后，通过执行以下操作收集 IAM Identity Center 信息：

1. 收集运行 `aws configure sso` 所需的 `SSO Start URL` 和 `SSO Region` 值

   1. 在 AWS 访问门户中，选择用于开发的权限集，然后选择**访问密钥**链接。

   1. 在**获取凭证**对话框中，选择与您的操作系统匹配的选项卡。

   1. 选择 **IAM Identity Center 凭证**方法以获取 `SSO Start URL` 和 `SSO Region` 值。

1. 或者，从版本 2.22.0 开始，您可以使用新的发布者 URL 来代替启动 URL。发布者 URL 位于 AWS IAM Identity Center 控制台上的下列位置之一：
   + 在**控制面板**页面上，发布者 URL 位于设置摘要中。
   + 在**设置**页面上，发布者 URL 位于**身份源**设置中。

1. 有关要注册哪些范围值的信息，请参阅《IAM Identity Center 用户指南》**中的 [OAuth 2.0 访问范围](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html#oidc-concept)。

## 步骤 3：创建 Amazon S3 存储桶
<a name="cli-configure-sso-tutorial-buckets"></a>

登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

在本教程中，创建几个存储桶，以便稍后在列表中检索。

## 第 4 步：安装 AWS CLI
<a name="cli-configure-sso-tutorial-install"></a>

要安装 AWS CLI，请按照适用操作系统的说明操作。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md)。

安装完成后，可以通过打开首选终端并运行以下命令来验证安装情况。这应该会显示您已安装的 AWS CLI 版本。

```
$ aws --version
```

## 步骤 5：配置 AWS CLI 配置文件
<a name="cli-configure-sso-tutorial-configure"></a>

使用以下方法之一配置您的配置文件

### 使用 `aws configure sso` 向导配置您的配置文件
<a name="li-configure-sso-tutorial-configure-wizard"></a>

`config` 文件的 `sso-session` 部分用于对获取 SSO 访问令牌的配置变量进行分组，然后可以用来获取 AWS 凭证。使用了以下设置：
+ **（必需）**`sso\$1start\$1url`
+ **（必需）**`sso\$1region`
+ `sso\$1account\$1id`
+ `sso\$1role\$1name`
+ `sso\$1registration\$1scopes`

您可以定义 `sso-session` 部分并将其与配置文件相关联。必须在 `sso-session` 部分配置 `sso_region` 和 `sso_start_url` 设置。通常，必须在 `profile` 部分配置 `sso_account_id` 和 `sso_role_name` 设置，以便 SDK 可以请求 SSO 凭证。

以下示例将 SDK 配置为请求 SSO 凭证并支持自动令牌刷新：

```
$ aws configure sso
SSO session name (Recommended): my-sso
SSO start URL [None]: https://my-sso-portal.awsapps.com/start
SSO region [None]: us-east-1
SSO registration scopes [None]: sso:account:access
```

要获得双栈支持，您可以使用双栈 SSO 起始 URL 格式：

```
$ aws configure sso
SSO session name (Recommended): my-sso
SSO start URL [None]: https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
SSO region [None]: us-east-1
SSO registration scopes [None]: sso:account:access
```

从版本 2.22.0 开始，代码交换的证明密钥（PKCE）授权默认用于 AWS CLI，并且必须在带浏览器的设备上使用。要继续使用设备授权，请附加 `--use-device-code` 选项。

```
$ aws configure sso --use-device-code
```

### 使用 `config` 文件手动配置
<a name="cli-configure-sso-tutorial-configure-manual"></a>

`config` 文件的 `sso-session` 部分用于对获取 SSO 访问令牌的配置变量进行分组，然后可以用来获取 AWS 凭证。使用了以下设置：
+ **（必需）**`sso\$1start\$1url`
+ **（必需）**`sso\$1region`
+ `sso\$1account\$1id`
+ `sso\$1role\$1name`
+ `sso\$1registration\$1scopes`

您定义一个 `sso-session` 部分并将其关联到配置文件。必须在 `sso-session` 部分内设置 `sso_region` 和 `sso_start_url`。通常，`sso_account_id` 和 `sso_role_name` 必须在 `profile` 部分进行设置，以便 SDK 可以请求 SSO 凭证。

以下示例将 SDK 配置为请求 SSO 凭证并支持自动令牌刷新：

```
[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 111122223333
sso_role_name = SampleRole

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access
```

要获得双栈支持，请使用双栈 SSO 起始 URL 格式：

```
[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 111122223333
sso_role_name = SampleRole

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://ssoins-1234567890abcdef.portal.us-east-1.app.aws
sso_registration_scopes = sso:account:access
```

身份验证令牌缓存到 `~/.aws/sso/cache` 目录下的磁盘上，文件名基于会话名称。

## 步骤 6：登录到 IAM Identity Center
<a name="cli-configure-sso-tutorial-login.title"></a>

**注意**  
登录过程可能会提示您允许 AWS CLI 访问您的数据。由于 AWS CLI 基于 SDK for Python 而构建，因此权限消息可能包含 `botocore` 名称的变体。

要检索和缓存您的 IAM Identity Center 凭证，请在 AWS CLI 中运行以下命令，打开您的默认浏览器并验证您的 IAM Identity Center 登录信息。

```
$ aws sso login --profile my-dev-profile
```

从版本 2.22.0 开始，默认使用 PKCE 授权。要使用设备授权进行登录，请添加 `--use-device-code` 选项。

```
$ aws sso login --profile my-dev-profile --use-device-code
```

## 步骤 7：运行 Amazon S3 命令
<a name="cli-configure-sso-tutorial-commands"></a>

要列出您之前创建的存储桶，请使用 [https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html](https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html) 命令。以下示例列出您的所有 Amazon S3 存储桶。

```
$ aws s3 ls
2018-12-11 17:08:50 my-bucket
2018-12-14 14:55:44 my-bucket2
```

## 步骤 8：注销 IAM Identity Center
<a name="cli-configure-sso-tutorial-logout"></a>

使用完您的 IAM Identity Center 配置文件后，可运行以下命令删除缓存凭证。

```
$ aws sso logout
Successfully signed out of all SSO profiles.
```

## 步骤 9：清理资源
<a name="cli-configure-sso-tutorial-cleanup"></a>

完成本教程后，请清理在本教程中创建的所有不再需要的资源，包括 Amazon S3 存储桶。

## 问题排查
<a name="cli-configure-sso-tutorial-tshoot"></a>

如果您遇到 AWS CLI 使用问题，请参阅[排查 AWS CLI 错误](cli-chap-troubleshooting.md)了解故障排除步骤。

## 其他资源
<a name="cli-configure-sso-tutorial-resources.title"></a>

其他资源如下所示。
+ [AWS CLI 的 AWS IAM Identity Center 概念](cli-configure-sso-concepts.md)
+ [使用 AWS CLI 配置 IAM Identity Center 身份验证](cli-configure-sso.md)
+ [安装或更新最新版本的 AWS CLI](getting-started-install.md)
+ [AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/configure/sso.html](https://docs.aws.amazon.com/cli/latest/reference/configure/sso.html)**
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/configure/sso-session.html](https://docs.aws.amazon.com/cli/latest/reference/configure/sso-session.html)**
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/sso/login.html](https://docs.aws.amazon.com/cli/latest/reference/sso/login.html)**
+ 《AWS CLI 版本 2 中参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/sso/logout.html](https://docs.aws.amazon.com/cli/latest/reference/sso/logout.html)**
+ 《Amazon CodeCatalyst 用户指南》**中的[设置为将 AWS CLI 与 CodeCatalyst 一起使用](https://docs.aws.amazon.com/codecatalyst/latest/userguide/set-up-cli.html)
+ 《IAM Identity Center 用户指南》**中的 [OAuth 2.0 访问范围](https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html#oidc-concept)
+ 《IAM Identity Center 用户指南》**中的[入门教程](https://docs.aws.amazon.com/singlesignon/latest/userguide/tutorials.html)

# 在 AWS CLI 中使用短期凭证进行身份验证
<a name="cli-authentication-short-term"></a>

建议将您的 SDK 或工具配置为使用带延长会话持续时间选项的 [IAM Identity Center 身份验证](https://docs.aws.amazon.com/sdkref/latest/guide/access-sso.html)。但是，您可以复制和使用 AWS 访问门户中提供的临时凭证。在这些临时凭证过期后，将需要复制新凭证。您可以在配置文件中使用临时凭证，也可以将其用作系统属性和环境变量的值。

1. [登录到 AWS 访问门户](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtosignin.html)。

1. 按照[以下说明](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtogetcredentials.html)操作，从 AWS 访问门户中复制 IAM 角色凭证。

   1. 对于链接的说明中的步骤 2，选择可授予访问权限以满足您的开发需求的 AWS 账户和 IAM 角色名称。此角色的名称通常类似于 **PowerUserAccess** 或 **Developer**。

   1. 对于步骤 4，选择**将配置文件添加到您的 AWS 凭证文件**选项并复制内容。

1. 创建或打开共享 `credentials` 文件。此文件在 Linux 和 macOS 系统上为 `~/.aws/credentials`，在 Windows 上为 `%USERPROFILE%\.aws\credentials`。有关更多信息，请参阅 [AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)。

1. 将以下文本添加到共享 `credentials` 文件中。将示例值替换为您复制的凭证。

   ```
   [default] 
   aws_access_key_id = AKIAIOSFODNN7EXAMPLE 
   aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   aws_session_token = IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZVERYLONGSTRINGEXAMPLE
   ```

1. 将您的首选默认区域和格式添加到共享 `config` 文件中。

   ```
   [default]
   region=us-west-2
   output=json
   
   [profile user1]
   region=us-east-1
   output=text
   ```

当 SDK 创建服务客户端时，它将访问这些临时凭证并将它们用于每个请求。在步骤 2a 中选择的 IAM 角色的设置决定了[临时凭证的有效时间](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtosessionduration.html)。最长持续时间为 12 小时。

每次您的凭证到期时都重复这些步骤。

# 在 AWS CLI 中使用 IAM 角色
<a name="cli-configure-role"></a>

[AWS Identity and Access Management（IAM）角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)是一种授权工具，可让用户获得额外（或不同）的权限或者获取使用其他 AWS 账户执行操作的权限。

**Topics**
+ [先决条件](#cli-role-prereqs)
+ [IAM 角色的用法概览](#cli-role-overview)
+ [配置和使用角色](#cli-role-prepare)
+ [使用多重验证](#cli-configure-role-mfa)
+ [跨账户角色和外部 ID](#cli-configure-role-xaccount)
+ [指定角色会话名称以便于审核](#cli-configure-role-session-name)
+ [通过 Web 身份代入角色](#cli-configure-role-oidc)
+ [清除缓存的凭证](#cli-configure-role-cache)

## 先决条件
<a name="cli-role-prereqs"></a>

要运行 `iam` 命令，您需要安装和配置 AWS CLI。这包括设置已配置的配置文件，因为假设一个角色与其他凭证方法配对。有关更多信息，请参阅[安装或更新最新版本的 AWS CLI](getting-started-install.md)。

## IAM 角色的用法概览
<a name="cli-role-overview"></a>

通过在 `~/.aws/config` 文件中为某个 IAM 角色定义配置文件，您可以配置 AWS Command Line Interface (AWS CLI) 以使用该 IAM 角色。

以下示例显示了一个名为 `marketingadmin` 的角色配置文件。如果使用 `--profile marketingadmin`（或使用 [AWS\$1PROFILE 环境变量](cli-configure-envvars.md)指定它）运行命令，则 AWS CLI 使用在单独的配置文件 `user1` 中定义的凭证代入 Amazon Resource Name (ARN) 为 `arn:aws:iam::123456789012:role/marketingadminrole` 的角色。您可以运行分配给该角色的权限所允许的任何操作。

```
[profile marketingadmin]
role_arn = arn:aws:iam::123456789012:role/marketingadminrole
source_profile = user1
```

然后，您可以指定一个指向单独的命名配置文件的 `source_profile`，此配置文件包含用户凭证及使用该角色的权限。在上一个示例中，`marketingadmin` 配置文件使用 `user1` 配置文件中的凭证。当您指定某个 AWS CLI 命令将使用配置文件 `marketingadmin` 时，AWS CLI 会自动查找链接的 `user1` 配置文件的凭证，并使用它们为指定的 IAM 角色请求临时凭证。CLI 在后台使用 [sts:AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 操作来完成该操作。然后，使用这些临时凭证来运行请求的 AWS CLI 命令。指定的角色必须附加有允许运行请求的 AWS CLI 命令的 IAM 权限策略。

要从 Amazon Elastic Compute Cloud (Amazon EC2) 实例或 Amazon Elastic Container Service (Amazon ECS) 容器中运行 AWS CLI 命令，您可以使用附加到实例配置文件或容器的 IAM 角色。如果未指定配置文件或未设置环境变量，则将直接使用该角色。这让您能够避免在实例上存储长时间生存的访问密钥。您也可以使用这些实例或容器角色仅获取其他角色的凭证。为此，请使用 `credential_source`（而不是 `source_profile`）指定如何查找凭证。`credential_source` 属性支持以下值：
+ `Environment` – 从环境变量检索源凭证。
+ `Ec2InstanceMetadata` – 使用附加到 Amazon EC2 实例配置文件的 IAM 角色。
+ `EcsContainer` – 使用附加到 Amazon ECS 容器的 IAM 角色。

以下示例显示通过引用 Amazon EC2 实例配置文件来使用同一个 `marketingadminrole` 角色。

```
[profile marketingadmin]
role_arn = arn:aws:iam::123456789012:role/marketingadminrole
credential_source = Ec2InstanceMetadata
```

当您调用角色时，您可以要求使用其他选项，例如，使用多重身份验证和外部 ID（供第三方公司用于访问其客户的资源）。也可以指定更易于在 AWS CloudTrail 日志中进行审核的唯一角色会话名称。

## 配置和使用角色
<a name="cli-role-prepare"></a>

在使用指定 IAM 角色的配置文件运行命令时，AWS CLI 将使用源配置文件的凭证调用 AWS Security Token Service (AWS STS) 并为指定角色请求临时凭证。源配置文件中的用户必须具有为指定配置文件中的角色调用 `sts:assume-role` 的权限。该角色必须具有允许源配置文件中的用户使用角色的信任关系。检索角色的临时凭证然后使用临时凭证的过程通常称为*代入角色*。

您可以通过执行《AWS Identity and Access Management 用户指南》**中的[创建向 IAM 用户委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)下的过程，在 IAM 中创建一个您希望用户代入的具有该权限的角色。如果该角色和源配置文件的 用户在同一个账户中，在配置角色的信任关系时，您可以输入自己的账户 ID。

在创建角色后，请修改信任关系以允许 用户担任该角色。

以下示例显示了一个可附加到角色的信任策略。该策略允许账户 123456789012 中的任何用户代入该角色，***前提***是该账户的管理员向该用户显式授予了 `sts:AssumeRole` 权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

信任策略不会实际授予权限。账户管理员必须通过附加具有适当权限的策略才能将代入角色的权限委派给各个用户。以下示例显示了一个可附加到用户的策略，该策略仅允许用户代入 `marketingadminrole` 角色。有关授予用户代入角色的访问权限的更多信息，请参阅 *IAM 用户指南*中的[向用户授予切换角色的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::123456789012:role/marketingadminrole"
    }
  ]
}
```

------

用户无需拥有附加权限，即可使用角色配置文件运行 AWS CLI 命令。相反，运行命令的权限来自附加到*角色* 的权限。您可以将权限策略附加到角色，以指定可以针对哪些 AWS 资源执行哪些操作。有关向角色附加权限（与向用户附加权限的操作相同）的更多信息，请参阅《IAM 用户指南》**中的[更改 IAM 用户的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html)。

既然您已正确地配置角色配置文件、角色权限、角色信任关系和用户权限，那么就可以通过调用 `--profile` 选项在命令行中使用该角色了。例如，下面的内容使用附加到 `ls` 角色（由本主题开头的示例定义）的权限调用 Amazon S3 `marketingadmin` 命令。

```
$ aws s3 ls --profile marketingadmin
```

要对多个调用使用角色，您可以从命令行设置当前会话的 `AWS_PROFILE` 环境变量。定义该环境变量后，就不必对每个命令都指定 `--profile` 选项。

**Linux 或 macOS**

```
$ export AWS_PROFILE=marketingadmin
```

**Windows**

```
C:\> setx AWS_PROFILE marketingadmin
```

有关配置用户和角色的更多信息，请参阅《IAM 用户指南》**中的 [IAM 身份（用户、用户组和角色）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)和 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id-roles.html)。

## 使用多重验证
<a name="cli-configure-role-mfa"></a>

为了提高安全性，当用户尝试使用角色配置文件进行调用时，您可以要求用户提供从多重验证 (MFA) 设备（一种 U2F 设备）或移动应用程序生成的一次性密钥。

首先，您可以选择将与 IAM 角色有关的信任关系修改为需要 MFA。这可以防止任何人在未首先使用 MFA 进行身份验证的情况下使用该角色。有关示例，请参阅下面示例中的 `Condition` 行。此策略允许名为 `anika` 的用户代入策略所附加的角色，但前提是用户使用 MFA 进行身份验证。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:user/anika" },
      "Action": "sts:AssumeRole",
      "Condition": { "Bool": { "aws:multifactorAuthPresent": true } }
    }
  ]
}
```

------

其次，为角色配置文件添加一行，用来指定用户的 MFA 设备的 ARN。以下示例 `config` 文件条目显示两个角色配置文件，它们都使用用户 `anika` 的访问密钥来请求角色 `cli-role` 的临时凭证。用户 `anika` 有权代入角色，这是由角色的信任策略授予的。

```
[profile role-without-mfa]
region = us-west-2
role_arn= arn:aws:iam::128716708097:role/cli-role
source_profile=cli-user

[profile role-with-mfa]
region = us-west-2
role_arn= arn:aws:iam::128716708097:role/cli-role
source_profile = cli-user
mfa_serial = arn:aws:iam::128716708097:mfa/cli-user

[profile cli-user]
region = us-west-2
output = json
```

该 `mfa_serial` 设置可以采取如图所示的 ARN 或硬件 MFA 令牌的序列号。

第一个配置文件 `role-without-mfa` 不需要 MFA。但是，由于附加到角色的先前示例信任策略需要 MFA，因此使用此配置文件运行命令的任何尝试都将失败。

```
$ aws iam list-users --profile role-without-mfa

An error occurred (AccessDenied) when calling the AssumeRole operation: Access denied
```

第二个配置文件条目 `role-with-mfa` 标识要使用的 MFA 设备。当此用户尝试使用此配置文件运行 AWS CLI 命令时，AWS CLI 会提示用户输入 MFA 设备提供的一次性密码 (OTP)。如果 MFA 身份验证成功，此命令将执行所请求的操作。OTP 未显示在屏幕上。

```
$ aws iam list-users --profile role-with-mfa
Enter MFA code for arn:aws:iam::123456789012:mfa/cli-user:
{
    "Users": [
        {
            ...
```

## 跨账户角色和外部 ID
<a name="cli-configure-role-xaccount"></a>

通过将角色配置为跨账户角色，您可以让 用户使用属于不同账户的角色。在创建角色期间，将角色类型设置为**其他AWS账户**（[如创建向 IAM 用户委派权限的角色中所述](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)）。（可选）选择 **Require MFA (需要 MFA)**。**Require MFA (需要 MFA)** 将按照 [使用多重验证](#cli-configure-role-mfa) 中所述在信任关系中配置相应条件。

如果使用[外部 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) 来加强控制可跨账户使用角色的人员，则还必须将 `external_id` 参数添加到角色配置文件。通常情况下，仅应在其他账户由公司或组织外部的人员控制时才使用该功能。

```
[profile crossaccountrole]
role_arn = arn:aws:iam::234567890123:role/SomeRole
source_profile = default
mfa_serial = arn:aws:iam::123456789012:mfa/saanvi
external_id = 123456
```

## 指定角色会话名称以便于审核
<a name="cli-configure-role-session-name"></a>

当许多人共享一个角色时，审核会变得比较困难。您希望将调用的每个操作与调用该操作的个人关联。但是，当个人使用角色时，个人代入角色是一项独立于调用操作的行为，您必须手动将这两者关联起来。

通过在用户代入角色时指定唯一的角色会话名称，您可以简化此过程。只需向指定某一角色的 `role_session_name` 文件中的每个命名配置文件添加 `config` 参数，即可实现这一点。`role_session_name` 值将传递给 `AssumeRole` 操作，并成为角色会话 ARN 的一部分。该值也包含在所有已记录操作的 AWS CloudTrail 日志中。

例如，您可以创建基于角色的配置文件，如下所示。

```
[profile namedsessionrole]
role_arn = arn:aws:iam::234567890123:role/SomeRole
source_profile = default
role_session_name = Session_Maria_Garcia
```

这会导致角色会话具有以下 ARN。

```
arn:aws:iam::234567890123:assumed-role/SomeRole/Session_Maria_Garcia
```

此外，所有 AWS CloudTrail 日志都在为每个操作捕获的信息中包含角色会话名称。

## 通过 Web 身份代入角色
<a name="cli-configure-role-oidc"></a>

您可以配置一个配置文件，以指示 AWS CLI 应使用 [Web 联合身份验证和 Open ID Connect (OIDC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html) 代入角色。当您在配置文件中指定此选项时，AWS CLI 会自动为您发出相应的 AWS STS `AssumeRoleWithWebIdentity` 调用。

**注意**  
当您指定使用 IAM 角色的配置文件时，AWS CLI 会发出相应的调用来检索临时凭证。这些凭证存储在 `~/.aws/cli/cache` 中。指定同一个配置文件的后续 AWS CLI 命令将使用缓存的临时凭证，直到它们过期。这时，AWS CLI 将自动刷新这些凭证。

要通过 Web 联合身份验证检索和使用临时凭证，您可以在共享配置文件中指定以下配置值。

[role\$1arn](#cli-configure-role)  
指定要代入的角色的 ARN。

web\$1identity\$1token\$1file  
指定一个文件的路径，该文件包含由身份提供者提供的 OAuth 2.0 访问令牌或 OpenID Connect ID 令牌。AWS CLI 加载此文件，并将其内容作为 `WebIdentityToken` 操作的 `AssumeRoleWithWebIdentity` 参数传递。

[role\$1session\$1name](#cli-configure-role-session-name)  
指定应用于此代入角色会话的可选名称。

以下是使用 Web 身份配置文件配置代入角色所需的最少量配置的示例。

```
# In ~/.aws/config

[profile web-identity]
role_arn=arn:aws:iam:123456789012:role/RoleNameToAssume
web_identity_token_file=/path/to/a/token
```

您也可以使用[环境变量](cli-configure-envvars.md)提供此配置。

AWS\$1ROLE\$1ARN  
要代入的角色的 ARN。

AWS\$1WEB\$1IDENTITY\$1TOKEN\$1FILE  
Web 身份令牌文件的路径。

AWS\$1ROLE\$1SESSION\$1NAME  
应用于此代入角色会话的名称。

**注意**  
这些环境变量当前仅适用于通过 Web 身份提供程序代入角色。它们不适用于常规的代入角色提供程序配置。

## 清除缓存的凭证
<a name="cli-configure-role-cache"></a>

当您使用一个角色时，AWS CLI 会在本地缓存临时凭证，直到这些凭证过期。当您下次尝试使用它们时，AWS CLI 会尝试代表您续订这些凭证。

如果您的角色的临时凭证[已吊销](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html)，它们不会自动续订，并且使用它们的尝试将失败。但是，您可以删除缓存以强制 AWS CLI 检索新凭证。

**Linux 或 macOS**

```
$ rm -r ~/.aws/cli/cache
```

**Windows**

```
C:\> del /s /q %UserProfile%\.aws\cli\cache
```

# 在 AWS CLI 中使用 IAM 用户凭证进行身份验证
<a name="cli-authentication-user"></a>

**警告**  
为了避免安全风险，在开发专用软件或处理真实数据时，请勿使用 IAM 用户进行身份验证，而是使用与身份提供者的联合身份验证，例如 [AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

此部分介绍如何使用 IAM 用户配置基本设置。其中包括使用 `config` 和 `credentials` 文件的安全凭证。如需改为查看 AWS IAM Identity Center 的配置说明，请参阅 [使用 AWS CLI 配置 IAM Identity Center 身份验证](cli-configure-sso.md)。

**Contents**
+ [步骤 1：创建您的 IAM 用户](#cli-authentication-user-create)
+ [步骤 2：获取您的访问密钥](#cli-authentication-user-get)
+ [步骤 3：配置 AWS CLI](#cli-authentication-user-configure.title)
  + [使用 `aws configure`](#cli-authentication-user-configure-wizard)
  + [通过 .CSV 文件导入访问密钥](#cli-authentication-user-configure-csv)
  + [直接编辑 `config` 和 `credentials` 文件](#cli-authentication-user-configure-csv.titlecli-authentication-user-configure-file)
+ [（可选）将多重身份验证与您的 IAM 用户凭证结合使用](#cli-authentication-user-configure-csv.titlecli-authentication-user-mfa)

## 步骤 1：创建您的 IAM 用户
<a name="cli-authentication-user-create"></a>

按照《IAM 用户指南》**中的[创建 IAM 用户（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)过程操作来创建 IAM 用户。
+ 对于**权限选项**，选择**直接附加策略**以了解如何向该用户分配权限。
+ 大多数“入门”开发工具包教程都使用 Amazon S3 服务作为示例。要向应用程序提供对 Amazon S3 的完全访问权限，请选择要附加到此用户的 `AmazonS3FullAccess` 策略。

## 步骤 2：获取您的访问密钥
<a name="cli-authentication-user-get"></a>

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

1. 在 IAM 控制台的导航窗格中，选择**用户**，然后选择您之前创建用户的 **`User name`**。

1. 在用户的页面上，选择**安全凭证**页面。然后，在**访问密钥**下，选择**创建访问密钥**。

1.  对于**创建访问密钥步骤 1**，选择**命令行界面 (CLI)**。

1. 对于**创建访问密钥步骤 2**，输入可选标记并选择**下一步**。

1. 对于**创建访问密钥步骤 3**，选择**下载.csv 文件**以保存包含您的 IAM 用户访问密钥和秘密访问密钥的 `.csv` 文件。稍后您将需要此信息。

1. 选择 Done (完成)。

## 步骤 3：配置 AWS CLI
<a name="cli-authentication-user-configure.title"></a>

在常规使用中，AWS CLI 需要以下信息：
+ 访问密钥 ID
+ 秘密访问密钥
+ AWS 区域
+ 输出格式

AWS CLI 将这些信息存储在 `default` 文件中名为 `credentials` 的*配置文件*（一个设置集合）中。预设情况下，当您运行的 AWS CLI 命令未明确指定要使用的配置文件时，将使用此配置文件中的信息。有关 `credentials` 文件的更多信息，请参阅[AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)。

要配置 AWS CLI，请使用下列过程之一：

**Topics**
+ [使用 `aws configure`](#cli-authentication-user-configure-wizard)
+ [通过 .CSV 文件导入访问密钥](#cli-authentication-user-configure-csv)
+ [直接编辑 `config` 和 `credentials` 文件](#cli-authentication-user-configure-csv.titlecli-authentication-user-configure-file)

### 使用 `aws configure`
<a name="cli-authentication-user-configure-wizard"></a>

对于一般用途，`aws configure` 命令是设置 AWS CLI 安装的最快方法。此配置向导将提示您输入入门所需的每条信息。除非使用 `--profile` 选项另行指定，否则 AWS CLI 会将此信息存储在 `default` 配置文件中。

以下示例使用示例值配置 `default` 配置文件。将它们替换为您自己的值，如以下部分所述。

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

以下示例使用示例值配置名为 `userprod` 的配置文件。将它们替换为您自己的值，如以下部分所述。

```
$ aws configure --profile userprod
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
```

### 通过 .CSV 文件导入访问密钥
<a name="cli-authentication-user-configure-csv"></a>

可以在创建访问密钥后导入下载的纯文本 `.csv` 文件，而不是使用 `aws configure` 输入访问密钥。

`.csv` 文件必须包含以下标头。
+ 用户名 - 必须将此列添加到您的 `.csv`。这将在导入时创建在 `config` 和 `credentials` 文件中使用的配置文件名称。
+ 访问密钥 ID
+ 秘密访问密钥

**注意**  
在创建初始访问密钥的过程中，一旦您关闭**下载 .csv 文件**对话框，就无法访问秘密访问密钥。如果您需要 `.csv` 文件，则需要自己创建一个包含所需标头和存储的访问密钥信息的文件。如果您不具有对访问密钥信息的访问权限，则需要创建新的访问密钥。

要导入 `.csv` 文件，请将 `aws configure import` 命令与 `--csv` 选项结合使用，如下所示：

```
$ aws configure import --csv file://credentials.csv
```

有关更多信息，请参阅 `aws\$1configure\$1import`。

### 直接编辑 `config` 和 `credentials` 文件
<a name="cli-authentication-user-configure-csv.titlecli-authentication-user-configure-file"></a>

要直接编辑 `config` 和 `credentials` 文件，请执行以下操作。

1. 创建或打开共享 AWS `credentials` 文件。此文件在 Linux 和 macOS 系统上为 `~/.aws/credentials`，在 Windows 上为 `%USERPROFILE%\.aws\credentials`。有关更多信息，请参阅 [AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)。

1. 将以下文本添加到共享 `credentials` 文件中。替换您之前下载的 `.csv` 文件中的示例值并保存该文件。

   ```
   [default] 
   aws_access_key_id = AKIAIOSFODNN7EXAMPLE 
   aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   ```

## （可选）将多重身份验证与您的 IAM 用户凭证结合使用
<a name="cli-authentication-user-configure-csv.titlecli-authentication-user-mfa"></a>

为了提高安全性，当您尝试发出调用时，可以使用从多重身份验证（MFA）设备、U2F 设备或移动应用程序生成的一次性密钥。

使用启用 MFA 的 IAM 用户身份，运行 [https://docs.aws.amazon.com/cli/latest/reference/configure/mfa-login.html](https://docs.aws.amazon.com/cli/latest/reference/configure/mfa-login.html) 命令以配置一个新的配置文件，以便与所指定配置文件的多重身份验证（MFA）一起使用。如果未指定任何配置文件，则 MFA 将基于 `default` 配置文件。如果未配置默认配置文件，则 `mfa-login` 命令会在询问您的 MFA 信息之前提示您输入 AWS 凭证。以下命令示例使用您的默认配置并创建一个 MFA 配置文件。

```
$ aws configure mfa-login
MFA serial number or ARN: arn:aws:iam::123456789012:mfa/MFADeviceName
MFA token code: 123456
Profile to update [session-MFADeviceName]:
Temporary credentials written to profile 'session-MFADeviceName'
Credentials will expire at 2023-05-19 18:06:10 UTC
To use these credentials, specify --profile session-MFADeviceName when running AWS CLI commands
```

要更新现有配置文件，请使用 `--update-profile` 参数。

```
$ aws configure mfa-login --profile myprofile --update-profile mfaprofile
MFA token code: 123456
Temporary credentials written to profile 'mfaprofile'
Credentials will expire at 2023-05-19 18:06:10 UTC
To use these credentials, specify --profile mfaprofile when running AWS CLI commands
```

此命令当前仅支持基于软硬件的一次性密码（OTP）身份验证器。此命令当前不支持使用通行密钥和 U2F 设备。

要使用您的 MFA 配置文件，请在命令中使用 `--profile` 选项。

```
$ aws s3 ls --profile mfaprofile
```

有关将 MFA 与 IAM 结合使用的更多信息，包括如何将 MFA 分配给 IAM 用户，请参阅**《AWS Identity and Access Management 用户指南》中的 [IAM 中的 AWS 多重身份验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa.html)。

# 在 AWS CLI 中将 Amazon EC2 实例元数据用作凭证
<a name="cli-configure-metadata"></a>

从 Amazon Elastic Compute Cloud (Amazon EC2) 实例中运行 AWS CLI 时，可以简化向命令提供凭证的过程。每个 Amazon EC2 实例都包含 AWS CLI 能够直接查询临时凭证的元数据。向实例附加 IAM 角色后，AWS CLI 可以自动并且安全地从实例元数据检索凭证。

要禁用此服务，请使用 [AWS\$1EC2\$1METADATA\$1DISABLED](cli-configure-envvars.md#envvars-list-AWS_EC2_METADATA_DISABLED) 环境变量。

**Topics**
+ [先决条件](#cli-configure-metadata-prereqs)
+ [配置 Amazon EC2 元数据的配置文件](#cli-configure-metadata-configure)

## 先决条件
<a name="cli-configure-metadata-prereqs"></a>

要将 Amazon EC2 凭证与 AWS CLI 结合使用，您需要完成以下操作：
+ 安装和配置 AWS CLI。有关更多信息，请参阅[安装或更新最新版本的 AWS CLI](getting-started-install.md)和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 您了解配置文件和命名配置文件。有关更多信息，请参阅 [AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)。
+ 您已创建一个对所需资源有访问权限的 AWS Identity and Access Management (IAM) 角色，然后在 Amazon EC2 实例启动时向其附加了该角色。有关更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 的 IAM 策略](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)和《IAM 用户指南》**中的[向在 Amazon EC2 实例上运行的应用程序授予访问 AWS 资源的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/role-usecase-ec2app.html)。

## 配置 Amazon EC2 元数据的配置文件
<a name="cli-configure-metadata-configure"></a>

要指定需要使用在托管 Amazon EC2 实例配置文件中提供的凭证，请在配置文件的命名配置文件中使用以下语法。有关更多说明，请参阅以下步骤。

```
[profile profilename]
role_arn = arn:aws:iam::123456789012:role/rolename
credential_source = Ec2InstanceMetadata
region = region
```

1. 在配置文件中创建配置文件。

   ```
   [profile profilename]
   ```

1. 添加有权访问所需资源的 IAM arn 角色。

   ```
   role_arn = arn:aws:iam::123456789012:role/rolename
   ```

1. 指定 `Ec2InstanceMetadata` 作为凭证源。

   ```
   credential_source = Ec2InstanceMetadata
   ```

1. 设置您的区域。

   ```
   region = region
   ```

**示例**

以下示例代入 *`marketingadminrole`* 角色并在名为 `marketingadmin` 的 Amazon EC2 实例配置文件中使用 `us-west-2` 区域。

```
[profile marketingadmin]
role_arn = arn:aws:iam::123456789012:role/marketingadminrole
credential_source = Ec2InstanceMetadata
region = us-west-2
```

# 在 AWS CLI 中使用外部进程获取凭证
<a name="cli-configure-sourcing-external"></a>

**警告**  
本主题讨论从外部进程获取凭证。如果生成凭证的命令可由未经批准的进程或用户访问，则可能存在安全风险。我们建议您使用 AWS CLI 和 AWS 提供的支持的安全替代方案，以降低泄露凭证的风险。请务必保管好 `config` 文件及任何支持文件和工具，以防泄露。  
确保您的自定义凭证工具不会将任何秘密信息写入 `StdErr`，因为开发工具包和 AWS CLI 可以捕获和记录此类信息，可能会将其向未经授权的用户公开。

如果您有 AWS CLI 不直接支持的生成或查找凭证的方法，则可以通过在 `config` 文件中配置 `credential_process` 设置来配置 AWS CLI 使用它。

例如，您可以在 `config` 文件中包含类似于以下内容的条目。

```
[profile developer]
credential_process = /opt/bin/awscreds-custom --username helen
```

**语法**  
要以与任何操作系统兼容的方式创建此字符串，请遵循以下规则：
+ 如果路径或文件名包含空格，请将完整路径和文件名用双引号 (" ") 括起来。该路径和文件名仅包含以下字符：A-Z a-z 0-9 - \$1 . 空格
+ 如果参数名称或参数值包含空格，则用双引号 (" ") 将该元素括起来。仅括起来名称或值，而不是名称值对。
+ 请勿在字符串中包含任何环境变量。例如，您不能包含 `$HOME` 或 `%USERPROFILE%`。
+ 不要将主文件夹指定为 `~`。您必须指定完整路径。

**Windows 示例**

```
credential_process = "C:\Path\To\credentials.cmd" parameterWithoutSpaces "parameter with spaces"
```

**Linux 或 macOS 示例**

```
credential_process = "/Users/Dave/path/to/credentials.sh" parameterWithoutSpaces "parameter with spaces"
```

**凭证计划的预期输出**

AWS CLI 按照配置文件中指定的方式运行该命令，然后从 `STDOUT` 读取数据。您指定的命令必须在 `STDOUT` 上生成符合以下语法的 JSON 输出。

```
{
  "Version": 1,
  "AccessKeyId": "an AWS access key",
  "SecretAccessKey": "your AWS secret access key",
  "SessionToken": "the AWS session token for temporary credentials", 
  "Expiration": "ISO8601 timestamp when the credentials expire"
}
```

**注意**  
截至撰写本文之时，`Version` 密钥必须设置为 `1`。随时间推移和该结构的发展，该值可能会增加。

`Expiration` 密钥是采用 [ISO8601](https://en.wikipedia.org/wiki/ISO_8601) 格式的时间戳。如果工具的输出中不存在 `Expiration` 键，则 CLI 假定凭证是不刷新的长期凭证。否则，将其视为临时凭证，并通过在其过期前重新运行 `credential_process` 命令来自动刷新凭证。

**注意**  
AWS CLI ***不*** 缓存外部进程凭据，这一点不同于代入角色凭证。如果需要缓存，则必须在外部进程中实现。

外部进程可以返回非零返回代码，以指示在检索凭证时发生错误。