AWS Websockets API自定义域名生产环境postToConnection调用异常
首先看报错里的资源ARN:arn:aws:execute-api:YYY/production/POST/@connections/@connections/LLDsmeF5ZicCJ8w%3D,这里出现了重复的@connections路径段,这是核心问题根源。
问题成因
当自定义域名将空路径映射到production阶段时,调用postToConnection如果错误地在请求路径中重复拼接了@connections(比如SDK配置不当,同时指定了stage和自定义域名),就会触发连锁问题:
- 初始的
AccessDeniedException:实际请求的资源路径是production/POST/@connections/@connections/*,但你的IAM策略仅授权了production/POST/@connections/*,权限范围不匹配导致拒绝。 - 添加
invoke权限后的NotFoundException:此时权限校验通过,但API Gateway找不到@connections/@connections/{connectionId}这个不存在的路由,返回404。
解决步骤
1. 修正SDK调用的Endpoint配置
使用自定义域名调用postToConnection时,不要在Endpoint中包含stage或@connections路径,SDK会自动拼接正确的路由。以Python boto3为例:
# 正确写法:仅使用自定义域名作为Endpoint,无额外后缀 client = boto3.client( 'apigatewaymanagementapi', endpoint_url='https://your-custom-domain.com', region_name='your-region' ) # 调用时只需传入ConnectionId和消息数据 client.post_to_connection( ConnectionId='LLDsmeF5ZicCJ8w=', Data=b'your-message-content' )
如果之前在endpoint_url中添加了/production或/@connections,会导致路径重复,必须移除。
2. 验证IAM策略匹配
当前生产环境的IAM策略是正确的,只要请求路径修正为production/POST/@connections/{connectionId},权限就会自动匹配,无需额外添加execute-api:Invoke权限(execute-api:ManageConnections已覆盖postToConnection所需的所有权限)。
3. 确认自定义域名映射配置
在API Gateway控制台的自定义域名页面,检查生产环境的映射规则:
- 路径应为
(none)(空字符串) - 关联的阶段是
production - 确保没有额外的路径前缀或重写规则导致路径变形
4. 直接HTTP测试排查
用curl直接发送请求,排除SDK配置问题:
curl -X POST https://your-custom-domain.com/@connections/LLDsmeF5ZicCJ8w= \ -d '{"message": "test"}' \ -H "Content-Type: application/json" \ --aws-sigv4 "aws:amz:your-region:execute-api" \ -u "AKIAYOURACCESSKEY:your-secret-key"
如果请求成功,说明SDK配置有误;如果失败,根据返回的错误信息进一步排查API Gateway的路由或映射配置。
内容的提问来源于stack exchange,提问作者DevelJoe

