Estoy configurando un punto de enlace de VPC para un punto de enlace de servicio de VPC correspondiente.
Nuestra aplicación llama al servicio descendente utilizando un nombre que no es específico de una región o zona (enrutado al VPCe).
Tenemos 3 subredes de aplicaciones configuradas en el VPCe (correspondientes a 3 zonas de disponibilidad us-west-2a, -2b, -2c).
El servicio al que llamamos solo admite 2 zonas de disponibilidad (us-west-2a, -2b).
Al crear el punto final (a través de CloudFormation), aparece el siguiente error:
The VPC endpoint service com.amazonaws.vpce.us-west-2.vpce-svc-01234567890123456 does not support the availability zone of the subnet: subnet-0abcdef0123456789. (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameter; Request ID: ...)
(Donde está esa subred en AZ us-west-2c)
¿Cuál es la solución aquí?
No puedo dejar de lado esa subred sin evitar que nuestra aplicación en esa AZ use el VPCe, ¿verdad?
¿Parece que AWS espera que las zonas de disponibilidad del cliente y del servicio coincidan? Aunque debo estar malinterpretando algo. No esperaría que fuera tan rígido. (Por ejemplo, si service us-west-2c falla, las solicitudes del client us-west-2c deben ir al service us-west-2a o -2b . Ese es el objetivo de las AZ, ¿verdad?)
Investigué un poco más y encontré:
client us-west-2c a un client VPCe in us-west-2a siempre que el grupo de seguridad del VPCe lo permita .La solución deberá implicar la comprobación manual de las zonas de disponibilidad admitidas en el servicio.
Esto es posible. Aquí hay un ejemplo usando Terraform:
locals { subnet_count = length(data.aws_availability_zones.non_local.names) cidr_block = "10.0.0.0/16" region = "us-east-1" } resource "aws_vpc" "demo" { cidr_block = local.cidr_block enable_dns_hostnames = true ... } resource "aws_subnet" "demo" { count = local.subnet_count vpc_id = aws_vpc.demo.id cidr_block = cidrsubnet(local.cidr_block, ceil(log(local.subnet_count, 2)), count.index) availability_zone = data.aws_availability_zones.non_local.names[count.index] } data "aws_availability_zones" "non_local" { # No Local Zones # https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones#by-filter filter { name = "opt-in-status" values = ["opt-in-not-required"] } } resource "aws_vpc_endpoint" "ses" { vpc_id = aws_vpc.demo.id service_name = "com.amazonaws.${local.region}.email-smtp" vpc_endpoint_type = "Interface" subnet_ids = data.aws_subnet_ids.ses.ids } data "aws_vpc_endpoint_service" "ses" { service = "email-smtp" } data "aws_subnets" "ses" { filter { name = "vpc-id" values = [aws_vpc.demo.id] } filter { name = "subnet-id" values = aws_subnet.demo.*.id } filter { name = "availability-zone" values = data.aws_vpc_endpoint_service.ses.availability_zones } }