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

使用AWS CDK Python为EC2实例绑定安全组失败问题排查

问题

尝试用AWS CDK Python部署EC2实例,代码如下:

EC2securitygroup = ec2.CfnSecurityGroup(
          self,
          "EC2SecurityGroup",
          group_description="Security group for EC2",
          group_name="EC2-security-group",
          vpc_id="vpc-xxxxxxxxxxxxxxx",
          security_group_ingress=[............])
        instance = ec2.Instance(self, "EC2instance",
          instance_type=ec2.InstanceType("t2.micro"),
          machine_image=amzn_linux,
          vpc = vpc,
          role = role,
          security_group = EC2securitygroup
        )

执行cdk synth后,输出显示EC2实例的SecurityGroupIds为空数组:

EC2Instance770AAE32:
  Type: AWS::EC2::Instance
  Properties:
    AvailabilityZone: us-east-2a
    IamInstanceProfile:
      Ref: EC2InstanceInstanceProfile4A6C6689
    ImageId:
      Ref: SsmParameterValueawsserviceamiamazonlinuxlatestamzn2amihvmx8664gp2C96584B6F00A464EAD1953AFF4B05118Parameter
    InstanceType: t2.micro
    SecurityGroupIds: []

已确认安全组已创建,但未被EC2实例关联,请问问题出在哪里?

原因分析

你混用了CDK的L1(低级)和L2(高级)构造:

  • ec2.CfnSecurityGroup是L1资源,直接对应CloudFormation的AWS::EC2::SecurityGroup,属于底层构造
  • ec2.Instance的security_group参数要求传入L2的ec2.ISecurityGroup类型对象,CDK无法自动将L1的CfnSecurityGroup转换为符合要求的类型,因此无法正确关联安全组ID到实例上。

解决方案

有两种修复方式:

方式一:改用L2的ec2.SecurityGroup创建安全组(推荐)

L2构造会自动处理资源间的依赖和关联,代码更简洁易维护:

# 创建L2安全组
EC2securitygroup = ec2.SecurityGroup(
    self,
    "EC2SecurityGroup",
    description="Security group for EC2",
    security_group_name="EC2-security-group",
    vpc=vpc,
    allow_all_outbound=True  # 根据实际需求调整出站规则
)
# 添加入站规则,示例:允许SSH访问
EC2securitygroup.add_ingress_rule(ec2.Peer.any_ipv4(), ec2.Port.tcp(22))

# 创建EC2实例,直接传入L2安全组
instance = ec2.Instance(self, "EC2instance",
    instance_type=ec2.InstanceType("t2.micro"),
    machine_image=amzn_linux,
    vpc=vpc,
    role=role,
    security_group=EC2securitygroup
)

方式二:保留L1安全组,手动关联ID

如果必须使用CfnSecurityGroup,需要通过attr_group_id引用安全组ID,并使用security_groups(复数)参数传入:

EC2securitygroup = ec2.CfnSecurityGroup(
    self,
    "EC2SecurityGroup",
    group_description="Security group for EC2",
    group_name="EC2-security-group",
    vpc_id="vpc-xxxxxxxxxxxxxxx",
    security_group_ingress=[............])

instance = ec2.Instance(self, "EC2instance",
    instance_type=ec2.InstanceType("t2.micro"),
    machine_image=amzn_linux,
    vpc=vpc,
    role=role,
    security_groups=[EC2securitygroup.attr_group_id]  # 用复数参数并引用安全组ID
)

内容的提问来源于stack exchange,提问作者CJ Chang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:32:58