使用AWS CDK创建负载均衡器时遇RuntimeError问题求助
问题描述
使用AWS CDK v2.136.0(Python版aws-cdk-lib同版本)创建Application Load Balancer(ALB)及关联Target Group时,抛出错误:RuntimeError: target.attachToApplicationTargetGroup is not a function。已确认版本为最新,请求排查解决。
相关代码
# 创建负载均衡器 load_balancer = elbv2.ApplicationLoadBalancer(self, "MyLoadBalancer", vpc=vpc, internet_facing=True, load_balancer_name="my-load-balancer" ) # 创建 Target Group1,并添加 EC2 实例1 target_group1 = elbv2.ApplicationTargetGroup(self, "MyTargetGroup1", vpc=vpc, port=80, targets=[ec2_instance1], target_group_name="my-target-group1" ) # 创建 Target Group2,并添加 EC2 实例2 target_group2 = elbv2.ApplicationTargetGroup(self, "MyTargetGroup2", vpc=vpc, port=80, targets=[ec2_instance2], target_group_name="my-target-group2" ) # 添加 Listener,并将 Target Group1 和 Target Group2 关联 listener = load_balancer.add_listener("MyListener", port=80) listener.add_targets("MyTargetGroup1", port=80, targets=[ec2_instance1]) listener.add_targets("MyTargetGroup2", port=80, targets=[ec2_instance2])
完整报错栈
jsii.errors.JavaScriptError: TypeError: target.attachToApplicationTargetGroup is not a function at ApplicationTargetGroup.addTarget (C:\Users\LIUXIN~1\AppData\Local\Temp\jsii-kernel-LGLn94\node_modules\aws-cdk-lib\aws-elasticloadbalancingv2\lib\alb\application-target-group.js:1:5027) at new ApplicationTargetGroup (C:\Users\LIUXIN~1\AppData\Local\Temp\jsii-kernel-LGLn94\node_modules\aws-cdk-lib\aws-elasticloadbalancingv2\lib\alb\application-target-group.js:1:4518) at Kernel._Kernel_create (C:\Users\LIUXIN~1\AppData\Local\Temp\tmpjpinukwv\lib\program.js:10108:25) at Kernel.create (C:\Users\LIUXIN~1\AppData\Local\Temp\tmpjpinukwv\lib\program.js:9779:93) at KernelHost.processRequest (C:\Users\LIUXIN~1\AppData\Local\Temp\tmpjpinukwv\lib\program.js:11696:36) at KernelHost.run (C:\Users\LIUXIN~1\AppData\Local\Temp\tmpjpinukwv\lib\program.js:11656:22) at Immediate._onImmediate (C:\Users\LIUXIN~1\AppData\Local\Temp\tmpjpinukwv\lib\program.js:11657:46) at process.processImmediate (node:internal/timers:478:21) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "D:\Documents\pythonProject\aws\my_proj\app.py", line 10, in <module> MyProjStack(app, "MyProjStack", File "D:\Documents\pythonProject\aws\my_proj\.venv\lib\site-packages\jsii\_runtime.py", line 118, in __call__ inst = super(JSIIMeta, cast(JSIIMeta, cls)).__call__(*args, **kwargs) File "D:\Documents\pythonProject\aws\my_proj\my_proj\my_proj_stack.py", line 80, in __init__ target_group1 = elbv2.ApplicationTargetGroup(self, "MyTargetGroup1", File "D:\Documents\pythonProject\aws\my_proj\.venv\lib\site-packages\jsii\_runtime.py", line 118, in __call__ inst = super(JSIIMeta, cast(JSIIMeta, cls)).__call__(*args, **kwargs) File "D:\Documents\pythonProject\aws\my_proj\.venv\lib\site-packages\aws_cdk\aws_elasticloadbalancingv2\__init__.py", line 22635, in __init__ jsii.create(self.__class__, self, [scope, id, props]) File "D:\Documents\pythonProject\aws\my_proj\.venv\lib\site-packages\jsii\_kernel\__init__.py", line 334, in create response = self.provider.create( File "D:\Documents\pythonProject\aws\my_proj\.venv\lib\site-packages\jsii\_kernel\providers\process.py", line 365, in create return self._process.send(request, CreateResponse) File "D:\Documents\pythonProject\aws\my_proj\.venv\lib\site-packages\jsii\_kernel\providers\process.py", line 342, in send raise RuntimeError(resp.error) from JavaScriptError(resp.stack) RuntimeError: target.attachToApplicationTargetGroup is not a function
问题原因及解决方法
核心原因
ApplicationTargetGroup的targets参数要求传入实现了IApplicationLoadBalancerTarget接口的对象,直接传入EC2实例对象(ec2.Instance类型)不符合要求,因为该类没有实现attachToApplicationTargetGroup方法,导致CDK调用时抛出错误。
解决步骤
- 用
InstanceTarget包装EC2实例:从aws_cdk.aws_elasticloadbalancingv2_targets导入InstanceTarget,将EC2实例对象包装成符合要求的Target对象。 - 修正Listener关联逻辑:原代码中
listener.add_targets会自动创建新的Target Group,而你已经手动创建了TG,应该改用listener.add_target_group关联已有的Target Group,避免资源重复创建。
修正后的完整代码
from aws_cdk import ( Stack, aws_ec2 as ec2, aws_elasticloadbalancingv2 as elbv2, aws_elasticloadbalancingv2_targets as elbv2_targets ) from constructs import Construct class MyProjStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # 假设vpc、ec2_instance1、ec2_instance2已提前创建 # vpc = ec2.Vpc(...) # ec2_instance1 = ec2.Instance(...) # ec2_instance2 = ec2.Instance(...) # 创建负载均衡器 load_balancer = elbv2.ApplicationLoadBalancer(self, "MyLoadBalancer", vpc=vpc, internet_facing=True, load_balancer_name="my-load-balancer" ) # 创建 Target Group1,用InstanceTarget包装EC2实例1 target_group1 = elbv2.ApplicationTargetGroup(self, "MyTargetGroup1", vpc=vpc, port=80, targets=[elbv2_targets.InstanceTarget(ec2_instance1)], target_group_name="my-target-group1" ) # 创建 Target Group2,用InstanceTarget包装EC2实例2 target_group2 = elbv2.ApplicationTargetGroup(self, "MyTargetGroup2", vpc=vpc, port=80, targets=[elbv2_targets.InstanceTarget(ec2_instance2)], target_group_name="my-target-group2" ) # 添加 Listener,并关联已创建的Target Group listener = load_balancer.add_listener("MyListener", port=80) listener.add_target_group("TG1", target_group=target_group1) listener.add_target_group("TG2", target_group=target_group2)
内容的提问来源于stack exchange,提问作者刘兴禄
相关产品推荐
相关产品推荐

