具有 ECS 服务发现和 Route53 Cname 记录的 AWS CDK 管道

AWS CDK pipeline with ECS service discovery as well as Route53 Cname records

我正在构建一个管道,其中包含 AWS CDK (python) 中的三个堆栈、一个 vpc 堆栈、一个数据库堆栈以及一个 application/ecs 服务和容器堆栈。 我需要能够创建连接记录名称的 route53 cname 记录,例如db.domain.com 到数据库 DNS, 以及连接记录名称的服务发现记录,例如serviceA.domain.com 到 ECS 服务 dns。

我目前只能执行其中一项操作,方法是创建一个私有 dns 命名空间,自动创建一个我无法向其添加 cname 记录的 route53 托管区域,因为我不知道它的 ID,或者我可以创建一个 route53 托管区域,我无法在其中为 ECS 服务创建记录,因为我不知道他们的 dns's/ips.

如何在 AWS CDK 中同时实现这两个目标?

可能是另一种提出问题的方式: 在 AWS CDK 中创建私有 dns 命名空间时,如何将 CName 记录添加到由 CloudMap 自动创建的私有托管区域?

如果我不添加 vpc_id(因为它 returns DUMMY 作为托管区域 ID)或在 运行 时,以下获取托管区域的方法失败了cdk synth 如果我添加 vpc_id 并出现错误:

jsii.errors.JSIIError: 无法确定上下文提供程序托管区域的范围。

这通常发生在一个或多个提供者道具具有未解析的令牌时

aws_route53.PrivateHostedZone.from_lookup(
    self, 
    id="zone", 
    domain_name="domain.com", 
    private_zone=True, 
    vpc_id=vpc.vpc_id 
)

因此,根据您的评论,假设您有容器服务并希望私有访问该容器服务。

要使用私有 DNS 公开服务,您有两种选择。首先,您可以创建一个云地图命名空间(例如example.local)并在命名空间下创建一个云地图服务(例如my-service)并link它到ECS服务。您可以使用 CDK 来做到这一点。结果记录将是 my-service.exampme.local。 例如,要连接到数据库,请添加 CDK 文档中指定的云地图服务:

import * as cdk from '@aws-cdk/core';
import * as servicediscovery from '../lib';

const app = new cdk.App();
const stack = new cdk.Stack(app, 'aws-servicediscovery-integ');

const namespace = new servicediscovery.PublicDnsNamespace(stack, 'Namespace', {
  name: 'foobar.com',
});

# this is where the interesting stuff happens.
const service = namespace.createService('Service', {
  name: 'foo',
  dnsRecordType: servicediscovery.DnsRecordType.CNAME,
  dnsTtl: cdk.Duration.seconds(30),
});

service.registerCnameInstance('CnameInstance', {
  instanceCname: 'my-database.rds.region.amazonaws.com',
});

app.synth();

https://docs.aws.amazon.com/cdk/api/latest/docs/aws-servicediscovery-readme.html

第二种方法是在您的服务前面添加一个负载均衡器并自己创建一个托管区域并添加一个指向该负载均衡器的 DNS 记录。 CDK 有可用的结构。

    // Create a load-balanced Fargate service and make it public
    new ecs_patterns.ApplicationLoadBalancedFargateService(this, "MyFargateService", {
      cluster: cluster, // Required
      cpu: 512, // Default is 256
      desiredCount: 6, // Default is 1
      taskImageOptions: { image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample") },
      memoryLimitMiB: 2048, // Default is 512
      publicLoadBalancer: false // Default is false
    });

Snippet taken from an AWS tutorial 然后像往常一样同时在此托管区域中为您的数据库创建另一条记录。

编辑:关于获取区域的代码段,您需要将构造添加到堆栈中才能使其工作。还要确保您使用的是最新的 CDK 版本。最新版本迭代综合。第一次将解决 DUMMY 但下一次它会以某种方式为我解决正确的 id。不过,我确实使用了 Hostezone 结构,而不是 PrivateHostezone。