AWS CDK创建含隔离私有子网的VPC及Fargate服务时Java服务部署卡住问题排查
AWS CDK创建含隔离私有子网的VPC及Fargate服务时Java服务部署卡住问题排查
嘿,我能理解你遇到这个部署卡住的问题有多头疼——毕竟刚接触VPC和CDK的时候,网络配置很容易踩坑。我看了你的代码,发现几个很可能导致Java Fargate服务卡住的问题,咱们一步步来梳理:
1. 缺失CloudWatch Logs的VPC接口端点
你的私有隔离子网没有NAT网关,所以任务要发送日志到CloudWatch Logs必须通过VPC接口端点,不然根本连不上日志服务。你只加了ECR和ECR Docker的端点,漏掉了CloudWatch Logs的,这会导致任务启动后无法上报日志,进而卡在创建状态。
修复代码:在你的接口端点部分加上这段:
this.vpc.addInterfaceEndpoint("aws-cloudwatch-logs-endpoint", { service: ec2.InterfaceVpcEndpointAwsService.CLOUDWATCH_LOGS, privateDnsEnabled: true, subnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED }, open: true, });
2. Java服务的ECR仓库引用错误
你看这段代码:
//JAVA const repoBackJava = Repository.fromRepositoryName( this, "pdf-java", "task-nodejs-test" );
你Java服务的ECR仓库名字和Node服务的完全一样(都是task-nodejs-test),这明显是复制粘贴时的失误!如果你的Java镜像不在这个仓库里,Fargate任务根本拉取不到镜像,自然会卡住。
修复代码:把仓库名改成你实际存放Java镜像的ECR仓库名称,比如:
//JAVA const repoBackJava = Repository.fromRepositoryName( this, "pdf-java", "task-java-test" // 替换成你的Java镜像仓库名 );
3. 未明确指定Fargate服务的子网类型
你的Java Fargate服务没有指定子网,CDK默认会让服务在VPC的所有子网(公有+私有隔离)里部署,但你本来只想让它跑在私有隔离子网里。虽然这不一定是卡住的直接原因,但明确指定子网能避免不必要的问题。
修复代码:在Java Fargate服务的配置里加上子网指定:
//JAVA const pdfFargateService = new ecs.FargateService( this, `${this.servicePdf}Service`, { cluster: this.cluster, taskDefinition: pdfFargateTaskDefinition, desiredCount: 1, securityGroups: [pdfServiceSecGroup], subnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED }, // 明确指定私有隔离子网 cloudMapOptions: { name: this.servicePdf, cloudMapNamespace: this.dnsNamespace, dnsRecordType: servicediscovery.DnsRecordType.A, }, } );
额外检查点
- 确认你的安全组配置:Java服务的安全组已经允许来自Node服务的80端口访问,这个没问题;另外因为你给VPC端点设置了
open: true,所以安全组会自动允许对应端口的出站流量,不用额外配置。 - 任务执行角色权限:你用的
AmazonECSTaskExecutionRolePolicy已经包含了拉取ECR镜像和发送CloudWatch日志的必要权限,这部分是没问题的。
把这些问题修复后,重新部署应该就能解决Java服务卡住的问题了。另外你提到之前用全公有子网时服务发现正常,说明服务发现的配置是对的,主要问题还是出在私有子网的网络访问权限上。
备注:内容来源于stack exchange,提问作者RettoScorretto
相关产品推荐
相关产品推荐

