AWS CDK - 安全组创建打字稿
AWS CDK - SecurityGroup creation Typescript
我正在尝试使用打字稿将以下 CloudFormation 资源迁移到 CDK:
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref VPCId
GroupDescription: !Sub "${Application}-${Environment}-alb-sg"
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: !Ref SecurityGroupIngressCidr
我试过这个(我不知道如何创建必要的属性):
const albSecurityGroup = new SecurityGroup(this, "ALBSecurityGroup", {
vpc: Vpc.fromLookup(this, id, {
vpcId: props.vpcId.stringValue
}),
description: appEnv + "-alb-sg"
})
并像这样使用 Cfn 构造函数(我不知道如何使用 CfnSecurityGroupIngress 加入 CfnSecurityGroup):
const x = new CfnSecurityGroupIngress(this, id, {
ipProtocol: "tcp",
fromPort: 443,
toPort: 443,
cidrIp: props.securityGroupIngressCidr
});
const albSecurityGroupCfn = new CfnSecurityGroup(this, id, {
vpcId: props.vpcId.stringValue,
groupDescription: appEnv + "-alb-sg"
});
感谢您的帮助。
今天我意识到这是一个简单的解决方案。
const albSecurityGroupCfn = new CfnSecurityGroup(this, id, {
vpcId: props.vpcId.stringValue,
groupDescription: appEnv + "-alb-sg",
securityGroupIngress: [
new CfnSecurityGroupIngress(this, id, {
ipProtocol: "tcp",
fromPort: 443,
toPort: 443,
cidrIp: props.securityGroupIngressCidr
})
]
});
谢谢!
更新: (dmahapatro)
使用上述方法,您会收到一个编译时错误,表明您需要合适的类型。这是对上述解决方案的一个小调整:
const albSecurityGroupCfn = new CfnSecurityGroup(this, id, {
vpcId: props.vpcId.stringValue,
groupDescription: appEnv + "-alb-sg",
securityGroupIngress: [{
ipProtocol: "tcp",
fromPort: 443,
toPort: 443,
cidrIp: props.securityGroupIngressCidr
}]
});
securityGroupIngress
需要以下类型:
Type: Array<CfnSecurityGroup.IngressProperty | cdk.IResolvable> | cdk.IResolvable
当您提供 CfnSecurityGroupIngress
的数组时,它不会解析为任何这些类型。处理它的更好方法是使用默认情况下强制为 Array<CfnSecurityGroup.IngressProperty>
的对象数组。最新的答案表明,您不需要为 securityGroupIngress
.
实例化 CfnSecurityGroupIngress
附带说明一下,如果 VS Code 用作 CDK 的 IDE,它会预先捕获那些编译时错误。
使用 CfnSecurityGroup
你的答案看起来更清晰,但只是为了完整性和展示使用更高阶构造 SecurityGroup
可以实现相同目的的方法如下:
import { SecurityGroup, Peer, Port, Vpc } from '@aws-cdk/aws-ec2';
....
const vpc = Vpc.fromLookup(this, id, {
vpcId: props.vpcId.stringValue
});
const albSecurityGroup = new SecurityGroup(this, 'MyALBSG', {
vpc,
description: appEnv + "-alb-sg",
allowAllOutbound: true
});
albSecurityGroup.addIngressRule(
Peer.ipv4(props.securityGroupIngressCidr),
Port.tcp(443),
"Allow HTTPS traffic from CIDR IPs"
);
....
我强烈建议您阅读您计划在 CDK 中使用的任何服务模块的概述部分。 Here is the one for aws-ec2
显示了如何编写 SecurityGroup
。
您不妨直接使用 loadBalancer.connections.allowFrom()
,而不是为您的 ALB 显式创建安全组。假设您的 ALB 构造被命名为 loadBalancer
,这将类似于:
loadBalancer.connections.allowFrom(
Peer.ipv4(props.securityGroupIngressCidr),
Port.tcp(443),
'Allow inbound HTTPS from CIDR IPs'
);
我正在尝试使用打字稿将以下 CloudFormation 资源迁移到 CDK:
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref VPCId
GroupDescription: !Sub "${Application}-${Environment}-alb-sg"
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: !Ref SecurityGroupIngressCidr
我试过这个(我不知道如何创建必要的属性):
const albSecurityGroup = new SecurityGroup(this, "ALBSecurityGroup", {
vpc: Vpc.fromLookup(this, id, {
vpcId: props.vpcId.stringValue
}),
description: appEnv + "-alb-sg"
})
并像这样使用 Cfn 构造函数(我不知道如何使用 CfnSecurityGroupIngress 加入 CfnSecurityGroup):
const x = new CfnSecurityGroupIngress(this, id, {
ipProtocol: "tcp",
fromPort: 443,
toPort: 443,
cidrIp: props.securityGroupIngressCidr
});
const albSecurityGroupCfn = new CfnSecurityGroup(this, id, {
vpcId: props.vpcId.stringValue,
groupDescription: appEnv + "-alb-sg"
});
感谢您的帮助。
今天我意识到这是一个简单的解决方案。
const albSecurityGroupCfn = new CfnSecurityGroup(this, id, {
vpcId: props.vpcId.stringValue,
groupDescription: appEnv + "-alb-sg",
securityGroupIngress: [
new CfnSecurityGroupIngress(this, id, {
ipProtocol: "tcp",
fromPort: 443,
toPort: 443,
cidrIp: props.securityGroupIngressCidr
})
]
});
谢谢!
更新: (dmahapatro)
使用上述方法,您会收到一个编译时错误,表明您需要合适的类型。这是对上述解决方案的一个小调整:
const albSecurityGroupCfn = new CfnSecurityGroup(this, id, {
vpcId: props.vpcId.stringValue,
groupDescription: appEnv + "-alb-sg",
securityGroupIngress: [{
ipProtocol: "tcp",
fromPort: 443,
toPort: 443,
cidrIp: props.securityGroupIngressCidr
}]
});
securityGroupIngress
需要以下类型:
Type: Array<CfnSecurityGroup.IngressProperty | cdk.IResolvable> | cdk.IResolvable
当您提供 CfnSecurityGroupIngress
的数组时,它不会解析为任何这些类型。处理它的更好方法是使用默认情况下强制为 Array<CfnSecurityGroup.IngressProperty>
的对象数组。最新的答案表明,您不需要为 securityGroupIngress
.
CfnSecurityGroupIngress
附带说明一下,如果 VS Code 用作 CDK 的 IDE,它会预先捕获那些编译时错误。
使用 CfnSecurityGroup
你的答案看起来更清晰,但只是为了完整性和展示使用更高阶构造 SecurityGroup
可以实现相同目的的方法如下:
import { SecurityGroup, Peer, Port, Vpc } from '@aws-cdk/aws-ec2';
....
const vpc = Vpc.fromLookup(this, id, {
vpcId: props.vpcId.stringValue
});
const albSecurityGroup = new SecurityGroup(this, 'MyALBSG', {
vpc,
description: appEnv + "-alb-sg",
allowAllOutbound: true
});
albSecurityGroup.addIngressRule(
Peer.ipv4(props.securityGroupIngressCidr),
Port.tcp(443),
"Allow HTTPS traffic from CIDR IPs"
);
....
我强烈建议您阅读您计划在 CDK 中使用的任何服务模块的概述部分。 Here is the one for aws-ec2
显示了如何编写 SecurityGroup
。
您不妨直接使用 loadBalancer.connections.allowFrom()
,而不是为您的 ALB 显式创建安全组。假设您的 ALB 构造被命名为 loadBalancer
,这将类似于:
loadBalancer.connections.allowFrom(
Peer.ipv4(props.securityGroupIngressCidr),
Port.tcp(443),
'Allow inbound HTTPS from CIDR IPs'
);