【发布时间】:2022-02-01 23:21:50
【问题描述】:
我有一个在 VPC 中运行的 lambda。我使用它查询 ElasticSearch 并在那里更新数据并删除过时的数据。为了方便这个调用,lambda 必须承担一个角色,并为此调用 STS Assume role API。但最近,每当我尝试获取凭据时,我都会看到间歇性超时。代码是:
final AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
.withCredentials(new EnvironmentVariableCredentialsProvider())
.build();
final STSAssumeRoleSessionCredentialsProvider credentials = new STSAssumeRoleSessionCredentialsProvider.Builder(
System.getenv(SIM_ROLE_KEY), SIM_SESSION_NAME
).withStsClient(stsClient)
.build();
final String sessionToken = credentials.getCredentials().getSessionToken();
确切的错误:
Unable to execute HTTP request: Connect to sts.amazonaws.com:443 [sts.amazonaws.com/209.54.180.124] failed: connect timed out: com.amazonaws.SdkClientException
com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to sts.amazonaws.com:443 [sts.amazonaws.com/209.54.180.124] failed: connect timed out
我想知道,这种间歇性故障背后的原因可能是什么以及我们如何解决它。我还想知道间歇性超时是否是 STS 调用的常见问题?
我尝试过的事情:
1)。而不是全局端点 sts.amazonaws.com ,我将端点配置为 sts.us-east-1.amazonaws.com 因为我在 us-east-1 区域运行 lambda。我们仍然能够看到同样的错误。
2)。它没有 VPC 端点,所以我创建了 VPC 端点。现在它不会抛出超时错误。但我不确定这是否是预期的修复。如果是修复,那么 STS 调用将一直超时。如果没有 VPC 端点,那么它如何能够在大多数情况下与 sts.amazonaws.com 连接?。
如果需要,我可以提供更多信息。
更多信息: Lambda 函数附加了 3 个子网。 2个私人1个公共。 所有子网的路由表。
VPCStack Private Route Table 1 :
Destination Target
10.0.0.0/16 local
0.0.0.0/0 nat-####1
pl-63a5400a vpce-####3
VPCStack Private Route Table 2 :
Destination Target
10.0.0.0/16 local
0.0.0.0/0 nat-####2
pl-63a5400a vpce-####4
VPCStack Public Route Table :
Destination Target
10.0.0.0/16 local
0.0.0.0/0 igw-####5
pl-63a5400a vpce-####
谢谢。
【问题讨论】:
-
Lambda 函数是否配置为附加到您的 VPC 的多个子网?所有这些子网都有相同的路由吗?
-
@jarmod ,我对 VPC 有点陌生,你能告诉我应该寻找哪些子网吗?私人的还是公共的?我还检查了 VPC 附加了多个子网,但其中只有一个是“主”子网。您要我检查这些子网的路由表中的路由吗?提前致谢。
-
通常情况下,您会将 Elasticsearch 部署到 2 个以上的私有子网中,并且您会 configure 您的 Lambda 函数来访问这些相同私有子网中的资源。要让 VPC 中的 Lambda 函数访问 STS 等 AWS 服务,它需要到服务的网络路由(通过 NAT 网关路由或使用配置的 VPC 终端节点到服务)。您的原始症状表明您的 Lambda 位于多个子网中,但其中一个或多个子网没有到 NAT 的路由。这可能吗?
-
另外,仅供参考,您的 Lambda 函数会使用您配置的 IAM 角色自动启动。如果您可以利用 Lambda 启动时使用的已配置 IAM 角色,您可能不需要为 Elasticsearch 访问显式代入第二个 IAM 角色。
-
@jarmod 信息的翻译:仅将 Lambda 函数附加到 VPC 内的私有子网。
标签: amazon-web-services aws-lambda amazon-vpc sts-securitytokenservice vpc-endpoint