Workshop - Fundamentos AWS Cloudformation - Nível 200
Tags: aws, cloud, devops
Published: 2023-03-06 14:13:13

<u>**Agenda**</u>

- Objetivo
- Apresentação
- Introdução a Infraestrutura como código (_IaC_)
- O que é AWS Cloudformation
- Anatomia do Template 
- Sessões do template
- StackSets
- Designers
- Drift
- Setup de recursos (_Console e CLI_)
- O que aprendemos hoje?
- Referências
- Perguntas

---
<u>**Objetivo**</u>

Apresentar de uma forma simples e prática os fundamentos do AWS Cloudformation.


---
<u>**Apresentação**</u>


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e849a38m22sb03hipe6v.png)



**Rodrigo Fernandes**
rodrigofrs13@gmail.com
Arquiteto de Soluções/DevOps
2 anos de GFT
Casado há 17 anos e com 2 filhos 


- https://www.linkedin.com/in/rodrigo-fernandes-40766477/
- https://medium.com/@rodrigofrs13
- https://dev.to/rodrigofrs13


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/laxly50maqhx5o5tr7ue.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pjhsbfxrp0lfmph211f8.png)





![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n4c2avsc7ozhjwftbyi6.png)







---
<u>**Introdução a Infraestrutura como código (IaC)**</u>

**Infraestrutura como código (_IaC_)** refere-se ao gerenciamento e provisionamento da infraestrutura por meio de códigos, em vez de processos manuais. 

**Alguns benefícios**

- Assegura o provisionamento do mesmo ambiente, todas as vezes.
- Automatização
- Rapidez
- Menor retrabalho
- Eficiência operacional
- Controle de versão
- Redução de custos

_Fonte: https://www.redhat.com/pt-br/topics/automation/what-is-infrastructure-as-code-iac_


---
**O que é AWS Cloudformation**


É um serviço que fornece aos desenvolvedores e empresas uma forma fácil de criar um conjunto de recursos relacionados da AWS e de terceiros para provisiona-los e gerenciá-los de forma organizada e previsível.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8f5xg9mjyighioeij5ow.png)

_Fonte: https://aws.amazon.com/pt/cloudformation/_

---
<u>**Anatomia do template**</u>
O template é um arquivo de texto no formato JSON/YAML e é onde descrevemos tudo o que precisamos para criar a infraestrutura. 

**JSON**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4e2vqs48us81kve8y4o2.png)


**YAML**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/590um81tgdip3ca1go71.png)


---
<u>**Sessões do template**</u>

O Template é dividido em sessões. Abaixo algumas das sessões que podemos utilizar.

- **Description**

Permite que você inclua comentários sobre seu modelo.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jqnf5tz32am6eqmbbmii.png)



- **Parameters**

Permitem que você insira valores personalizados em seu modelo toda vez que criar ou atualizar (_em tempo de execução_) uma stack.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wuty5jwwrggc0zpylsxi.png)



- **Resources** (_Obrigatório_)

Declara os recursos da AWS que você deseja criar, como uma instância do Amazon EC2 ou um bucket do Amazon S3.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/066qz9sdt3rqxi0ht581.png)



- **Mappings**

Um mapeamento de chaves e valores associados que você pode usar para especificar valores de parâmetros condicionais, semelhante a uma tabela de pesquisa. Por exemplo, para definir valores com base em uma região.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ougoeq356carud1cuwrb.png)



- **Conditions**

Controlam se determinados recursos são criados ou se determinadas propriedades de recursos são atribuídas a um valor durante a criação ou a atualização da stack. 
Por exemplo, condicionalmente, você pode criar um recurso que depende de se a stack é de um ambiente de teste ou de produção.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2zs4ly0gh1gbdzjspnok.png)

 

- **Outputs**

Descreve os valores que são retornados sempre que você visualiza as propriedades da stack. 
Por exemplo, você pode declarar uma saída para o nome de um bucket do S3

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ephhjz81hj8wx5gxzl1p.png)



<u>Fonte: https://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/template-anatomy.html
</u>
---
<u>**StackSets**</u>

O AWS CloudFormation StackSets amplia a funcionalidade das stacks, permitindo que você crie, atualize ou exclua stacks em várias contas e regiões com uma única operação.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6l76eyjlly7wx41gnm59.png)

_Fonte: https://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html_

_Demonstração: https://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer-walkthrough-updatebasicwebserver.html_

---
<u>**Designers**</u>
É uma ferramenta gráfica para criar, visualizar e modificar modelos do AWS CloudFormation.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sl21zp910pd5uo1bkcdd.png)

_Fonte: https://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer.html_

---
<u>**Drift**</u>

Permite detectar se a configuração real de uma Stack difere ou se desviou da configuração esperada.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ssh9qkdyy0km6v997z5i.png)

_Fonte: https://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html#what-is-drift_

---
<u>**Setup de recursos (_Console e CLI_)**</u>

Os arquivos que serão utilizados estão em Material de Apoio.

<u>**Via Console**</u>

Durante essa atividade aproveite e observe os itens abaixo durante a criação.

- Designer
- Valide o template
- Parâmetros
- ChangeSets
- Navegue pelas abas Events, Resources, Outputs e etc.

**Create**

Criar uma estrutura baseado em um template, para isso vamos utilizar o template _01-simple-ec2-console-01.yaml_, disponível no material de apoio. 


**Update**

Confira na EC2 criada acima que está anexado o Security Group(Default).  

Vamos criar e anexar um Security Group na EC2 atualizando a stack já criada, para isso vamos utilizar o template _01-simple-ec2-console-02.yaml_, disponível no material de apoio.

```
  WebAppSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Join ["-", [webapp-security-group, dev]]
      GroupDescription: "Allow HTTP/HTTPS and SSH inbound and outbound traffic"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
```

Verifique na EC2 se o Security Group criado está anexado?


Vamos anexar o Security Group criado na EC2 criada, para isso vamos utilizar o template _01-simple-ec2-console-03.yaml_, disponível no material de apoio.

```
      SecurityGroupIds:
        - !Ref WebAppSecurityGroup
```


**Delete**

Acesse a console de delete a stack criada. 


<u>**Via CLI**</u>

Criar uma estrutura baseado em um template, para isso vamos utilizar o template _02-simple-ec2-cli-01.yaml_, disponível no material de apoio.  

**Create**

`aws cloudformation create-stack --stack-name "nome-da-stack" --template-body file://"nome-do-template"`


**Describe**

`aws cloudformation describe-stacks --stack-name "nome-da-stack"`

**Update**

Vamos anexar um Security Group como fizemos na console, para isso vamos utilizar o template _02-simple-ec2-cli-02.yaml_, disponível no material de apoio.  

`aws cloudformation update-stack --stack-name "nome-da-stack" --template-body file://"nome-do-template"`

**Delete**

`aws cloudformation delete-stack --stack-name "nome-da-stack"`


_Fonte: https://docs.aws.amazon.com/cli/latest/reference/cloudformation/index.html_

---
<u>**O que aprendemos hoje?**</u>


- Infraestrutura como código(_IaC_)
- AWS Cloudformation
- Anatomia e Sessões do template 
- StackSets
- Designers
- Drift
- Setup de recursos(_Console e CLI_)

---
<u>**Perguntas**</u>

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3rgp7gl7bc3z5haet0cx.png)



---


<u>**Material de apoio**</u>
[Clique aqui](https://github.com/rodrigofrs13/Fundamentos-AWS-Cloudformation-200/tree/main/Exemplos) para acessar o material de apoio disponível no git.

Sintam-se livres para baixar o repositório e modificar os arquivos. 

---
**<u>Próximos Workshops</u>**

- Fundamentos AWS Cloudformation - Nível 300(_em construção_)
- Fundamentos AWS Cloudformation - Nível 400(_em construção_)

---


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/its2aqbjvqi60e1uxvzp.png)