go - 尝试使用 VPC 终端节点从私有(private)子网承担 AWS sts 角色时请求超时

标签 go amazon-vpc connection-timeout aws-sts vpc-endpoint

当我调用 AWS sts 来承担 lambda 函数中的角色时,该函数在 VPC 上的私有(private)子网中运行,并为 STS 配置了端点。但是,我的请求超时了。

我的设置如下:

  • 我运行附加到 VPC 中的私有(private)子网和安全组的 lambda
  • 由于子网是私有(private)子网,因此我配置了一个 VPC 端点来访问 com.amazonaws.eu-west-1.sts 上的 STS
  • 我的 lambda 是使用旧版 sdk-for-go v1 api 在 golang 中编写的:https://docs.aws.amazon.com/sdk-for-go/api/
  • 我还配置了一个 VPC 端点来访问 S3,它可以正常工作

我的 VPC 端点的 terraform 配置是:

resource "aws_vpc_endpoint" "xxxx-sts" {
  vpc_id = aws_vpc.xxxx.id
  service_name = "com.amazonaws.eu-west-1.sts"
  vpc_endpoint_type = "Interface"
  security_group_ids = [aws_security_group.xxxx.id]
  subnet_ids = [aws_subnet.xxxx.id]
  private_dns_enabled = true
}

最佳答案

要解决此问题,请将以下 ENV 键/值添加到您的 lambda 或应用程序环境中:

export AWS_STS_REGIONAL_ENDPOINTS='regional'

这会强制 AWS 开发工具包在调用 STS 时使用区域终端节点而不是全局终端节点,如下所述:https://docs.aws.amazon.com/sdkref/latest/guide/feature-sts-regionalized-endpoints.html

否则,Go SDK 将默认为 eu-west-1 等区域使用全局 sts 端点 https://sts.amazonaws.com > (这种情况发生在以下区域:ap-northeast-1、ap-south-1、ap-southeast-1、ap-southeast-2、aws-global、ca-central-1、eu-central- 1、 eu-north-1、 eu-west-1、 eu-west-2、 eu-west-3、 sa-east-1、 us-east-1、 us-east-2、 us-west-1、和 us-west-2)

STS VPC 端点仅针对区域 URL 进行配置,因此当程序尝试访问私有(private)子网中的全局 URL 时,将无法建立连接并超时。

关于go - 尝试使用 VPC 终端节点从私有(private)子网承担 AWS sts 角色时请求超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71255594/

相关文章:

google-app-engine - 我可以将 AllocateIDs 用作 "string"吗?数据存储

json - 如何在golang中使用变量设置json标签?

Go 语言 : running routine on different process

Golang 获取反射调用的结果

amazon-web-services - 获取AWS VPC中的客户端IP而不是负载均衡器IP

amazon-web-services - 使用 github 配置 EMR notebook

amazon-web-services - 如何使用 Chef 在 VPC 内启动亚马逊 ec2 实例?

java - 在 Google App Engine java 中处理大数据时服务器遇到错误

linux - 如何查看sshfs挂载目录是否断开?

java - 使用 Java 的 AWS Lambda - 设置配置连接/套接字超时