0

我有一个在 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)。而不是 global end-point sts.amazonaws.com,我将 end-point 配置为是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-####

谢谢。

4

1 回答 1

0

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

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

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

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

于 2022-02-01T15:21:50.217 回答