使用单个CNAME访问2个AWS API网关

时间:2018-09-17 23:52:18

标签: amazon-web-services aws-api-gateway terraform amazon-route53

我有一个托管区域,customdomain.com和两个在AWS上托管的区域API网关。

我想基于延迟将公用CNAME配置为myapp.customdomain.com以调用APIGW_REGION_ONE_EXECUTEAPI_URIAPIGW_REGION_TWO_EXECUTEAPI_URI

我该怎么做?我在API网关上的自定义域名与Route 53 CNAME记录之间感到困惑。任何帮助或指导都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

API Gateway上的自定义域名允许它响应AWS提供的名称以外的其他名称(通过SNI起作用),并提供至少具有一个SAN的证书匹配您提供的名称,因此您需要定义该名称以及所有DNS记录,以便人们可以解析API网关。

对于基于延迟的记录,您将需要创建多个Route53记录并在每个记录中定义延迟策略。 aws_route53_record docs展示了如何创建加权记录,以将所有流量的10%转移到其他目标:

resource "aws_route53_record" "www-dev" {
  zone_id = "${aws_route53_zone.primary.zone_id}"
  name    = "www"
  type    = "CNAME"
  ttl     = "5"

  weighted_routing_policy {
    weight = 10
  }

  set_identifier = "dev"
  records        = ["dev.example.com"]
}

resource "aws_route53_record" "www-live" {
  zone_id = "${aws_route53_zone.primary.zone_id}"
  name    = "www"
  type    = "CNAME"
  ttl     = "5"

  weighted_routing_policy {
    weight = 90
  }

  set_identifier = "live"
  records        = ["live.example.com"]
}

在您的情况下,您需要这样的东西:

data "aws_region" "region_one" {}

data "aws_route53_zone" "selected" {
  name         = "example.com."
}

resource "aws_api_gateway_domain_name" "example" {
  domain_name = "api.example.com"

  certificate_name        = "example-api"
  certificate_body        = "${file("${path.module}/example.com/example.crt")}"
  certificate_chain       = "${file("${path.module}/example.com/ca.crt")}"
  certificate_private_key = "${file("${path.module}/example.com/example.key")}"
}

resource "aws_route53_record" "region_one" {
  zone_id = "${data.aws_route53_zone.selected.zone_id}"
  name    = "${aws_api_gateway_domain_name.region_one.domain_name}"
  type    = "A"

  latency_routing_policy {
    region = "${data.aws_region.region_one.name}"
  }

  set_identifier = "${data.aws_region.region_one.name}"

  alias {
    name                   = "${aws_api_gateway_domain_name.region_one.regional_domain_name}"
    zone_id                = "${aws_api_gateway_domain_name.region_one.regional_zone_id}"
    evaluate_target_health = true
  }
}

并放置在创建每个API网关的位置或使用具有不同区域配置的多个提供程序同时应用两者的位置。