由于连接到 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 子网:
- 如果连接到 public 子网,Lambda 函数将无法访问互联网。
- 如果 Lambda 函数连接到 public 子网,则无法访问 AWS 服务,除非您已为该 AWS 服务配置 VPC 端点。
当您引入 VPC 端点时,它可以正常工作,因为所有发往 STS 的流量都通过 VPC 端点路由,不再需要依赖通过 NAT 的路由。通过 NAT 的路由适用于连接到您的私有子网之一的 Lambda 函数,但不适用于 Lambda 函数 .
我在 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 子网:
- 如果连接到 public 子网,Lambda 函数将无法访问互联网。
- 如果 Lambda 函数连接到 public 子网,则无法访问 AWS 服务,除非您已为该 AWS 服务配置 VPC 端点。
当您引入 VPC 端点时,它可以正常工作,因为所有发往 STS 的流量都通过 VPC 端点路由,不再需要依赖通过 NAT 的路由。通过 NAT 的路由适用于连接到您的私有子网之一的 Lambda 函数,但不适用于 Lambda 函数