

**本文档仅适用于 AWS CLI 版本 1。**

我们已宣布即将终止对 AWS CLI 版本 1 的支持。建议您迁移到 AWS CLI 版本 2。有关日期、其它详细信息以及如何迁移的信息，请参阅[公告](https://aws.amazon.com/blogs/developer/cli-v1-maintenance-mode-announcement/)。有关 AWS CLI 版本 2 的相关文档，请参阅[版本 2 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/)。

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

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


****  

| 身份验证类型 | 用途 | 说明 | 
| --- | --- | --- | 
| IAM 用户短期凭证 | 使用 IAM 用户短期凭证，它比长期凭证更安全。如果您的凭证遭到泄露，则在凭证过期之前的使用时间有限。 | [在 AWS CLI 中使用短期凭证进行身份验证](cli-authentication-short-term.md) | 
| Amazon EC2 实例上的 IAM 。 | 通过分配给 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 外部存储  | （不推荐）将另一个凭证方法配对，但存储位于 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/v1/reference/sts/assume-role.html](https://docs.aws.amazon.com/cli/v1/reference/sts/assume-role.html) 命令代入 IAM 角色的权限。

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

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 中使用短期凭证进行身份验证](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 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](cli-chap-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` 文件的安全凭证。

**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)

## 步骤 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)

### 使用 `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
```

# 在 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](cli-chap-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 ***不*** 缓存外部进程凭据，这一点不同于代入角色凭证。如果需要缓存，则必须在外部进程中实现。

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