我在使用Websockets协议的API网关中有一个公共API。我正在将其连接ID存储在VPC内的数据存储中,并尝试编写Lambda来读取这些连接ID,然后使用await apigwManagementApi.postToConnection({ ConnectionId: connectionId, Data: postData }).promise();
将数据发送给每个连接。超时-Lambda无法将消息发送到API网关。因此,我尝试将网关添加到execute-api
:aws ec2 create-vpc-endpoint --vpc-id vpc-xyz --vpc-endpoint-type Interface --service-name com.amazonaws.eu-west-1.execute-api --subnet-ids subnet-xyz --security-group-id sg-xyz
。现在,我对apigwManagementApi的调用引发了ForbiddenException: Forbidden
。
我尝试查看execute-api网关的文档,但是接口https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html的文档指向https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html并导致创建私有API-我不想要这个,我需要我的API公开。
我认为我通常可以使用资源策略https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-resource-policies-examples.html,但这是一个websocket API,因此这些说明由于没有资源策略选项而无法使用。
答案 0 :(得分:0)
我在AWS Slack上询问了此问题,无法使用资源策略,这会增加很多网络复杂性:https://awsdevelopers.slack.com/archives/C6LDW0BC3/p1570618074008500
从该线程中的AWS开发人员那里:
嘿,当Lambda启用VPC时,它受制于VPC和子网的所有路由规则。
要访问任何公共资源,您将需要NAT GW,路由规则和SG设置以允许通信。
资源政策将无法正常工作。
答案 1 :(得分:0)
我遇到了同样的问题-本文档说明了原因(https://aws.amazon.com/premiumsupport/knowledge-center/api-gateway-vpc-connections/)。
要修复此问题,您需要添加一个经过边缘优化的自定义域名,其中包含以下内容:
将证书添加到AWS ACM(您需要证书,私钥 和提供商根证书)导入 us-east-1 ACM经理(您必须 将其添加到us-east-1即可在经过边缘优化的证书列表中查看它。)
在API网关控制台中,转到“自定义域名”并创建一个新域名。
设置您的域名,将类型保留为边缘优化,然后应用您刚创建的证书
域设置完成(大约需要40分钟),您可以添加基本路径映射以将流量发送到您的api /阶段。