You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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调用时抛出错误。

解决步骤

  1. 用InstanceTarget包装EC2实例:从aws_cdk.aws_elasticloadbalancingv2_targets导入InstanceTarget,将EC2实例对象包装成符合要求的Target对象。
  2. 修正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,提问作者刘兴禄

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:04:57