

# 将临时凭证用于 AWS 资源
<a name="id_credentials_temp_use-resources"></a>

借助 AWS CLI 或 AWS API（使用 [AWS SDK](https://aws.amazon.com/tools/)），您可以使用临时安全凭证提出对 AWS 资源的编程请求。临时凭证提供的权限与长期安全凭证（例如 IAM 用户凭证）相同。但还是有几个区别：
+ 使用临时安全凭证进行调用时，必须在调用中包含随这些临时凭证一同返回的会话令牌。AWS 使用该会话令牌来验证临时安全凭证的有效性。
+ 临时凭证在指定间隔后到期。临时凭证到期后，任何使用这些凭证进行的调用都将失败，因此您必须生成一组新的临时凭证。临时凭证的延期或刷新时间不得超过最初指定的时间间隔。
+ 当您使用临时凭证发出请求时，您的主体可能会包含一组标签。这些标签来自附加到您代入的角色的会话标签和标签。有关会话标签的更多信息，请参阅 [在 AWS STS 中传递会话标签](id_session-tags.md)。

如果您使用的是 [AWS SDK](https://aws.amazon.com/tools)、[AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/) (AWS CLI) 或 [Tools for Windows PowerShell](https://aws.amazon.com/powershell)，则获取和使用临时安全凭证的方式随上下文而不同。如果您在 AWS CLI 内部运行代码、 或 Tools for Windows PowerShell 命令，则可使用 Amazon EC2 的角色。否则，您可调用 [AWS STS API](https://docs.aws.amazon.com/STS/latest/APIReference/) 来获取临时凭证，然后使用这些凭证显式地调用 AWS 服务。

**注意**  
您可以使用 AWS Security Token Service (AWS STS) 创建可控制对您的 AWS 资源的访问的临时安全凭证，并将这些凭证提供给可信用户。有关 AWS STS 的更多信息，请参阅[IAM 临时安全凭证](id_credentials_temp.md)。AWS STS 是一种全球服务，在 `https://sts.amazonaws.com` 上具有默认终端节点。此端点处于美国东部（弗吉尼亚州北部）区域，不过，您从此端点和其他端点获取的凭证在全球范围都有效。这些凭证可用于任何区域中的服务和资源。您也可以选择对任何支持的区域中的终端节点进行 AWS STS API 调用。这可能会从地理位置离您较近的区域的服务器中发出请求以减少延迟。无论您的凭证来自于哪个区域，它们都会在全球范围内起作用。有关更多信息，请参阅 [管理 AWS 区域中的 AWS STS](id_credentials_temp_enable-regions.md)。

**Contents**
+ [在 Amazon EC2 实例中使用临时凭证](#using-temp-creds-sdk-ec2-instances)
+ [将临时安全凭证用于 AWS SDK。](#using-temp-creds-sdk)
+ [将临时安全凭证用于 AWS CLI。](#using-temp-creds-sdk-cli)
+ [将临时安全凭证用于 API 操作](#RequestWithSTS)
+ [更多信息](#using-temp-creds-more-info)

## 在 Amazon EC2 实例中使用临时凭证
<a name="using-temp-creds-sdk-ec2-instances"></a>

如果要在 EC2 实例内部运行 AWS CLI 命令或代码，建议的获取凭证的方法是使用 [Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) 的角色。您可创建一个 IAM 角色，通过该角色指定要授予在 EC2 实例中运行的应用程序的权限。启动实例时，将该角色关联至实例。

之后，在该实例上运行的应用程序、AWS CLI 和 Tools for Windows PowerShell 命令将能够从该实例的元数据获取自动临时安全凭证。您无需明确获取临时安全凭证。AWS SDK、AWS CLI 和 Tools for Windows PowerShell 自动从 EC2 实例元数据服务 (IMDS) 获取凭证并使用它们。临时凭证具有您为与该实例关联的角色定义的权限。

有关更多信息及示例，请参阅：
+  [使用 IAM 角色授予对 Amazon Elastic Compute Cloud 上 AWS 资源的访问权](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html) — 适用于 Java 的 AWS SDK
+  [使用 IAM 角色授予访问权限 IAM ](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-hosm.html) - 适用于 .NET 的 AWS SDK 
+  [创建角色](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/iam-example-create-role.html) - 适用于 Ruby 的 AWS SDK

## 将临时安全凭证用于 AWS SDK。
<a name="using-temp-creds-sdk"></a>

要在代码中使用临时安全凭证，可以编程方式调用类似于 AWS STS 的 `AssumeRole` API，提取生成的凭证和会话令牌。然后，您可以使用这些值作为对 AWS 的后续调用的凭证。以下示例说明了有关使用 AWS 开发工具包时如何使用临时安全凭证的伪代码：

```
assumeRoleResult = AssumeRole(role-arn);
tempCredentials = new SessionAWSCredentials(
   assumeRoleResult.AccessKeyId, 
   assumeRoleResult.SecretAccessKey, 
   assumeRoleResult.SessionToken);
s3Request = CreateAmazonS3Client(tempCredentials);
```

有关用 Python 编写的示例（使用 [AWS SDK for Python (Boto)](https://aws.amazon.com/sdk-for-python/)），请参阅[切换到 IAM 角色（AWS API）](id_roles_use_switch-role-api.md)。此示例说明如何调用 `AssumeRole` 以获取临时安全凭证，然后使用这些凭证调用 Amazon S3。

有关如何调用 `AssumeRole`、`GetFederationToken` 和其他 API 操作的详细信息，请参阅 [AWS Security Token Service API 参考](https://docs.aws.amazon.com/STS/latest/APIReference/)。有关从结果中获取临时安全凭证和会话令牌的信息，请参阅所用开发工具包的文档。可以在主 [AWS 文档页](https://aws.amazon.com/documentation)上的 **SDKs and Toolkits**（开发工具包和工具箱）部分中找到所有 AWS SDK 的文档。

您必须确保在旧凭证到期之前，获得一组新的凭证。在某些开发工具包中，可让提供商为您管理刷新凭证的过程；并可检查所用开发工具包的文档。

## 将临时安全凭证用于 AWS CLI。
<a name="using-temp-creds-sdk-cli"></a>

可将临时安全凭证用于 AWS CLI。这对于测试策略来说很有用。

借助 [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/)，您可以调用 `AssumeRole` 或 `GetFederationToken` 之类的 [AWS STS API](https://docs.aws.amazon.com/STS/latest/APIReference/)，然后捕获输出结果。下面的示例说明了一个将输出发送至文件的 `AssumeRole` 调用。在示例中，假定 `profile` 参数是配置文件中的 AWS CLI 配置文件。它还假定为有权代入角色的 IAM 用户引用凭证。

```
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1" --profile IAM-user-name > assume-role-output.txt
```

当命令完成后，您可以从路由到的任意位置中提取访问密钥 ID、秘密访问密钥和会话令牌。您可以手动或使用脚本执行此操作。之后，您可以将这些值分配给环境变量。

在运行 AWS CLI 命令时，AWS CLI 依特定顺序查找凭证 - 首先查找环境变量，然后是配置文件。因此，在将临时凭证放入环境变量后，AWS CLI 会默认使用这些凭证。（如果在该命令中指定了 `profile` 参数，则 AWS CLI 将跳过环境变量，而 AWS CLI 在配置文件中查找，这使您能够根据需要覆盖环境变量中的凭证。） 

下面的示例说明了如何为临时安全凭证设置环境变量然后调用 AWS CLI 命令。由于未在 AWS CLI 命令中包含 `profile` 参数，AWS CLI 首先在环境变量中查找凭证，因而将使用该临时凭证。

**Linux**

```
$ export AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of session token>
$ aws ec2 describe-instances --region us-west-1
```

**Windows**

```
C:\> SET AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE
C:\> SET AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
C:\> SET AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of token> 
C:\> aws ec2 describe-instances --region us-west-1
```

## 将临时安全凭证用于 API 操作
<a name="RequestWithSTS"></a>

如果是直接向 AWS 发出 HTTPS API 请求，则可以使用从 AWS Security Token Service (AWS STS) 获取的临时安全凭证对这些请求进行签名。为此，您可以使用接收自 AWS STS 的访问密钥 ID 和秘密访问密钥。您使用访问密钥 ID 和秘密访问密钥的方式，与使用长期凭证对请求签名是一样的。此外，还要将您从 AWS STS 获得的会话令牌添加到 API 请求中。将会话令牌添加到 HTTP 标头或名为 `X-Amz-Security-Token` 的查询字符串参数中。将会话令牌添加到 HTTP 标头*或* 查询字符串参数，但不是同时添加到这两者。有关签署 HTTPS API 请求的更多信息，请参阅《AWS 一般参考》中的 [签署 AWS API 请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)**。

## 更多信息
<a name="using-temp-creds-more-info"></a>

有关将 AWS STS 与其他 AWS 服务结合使用的更多信息，请参阅以下链接：
+ **Amazon S3**。请参阅《Amazon Simple Storage Service 用户指南》中的 [使用 IAM 用户临时凭证创建请求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempSessionToken.html) 或者 [使用联合用户临时凭证创建请求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempFederationToken.html)**。
+ **Amazon SNS**。请参阅《Amazon Simple Notification Service 开发人员指南》**中的[将基于身份的策略用于 Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/UsingIAMwithSNS.html#UsingTemporarySecurityCredentials_SNS)。
+ **Amazon SQS**。请参阅《Amazon Simple Queue Service 开发人员指南》**中的 [Amazon SQS 中的 Identity and Access Management](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/UsingIAM.html#UsingTemporarySecurityCredentials_SQS)。
+ **Amazon SimpleDB**。请参阅 *Amazon SimpleDB 开发人员指南*中的[使用临时安全凭证](https://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/index.html?UsingTemporarySecurityCredentials_SDB.html)。