目前,Elasticsearch(我们托管在 EC2 上)和 Atlantis (ECS) 有不同的 VPC 和子网。我想从 Atlantis 向 EC2 上的 Elastic 发送请求。
目标:使用 Privatelink 将来自 Atlantis 的 http 请求发送到 EC2 上的 ElasticSearch,这样我们就不必对等 Atlantis 和 Elastic VPC。
我在文档中看到 Privatelink(AWS VPC 端点 - 接口)可用于公开 AWS 服务 API,但这不是我想要做的。
当我创建以下 VPC 端点时,我能够从
ping ec2.us-east-2.api.aws
(可能根本不相关)获得响应,但不能从 VPC 端点中的其他 DNS 名称获得响应,也不能从 elastic 获得响应。有趣的是,VPC Endpoint 将解析为看起来位于 elastic VPC 中的 IP。
variable "atlantis_vpc_id"{
type = string
default = "vpc-vpc-id-here"
}
variable "elasticsearch_vpc_id"{
type = string
default = "vpc-vpc-id-here"
}
variable "atlantis_subnet_id"{
type = string
default = "subnet-subnet-id-here"
}
variable "elastic_dev_subnet_id"{
type = string
default = "subnet-subnet-id-here"
}
variable "elastic_dev_private_ip"{
type = string
default = "elastic-private-ip"
}
data "aws_subnet" "privatelink-atlantis-subnet" {
id = var.atlantis_subnet_id
}
data "aws_subnet" "privatelink-elastic-dev-subnet" {
id = var.elastic_dev_subnet_id
}
resource "aws_security_group" "privatelink-elastic-vpc-ep-sg" {
name = "privatelink-elastic-sg"
description = "Security group for Elasticsearch VPC endpoint"
vpc_id = var.elasticsearch_vpc_id
ingress {
from_port = 9200
to_port = 9200
protocol = "tcp"
cidr_blocks = [data.aws_subnet.privatelink-atlantis-subnet.cidr_block]
}
# not sure if need egress to 0.0.0.0
egress {
from_port = 9200
to_port = 9200
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_vpc_endpoint" "privatelink_elasticsearch_endpoint" {
vpc_id = var.elasticsearch_vpc_id
service_name = "com.amazonaws.us-east-2.ec2"
vpc_endpoint_type = "Interface"
security_group_ids = [aws_security_group.privatelink-elastic-vpc-ep-sg.id, "sg-050aa2ec7f87e742d"]
private_dns_enabled = true
subnet_ids = [var.elastic_dev_subnet_id]
}
我什至不确定 AWS Privatelink 是否可以用于此用例。我看到有关使用 Privatelink 公开一个端点的文档,该端点转到 AWS 服务而不是自定义服务。
我在发送 http 请求时期待 elastic 的响应。当前发生的是我超时(无响应)。我认为我缺少一些配置来实际将请求从 VPC 端点的出口定向到弹性 ec2 实例。