【问题标题】:Do VPC service availability zones need to match VPC endpoint zones?VPC 服务可用区是否需要匹配 VPC 终端节点区?
【发布时间】:2020-08-01 23:05:11
【问题描述】:

我正在为相应的 VPC 服务终端节点设置 VPC 终端节点。

  • 我们的应用程序使用非区域调用下游服务或 特定于区域的名称(路由到 VPCe)。

  • 我们在 VPCe 上设置了 3 个应用子网(对应于 3 可用区 us-west-2a、-2b、-2c)。

  • 我们调用的服务仅支持 2 个可用区 (us-west-2a, -2b)。

  • 创建端点时(通过 CloudFormation),我得到以下信息 错误:

    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: ...)

(该子网位于 AZ us-west-2c)

这里有什么解决办法?

如果不阻止我们在该 AZ 中的应用程序使用 VPCe,我不能离开该子网,对吧?

似乎 AWS 希望客户端和服务 AZ 匹配? 不过,我一定是误会了什么。没想到会这么死板。 (例如,如果service us-west-2c 出现故障,来自client us-west-2c 的请求应该转到service us-west-2a-2b。这就是AZ 的重点,对吧?)

【问题讨论】:

  • >> 好像 AWS 希望客户端和服务可用区匹配?不过,我一定是误会了什么。没想到会这么死板..... > 在 us-east-1a 中计算,通过网关端点在 us-east-1a 中调用 ddb。如果 us-east-1a 中的 DDB 出现故障,这是否会使计算变得无用,因为数据存储可能没有响应?
  • > 或者这仅适用于具有接口端点(而非网关端点)的服务?

标签: amazon-web-services amazon-ec2 amazon-vpc vpc


【解决方案1】:

做了一些研究,发现:

  • 无法自动确定正确的子网。
  • 生产者/消费者区域确实需要匹配。
  • AWS 控制台的创建 VPC 终端节点屏幕可用于检查可用服务 AZ。
  • 只要 VPCe 的安全组允许,从 client us-west-2cclient VPCe in us-west-2a 的通信应该没有问题。

该解决方案必须涉及手动检查服务中支持的可用区。

【讨论】:

【解决方案2】:

这是可能的。下面是一个使用 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_subnet_ids" "ses" {
  vpc_id = 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
  }
}

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 2020-01-04
    • 2022-10-02
    • 2020-06-05
    • 2021-11-19
    • 1970-01-01
    • 2020-12-18
    • 2019-08-12
    • 2020-02-07
    相关资源
    最近更新 更多