Go Lambda函数发送WebSocket消息报no such host错误如何解决
问题根因
- 最核心的原因是初始化
ApiGatewayManagementApi客户端时未指定对应WebSocket API的专属端点,SDK默认使用了通用的execute-api.us-east-1.amazonaws.com域名,该域名实际不存在,因此DNS服务器返回no such host错误 - 次要可能原因:若Lambda部署在自定义VPC内,VPC未配置公网访问出口,也未配置Execute API的内网VPC端点,导致无法正常解析访问公网的API网关域名
补充说明:169.254.78.1是AWS VPC默认提供的DNS解析服务器,返回无此主机的结果就代表请求的目标域名本身不存在或当前网络环境无法解析该域名
修复方案
- 首先修正
ApiGatewayManagementApi客户端的初始化逻辑,传入你自己的WebSocket API的完整端点(格式为https://<API_ID>.execute-api.<REGION>.amazonaws.com/<STAGE_NAME>),修改后的代码如下:
// 新增apiEndpoint参数,传入WebSocket API的完整端点 func NewAPIGatewaySession(apiEndpoint string) *apigatewaymanagementapi.ApiGatewayManagementApi { sesh := session.Must(session.NewSessionWithOptions(session.Options{ SharedConfigState: session.SharedConfigEnable, })) // 配置自定义端点 return apigatewaymanagementapi.New(sesh, aws.WithEndpoint(apiEndpoint)) }
func SendWsMessage(connectionID string, msgData []byte) error { // 从Lambda环境变量读取WebSocket API端点,避免硬编码 apiEndpoint := os.Getenv("WS_API_ENDPOINT") connectionInput := &apigatewaymanagementapi.PostToConnectionInput{ ConnectionId: aws.String(connectionID), Data: msgData, } _, err := NewAPIGatewaySession(apiEndpoint).PostToConnection(connectionInput) return err }
部署Lambda时需要添加名为WS_API_ENDPOINT的环境变量,值填写你实际的WebSocket API部署后的完整端点(带stage前缀,不需要加@connections后缀)。
- 若Lambda部署在自定义VPC内,需额外完成以下任意一项配置:
- 给Lambda所在子网配置公网路由,绑定NAT网关,允许Lambda访问公网API网关服务
- 在VPC内创建
com.amazonaws.<REGION>.execute-api类型的Interface VPC端点,配置安全组允许Lambda所在安全组访问该端点的443端口,实现内网访问API网关
内容的提问来源于stack exchange,提问作者maxisme
相关产品推荐
相关产品推荐

