本博客文章建议您使用区域 AWS 安全令牌服务STS终端节点,以提升在全球现已过时AWS STS 终端节点出现不可用的情况下的弹性。尽管全球 AWS STS 终端节点 https//stsamazonawscom 可用性很高,但它仅托管在一个地区美国东部 维吉尼亚州北部,并且不会自动故障转移至其他地区的终端节点。接下来将介绍如何在配置中使用区域 AWS STS 终端节点,从而提升工作负载的性能和弹性。
为了进行身份验证,建议使用临时凭证,而不是长期凭证,这样可以减少意外泄露、共享或盗用凭证的风险。通过 AWS STS,受信任的用户可以请求临时的有限权限凭证,以访问 AWS 资源。临时凭证包括一对访问密钥和会话令牌,AWS STS 动态生成临时安全凭证并在请求时提供给用户,这样就无需长期存储这些凭证。
您可以通过以下几种方式获取临时凭证:
AWS 主体,例如角色、用户或服务来自某种 外部身份提供者 的 SAMLWeb 令牌,例如通过 OAuth 20 或 OpenID Connect (OIDC) 应用程序提供的令牌要使用 AWS 服务进行编程连接,您需要使用一个 终端节点。AWS STS 在每个区域提供区域终端节点,最初建立的全球终端节点现已过时是 https//stsamazonawscom,其托管在美国东部维吉尼亚州北部区域useast1。默认情况下,已启用区域 AWS STS 终端节点可用于您的 AWS 账户。例如,https//stsuseast2amazonawscom 是美国东部俄亥俄州区域的终端节点。AWS 服务默认使用区域 AWS STS 终端节点。如果您的工作负载配置为使用全球过时的 AWS STS 终端节点,将会导致对单一地区美国东部 维吉尼亚州北部的依赖。一旦该地区的终端节点不可用,则您的工作负载将无法使用 AWS STS 检索临时凭证,从而增加了可用性风险。
AWS 建议您改用区域 AWS STS 终端节点https//stsltregionnamegtamazonawscom,除了提高弹性外,区域终端节点还有其他优势:
隔离和控制 通过向与工作负载位于同一地区的 AWS STS 终端节点发送请求,您可以最小化跨地区依赖,并使资源的范围与临时安全凭证的范围保持一致,从而更好地应对可用性和安全问题。性能 通过将 AWS STS 请求发送到更接近服务和应用程序的终端节点,您可以以更低的延迟和更短的响应时间访问 AWS STS。您应在特定地区内配置工作负载,仅使用该地区的区域 AWS STS 终端节点。通过使用区域终端节点,您可以在工作负载所在的同一区域使用 AWS STS,从而消除跨地区依赖。若区域 AWS STS 终端节点无法访问,您的工作负载不应调用位于操作区域之外的 AWS STS 终端节点。如果您的工作负载有多地区的弹性需求,则其他活动或备用区域也应使用该区域的区域 AWS STS 终端节点,并应配置为即使在某个地区发生故障时,应用程序仍能正常工作。
您应配置您的外部工作负载,调用适当的区域 AWS STS 终端节点,确保使用最低延迟。如果您的工作负载需要多地区的弹性,请为 AWS STS 调用构建故障转移逻辑,以防区域 AWS STS 终端节点不可达。
建议您使用最新的主要 AWS 命令行界面 (CLI) 或 AWS SDK 版本来调用 AWS STS API。
默认情况下, AWS CLI 版本 2 将 AWS STS API 请求发送到当前配置区域的区域 AWS STS 终端节点。如果您使用 AWS CLI v2,则无需做其他更改。
而 AWS CLI v1 默认将 AWS STS 请求发送到全球过时AWS STS 终端节点。要检查您正在使用的 AWS CLI 版本,可以运行以下命令: aws version。
运行 AWS CLI 命令时,AWS CLI 会按照 特定顺序 查找凭证配置首先在 shell 环境变量中查找,然后在本地 AWS 配置文件/aws/config中查找。
AWS SDK 适用于多种 编程语言 和环境。自 2022 年 7 月起,主要新版 AWS SDK 默认使用区域 AWS STS 终端节点,并使用与当前配置区域相对应的终端节点。如果您使用的是 2022 年 7 月之后发布的 AWS SDK 的主要版本,则无需进行其他更改。
AWS SDK 在查找凭证配置值时,会查看各种 配置位置。
如果您仍在使用 AWS CLI v1,或您的 AWS SDK 版本未默认指向区域 AWS STS 终端节点,您可以选择按照以下选项设置区域 AWS STS 终端节点:
AWS 配置文件位于 Linux 或 macOS 的 /aws/config,Windows 的 CUsersUSERNAMEawsconfig。要使用区域终端节点,请添加 stsregionalendpoints 参数。
以下示例显示如何在 AWS 配置文件的默认配置中设置美国东部俄亥俄州区域useast2的区域 AWS STS 终端节点:
ini[default]region = useast2stsregionalendpoints = regional
有效的 AWS STS 终端节点参数值stsregionalendpoints为:
legacy默认 使用全球过时AWS STS 终端节点,stsamazonawscom。regional 使用当前配置区域的 AWS STS 终端节点。注意:自 2022 年 7 月以来,主要更新的新版本 AWS SDK 默认会使用区域 AWS STS 终端节点,并且会使用与当前配置区域相应的终端节点。如果您使用的是 AWS CLI v1,则必须使用版本 116266 或更高版本才能使用 AWS STS 终端节点参数。
您可以在 AWS CLI 命令中使用 debug 选项来获取调试日志,并验证使用了哪个 AWS STS 终端节点。
bash aws sts getcalleridentity region useast2 debug
在调试日志中搜索 UseGlobalEndpoint,您会发现 UseGlobalEndpoint 参数设置为 False,并且在区域 AWS STS 终端节点配置为共享 AWS 配置文件或环境变量时,将看到区域终端节点供应商的完全限定域名FQDN。
环境变量 提供另一种指定配置选项的方法。它们是全局性的,并且影响对 AWS 服务的调用。大多数 SDK 支持环境变量。设置环境变量后,SDK 将使用该值,直到 shell 会话结束或您将变量设置为其他值。要在将来会话中保留这些变量,请在 shell 的启动脚本中设置它们。
以下示例显示如何通过环境变量设置美国东部俄亥俄州区域useast2的区域 AWS STS 终端节点:
Linux 或 macOSbash export AWSDEFAULTREGION=useast2 export AWSSTSREGIONALENDPOINTS=regional
您可以运行命令 (echo AWSDEFAULTREGION echo AWSSTSREGIONALENDPOINTS) 来验证变量。输出应类似于以下内容:
bashuseast2regional
WindowscmdCgt set AWSDEFAULTREGION=useast2Cgt set AWSSTSREGIONALENDPOINTS=regional
以下示例显示如何通过设置环境变量,使用 AWS SDK for Python (Boto3) 配置 STS 客户端以使用区域 AWS STS 终端节点:
pythonimport boto3import ososenviron[AWSDEFAULTREGION] = useast2osenviron[AWSSTSREGIONALENDPOINTS] = regional
您可以使用元数据属性 stsclientmetaendpointurl 来检查并验证 STS 客户端的配置。输出应类似于以下内容:
python
stsclient = boto3client(sts)stsclientmetaendpointurlhttps//stsuseast2amazonawscom
您也可以手动构造特定区域 AWS STS 终端节点的 URL。
以下示例显示如何使用 AWS SDK for Python (Boto3) 来配置 STS 客户端以使用区域 AWS STS 终端节点,方法是设置特定终端节点 URL:
pythonimport boto3stsclient = boto3client(sts regionname=useast2 endpointurl=https//stsuseast2amazonawscom)
您可以从您在 Amazon VPCs 中部署的资源创建与 AWS STS 的私有连接。AWS STS 集成 通过接口 VPC 终端节点与 AWS PrivateLink 进行连接。AWS PrivateLink上的网络流量会保持在 全球 AWS 网络骨干 上,并且不会经过公共互联网。如果您为 AWS STS 配置了 VPC 终端节点,则区域 AWS STS 终端节点的流量将经过该终端节点。
默认情况下,您 VPC 中的 DNS 将更新区域 AWS STS 终端节点的条目,使其解析为您 VPC 中 AWS STS VPC 终端节点的私有 IP 地址。以下来自 Amazon Elastic Compute Cloud (Amazon EC2) 实例的输出显示 AWS STS 终端节点的 DNS 名称解析为该 VPC 终端节点的私有 IP 地址:
bash[ec2user@ip10120136166 ] nslookup stsuseast2amazonawscomServer 1012002Address 1012002#53
Nonauthoritative answerName stsuseast2amazonawscomAddress 10120138148
加速器ios免费使用在您为 AWS STS 创建了接口 VPC 终端节点之后,使用环境变量设置区域 AWS STS 终端节点的值,以便访问同一区域的 AWS STS。
以下日志输出显示对区域 AWS STS 终端节点的 AWS STS 调用:
plaintextPOST /contenttypeapplication/xwwwformurlencoded charset=utf8hoststsuseast2amazonawscom
您可以使用 AWS CloudTrail 事件获取有关 AWS STS 请求和所使用的终端节点的信息。这些信息可以帮助您识别 AWS STS 请求模式及确认您是否仍在使用全球过时STS 终端节点。
在 CloudTrail 中,事件 是 AWS 账户活动的记录。CloudTrail 事件提供了通过 AWS 管理控制台、AWS SDK、命令行工具和其他 AWS 服务进行的 API 和非 API 账户活动的历史记录。
以下示例展示了一个包含 VPC 终端节点的对区域 AWS STS 终端节点的 STS 请求的 CloudTrail 事件。

jsoneventType AwsApiCallmanagementEvent truerecipientAccountId 123456789012vpcEndpointId vpce021345abcdef6789eventCategory ManagementtlsDetails { tlsVersion TLSv12 cipherSuite ECDHERSAAES128GCMSHA256 clientProvidedHostHeader stsuseast2amazonawscom}
以下示例展示了一个针对全球过时AWS STS 终端节点的 STS 请求的 CloudTrail 事件。
jsoneventType AwsApiCallmanagementEvent truerecipientAccountId 123456789012eventCategory ManagementtlsDetails { tlsVersion TLSv12 cipherSuite ECDHERSAAES128GCMSHA256 clientProvidedHostHeader stsamazonawscom}
要交互式搜索和分析 AWS STS 日志数据,请使用 AWS CloudWatch Logs Insights 或 Amazon Athena。
以下示例显示了如何运行 CloudWatch Logs Insights 查询,以查找对全球过时AWS STS 终端节点的 API 调用。查询 CloudTrail 事件之前,您必须配置 CloudTrail 跟踪以将事件发送到 CloudWatch Logs。
plaintextfilter eventSource=stsamazonawscom and tlsDetailsclientProvidedHostHeader=stsamazonawscom fields eventTime recipientAccountId eventName tlsDetailsclientProvidedHostHeader sourceIPAddress userIdentityarn @message sort eventTime desc
查询输出显示了对全球过时AWS STS 终端节点 https//stsamazonawscom 进行的 AWS STS 调用的事件详细信息。
以下示例显示了如何使用 Amazon Athena 查询 CloudTrail 事件,并搜索对全球过时AWS STS 终端节点的 API 调用。
sqlSELECT eventtime recipientaccountid eventname tlsdetailsclientProvidedHostHeader sourceipaddress eventid useridentityarnFROM cloudtraillogsWHERE eventsource = stsamazonawscom AND tlsdetailsclientProvidedHostHeader = stsamazonawscomORDER BY eventtime DESC
查询输出显示了对全球过时AWS STS 终端节点 https