【问题标题】:Lambda function failing intermittently due to connect to sts.amazonaws.com timed out由于连接到 sts.amazonaws.com 超时,Lambda 函数间歇性失败
【发布时间】: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


【解决方案1】:

当您为 VPC 访问配置 Lambda 函数时,请将其配置为仅连接到私有子网。

导致 STS 出现间歇性连接问题的原始问题是您将 Lambda 函数配置为同时连接到私有子网和公有子网:

  1. 如果 Lambda 函数连接到公有子网,则无法访问 Internet。
  2. 如果 Lambda 函数连接到公有子网,则它们无法访问 AWS 服务,除非您为该 AWS 服务配置了 VPC 终端节点。

当您引入 VPC 端点时,它可以正常工作,因为所有发往 STS 的流量都通过 VPC 端点路由,不再需要依赖通过您的 NAT 的路由。通过您的 NAT 进行路由适用于连接到您的私有子网之一的 Lambda 函数,但不适用于 Lambda 函数connected to the public subnet

【讨论】:

  • 我只是深入研究,只能得出结论。感谢您的回答。真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多