使用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
相关产品推荐
相关产品推荐

