由于连接到 sts.amazonaws.com 超时,Lambda 函数间歇性失败

Lambda function failing intermittently due to connect to sts.amazonaws.com timed out

我在 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 public。 所有子网的路由表。

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-####

谢谢。

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

导致 STS 间歇性连接问题的最初问题是您将 Lambda 函数配置为连接到私有子网和 public 子网:

  1. 如果连接到 public 子网,Lambda 函数将无法访问互联网。
  2. 如果 Lambda 函数连接到 public 子网,则无法访问 AWS 服务,除非您已为该 AWS 服务配置 VPC 端点。

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