Criei um projeto CDK para implantar um EC2 simples. Criei assim
// 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,
});
Eu o implantei usando o cdk deploy e tudo foi criado okey. Eu instalei alguns programas e cerca de um mês depois eu precisei adicionar a porta 1026 ao grupo de segurança. Então no código acima eu adicionei
publicEC2SG.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(1026),
"Personal port"
);
E então o cdk deploy fez. Mas dessa vez, o programa deletou minha máquina anterior e então criou uma nova (sem nada instalado). Por que isso acontece? Na mensagem para aceitar o cdk deploy as únicas mudanças que apareceram foram a porta adicionada ao security group
Como posso evitar isso no futuro? Preciso adicionar algo no meu código?
Em vez de usar
machineImage: ec2.MachineImage.latestAmazonLinux2023()
, você deve usar uma versão específica; caso contrário, se houver uma nova versão disponível, seu EC2 usará a nova e será recriado.Além disso, você deve sempre fazer um
cdk diff
antes de um,cdk deploy
caso ainda não tenha sido o caso, ele deveria ter avisado você sobre tal comportamento.E por último, não é uma boa prática fazer atualização manual no seu EC2. Você deve sempre automatizar para evitar perder suas atualizações e poder escalar facilmente. Certifique-se também de ter a política de retenção de remoção em seus recursos com estado (S3, DB, etc).