Cloudformation 03 - Recursos dentro da VPC e EC2 avançado
Criando recursos dentro da VPC
Em nosso artigo passado criamos nossa VPC completa. Portanto antes de iniciar a criação dos recursos citados aqui, precisamos rodar aquela stack para criar toda a estrutura da VPC.
Você pode encontrar o template cloudformation completo no meu github.
Criando a EC2
Vamos criar uma instância EC2 dentro da nossa VPC previamente criada, usando o seguinte template:
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: "t2.micro"
SecurityGroups: [!Ref 'InstanceSecurityGroup']
ImageId: "ami-062f7200baf2fa504"
KeyName: "testeec2"
BlockDeviceMappings:
- DeviceName: "/dev/sdm"
Ebs:
VolumeType: "gp2"
DeleteOnTermination: "true"
VolumeSize: "8"
NetworkInterfaces:
- AssociatePublicIpAddress: "true"
DeviceIndex: "0"
GroupSet:
- !GetAtt "InstanceSecurityGroup.GroupId"
SubnetId: !GetAtt "Pubsubnet"
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable SSH access via port 22 and 80
VpcId: !ImportValue 'VpcId'
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: "0.0.0.0/0"
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: "0.0.0.0/0"
Note que estamos referênciando a nossa VPC na criação do Security group e a subnet pública na instância EC2.
Atribuindo um Elastic IP
Sempre que reiniciamos uma instância EC2, o IP público padrão dela muda, pois é atribuído dinâmicamente.
Para resolver esta situação e criar registros DNS confiáveis, precisamos atribuir um Elastic IP para a nossa instância.
MyEIP:
Type: AWS::EC2::EIP
Properties:
InstanceId: !Ref EC2Instance
Domain: !GetAtt 'myVPC'
Novamente utilizamos nossa referência a VPC e a instância EC2 criada no exemplo anterior.
Utilizando o userdata
Durante a primeira inicialização de nossa instância EC2, podemos executar uma série de comandos. Isto é muito útil para automação de ambientes e dispensar o uso de mais ferramentas, como o Ansible por exemplo.
Basta adicionar o bloco do userdata logo depois da nossa placa de rede:
UserData:
Fn::Base64:
!Sub |
#!/bin/bash -xe
yum -y update
yum install httpd -y
systemctl start httpd
systemctl enable httpd
Neste exemplo, estamos instalando e iniciando um servidor apache.
Vamos salvar nosso IP público nos outputs para uso futuro:
Outputs:
PublicIP:
Description: Public IP address of the newly created EC2 instance
Value: !GetAtt [EC2Instance, PublicIp]
Export:
Name: PublicIP
Rodando a stack
Agora basta rodar o nosso template via awscli:
➜ ec2adv (master) ✗ aws cloudformation deploy --stack-name ec2adv --template-file ec2.yaml
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - ec2adv
Conclusão
Neste artigo aprendemos como criar recursos dentro da nossa VPC de maneira automatizada, bem como rodar comandos em nossa EC2 durante a criação.
Não se esqueçam de destruir os recursos para não serem cobrados até o próximo passo do tutorial.
Todos os arquivos completos ficam no meu Github.
Referências
https://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/user-data.html