如何通过AWS CDK创建AWS App Mesh?Cloud Map命名空间使用疑问
你的方案不正确,应该复用基础设施栈的共享Cloud Map命名空间
首先明确:你现在每个微服务栈单独新建PrivateDnsNamespace的做法,会导致每个服务创建独立的Route53私有托管区,完全不符合你共享同一个托管区的预期,而且是资源的冗余创建。
问题出在哪?
你在基础设施栈里已经通过ECS Cluster的DefaultCloudMapNamespace配置,创建了一个全局的私有Cloud Map命名空间(对应Route53托管区)。但微服务栈的代码里,你又为每个服务重新创建了命名为{serviceName}.dev的PrivateDnsNamespace——这相当于给每个服务单独建了一个二级域名托管区,而不是在共享的dev托管区下创建服务条目。
正确的做法:复用共享命名空间
你需要把基础设施栈中创建的Cloud Map命名空间暴露出来,让所有微服务栈引用它来创建Cloud Map服务,具体步骤如下:
在基础设施栈中暴露共享命名空间
修改基础设施栈代码,把Cluster自动创建的Cloud Map命名空间作为公共属性对外暴露:// 基础设施栈类中添加公共属性 public ICloudMapNamespace SharedCloudMapNamespace { get; private set; } // 原有的Cluster创建逻辑之后,赋值这个属性 var defaultCloudMapOptions = new CloudMapNamespaceOptions { Vpc = Vpc, Name = dnsNamespace, Type = NamespaceType.DNS_PRIVATE }; EcsCluster = new Cluster(this, $"{Env}-linux-cluster", new ClusterProps { Vpc = Vpc, ClusterName = $"{Env}-linux-cluster", DefaultCloudMapNamespace = defaultCloudMapOptions }); // 获取Cluster自动生成的命名空间实例 SharedCloudMapNamespace = EcsCluster.DefaultCloudMapNamespace;在微服务栈中引用共享命名空间创建服务
微服务栈通过基础设施栈的实例获取共享命名空间,不再新建独立命名空间:// 假设微服务栈构造函数接收基础设施栈实例作为参数 public MicroserviceStack(Construct scope, string id, InfrastructureStack infraStack, string serviceName) : base(scope, id) { var cloudMapService = new Service(this, serviceName, new ServiceProps { // 使用基础设施栈的共享命名空间 Namespace = infraStack.SharedCloudMapNamespace, DnsRecordType = DnsRecordType.SRV, DnsTtl = Duration.Seconds(60), RoutingPolicy = RoutingPolicy.MULTIVALUE, Name = serviceName }); }
这样做的好处
- 所有微服务共享同一个Route53私有托管区,完全匹配你的预期
- 避免重复创建不必要的托管区资源,降低成本和管理复杂度
- 生成的服务域名更规范:比如共享命名空间是
dev,那么order-service的域名就是order-service.dev,完美适配App Mesh的服务发现需求
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

