我已经创建了一个 CDK 项目来部署一个简单的 EC2。我是这样创建的
// Create security group
const publicEC2SG = new ec2.SecurityGroup(this, `EC2SG`, {
vpc: vpc,
allowAllOutbound: true,
description: `Security Group for the eC2 server`,
securityGroupName: `ec2-sg`,
});
publicEC2SG.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(22),
"SSH from anywhere"
);
publicEC2SG.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.allIcmp(),
"Ping from anywhere"
);
publicEC2SG.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(1883),
"Mosquitto from anywhere"
);
// Launch EC2 instance in the public subnet (to be able to access it via SSH)
let ec2_public = new ec2.Instance(this, "MyEC2", {
vpc: vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PUBLIC,
},
instanceType: ec2.InstanceType.of(
ec2.InstanceClass.T2,
ec2.InstanceSize.MICRO
),
role: roleEC2,
machineImage: ec2.MachineImage.latestAmazonLinux2023(),
instanceName: `public-ec2`,
keyName: keyPair.keyName,
securityGroup: publicEC2SG,
});
let eip = new ec2.CfnEIP(this, "server-ip", {
instanceId: ec2_public.instanceId,
tags: [new cdk.Tag("Name", `elastic-IP`)],
});
new cdk.CfnOutput(this, "my-ip", {
value: ec2_public.instancePublicIp,
});
我使用 cdk deploy 部署了它,一切都创建好了。我安装了一些程序,大约一个月后,我需要将端口 1026 添加到安全组。因此,在上面的代码中,我添加了
publicEC2SG.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(1026),
"Personal port"
);
然后 cdk deploy 就完成了。但这次,程序删除了我之前的机器,然后创建了一台新机器(没有安装任何东西)。为什么会这样?在接受 cdk deploy 的消息中,唯一出现的更改是添加到安全组的端口
以后我该如何避免这种情况?我需要在代码中添加一些内容吗?
您不应该使用
machineImage: ec2.MachineImage.latestAmazonLinux2023()
,而应该使用特定版本,否则,如果有新版本可用,您的 EC2 将使用新版本并重新创建。此外,如果情况尚未发生,您应该始终
cdk diff
在 a 之前执行 a,它应该已经警告您这种行为。cdk deploy
最后,在 EC2 中手动更新不是一个好习惯。您应该始终自动化以避免丢失更新并能够轻松扩展。还要确保在有状态资源(S3、DB 等)上保留删除策略。