我正在尝试创建一个 AWS IoT VPC 接口终端节点。我正在使用地形。 每个 AWS 账户都带有一个 IoT Core 端点,如下所示: xxxxxxxxxxxxxx-ats.iot.us-east-1.amazonaws.com
可以从公共互联网对它们进行 ping 操作。
这是我正在尝试的代码: 创建了一个带有互联网网关、路由表和公共子网的 VPC(更容易测试,稍后将在私有子网中进行)。 创建了一个安全组,允许 CIDR“172.16.0.0/16”的端口 443、80、8883、8 (ICMP) 上的传入流量。所有端口和所有 IP 均允许传出。
端点生成代码:
resource "aws_vpc_endpoint" "iot_core_vpc_interface_endpoint" {
vpc_id = aws_vpc.main.id
vpc_endpoint_type = "Interface"
subnet_ids = [for subnet in aws_subnet.public_web_subnets : subnet.id]
service_name = "com.amazonaws.us-east-1.iot.data"
private_dns_enabled = false
security_group_ids = [aws_security_group.endpoint_security_group.id]
}
对于私人托管区域
data "aws_iot_endpoint" "iot_endpoint" {
endpoint_type = "iot:Data-ATS"
}
resource "aws_route53_zone" "iot_private_hosted_zone" {
name = data.aws_iot_endpoint.iot_endpoint.endpoint_address
vpc {
vpc_id = aws_vpc.main.id
vpc_region = var.region
}
}
最后是 53 号公路设置。
resource "aws_route53_record" "www" {
zone_id = aws_route53_zone.iot_private_hosted_zone.zone_id
name = data.aws_iot_endpoint.iot_endpoint.endpoint_address
type = "A"
alias {
name = aws_vpc_endpoint.iot_core_vpc_interface_endpoint.dns_entry[0].dns_name
zone_id = aws_vpc_endpoint.iot_core_vpc_interface_endpoint.dns_entry[0].hosted_zone_id
evaluate_target_health = true
}
}
我在同一公有子网中创建了一个 EC2 实例,附加了相同的安全组,并尝试从中 ping 终端节点 xxxxxxxxxxxxxx-ats.iot.us-east-1.amazonaws.com 但没有给出任何答复。
dig xxxxxxxxxxxxxx-ats.iot.us-east-1.amazonaws.com
提供与 VPC 终端节点关联的私有 IP。
当我删除 Route 53 托管区域和记录时,我能够 ping 终端节点。我猜它只是开始通过互联网而不是 VPC 端点发送流量。
我认为我在这里错过了一些小但重要的细节。
奇怪的是,我们一直在做同样的事情,试图节省 NAT 成本。虽然在这一天的大部分时间里都在努力解决这个问题,但我认为它必须处理路由或防火墙的问题,因为 ats 端点解析为 VPC 端点的私有 IP,并且我可以使用流日志验证 ping 请求是否超出了子网。
一时兴起,我尝试了 telnet 和curl 来测试与ats 端点的连接,并且在仅连接到端口443 时,两者似乎都可以工作。
curl -v {id}-ats.iot.eu-west-1.amazonaws.com -p 443
telnet {id}-ats.iot.eu-west-1.amazonaws.com 443
已验证我的 lambda 函数也能够连接到 IoT 端点以发布消息。我们测试连接的方式似乎存在问题。