Terraform - Lançando instância no AWS EC2 e criando um Bucket no AWS S3
Tags: beginners, aws, tutorial, terraform
Published: 2022-04-05 02:32:49

![Logo Terraform, EC2 e S3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jrgaouo57gfsz9qveezd.png)
 

Utilizar o Terraform com os serviços da AWS é o casamento perfeito, onde você ganha muita produtividade e um ambiente seguro. Pensando nisso hoje vamos criar um instância no [EC2] (https://aws.amazon.com/pt/ec2/) e uma bucket no [S3](https://aws.amazon.com/pt/s3/) em conjunto com o Terraform (como dito no título certo?)

## Iniciando os trabalhos

Um ponto importante a ser ressaltado é que eu migrei meu SO recentemente para uma distro Linux (sim o Ubuntu), então vocês irão ver bastante comandos UNIX em meus conteúdos, o que não irá atrapalhar o entendimento creio eu...

Bom então vamos criar a uma pasta para nosso projeto:

```unix
$ mkdir aws && cd aws
```
O que fizemos com o comando acima foi criar a pasta e entrar na mesma para começarmos os trabalhos.. Temos que criar um arquivo de configuração para o Terraform (você tem que ter ele instalado não se esqueça, aqui tem uns tutoriais meus ensinando como instalar no Linux, macOS e Windows.. mas enfim chega de merchan) ele deverá ter a extensão `tf`:

```
vi configuration.tf
```

## AWS Services

Agora precisamos conversar não sei se você está vendo este tutorial para terminar uma task ou para estudar mas em ambos os casos é necessário ter o acesso ao Serviços da AWS. Então para processeguir precisamos de:

- ‎Provedor: Um provedor de nuvem, AWS no nosso caso‎
- ‎Secret Acess Key: Que devemos obter para acessar os recursos da AWS
 
Para prosseguir precisaremos definir a instância da AWS, ou seja, AMIR (check no [Amazon EC2 AMI Locator](https://cloud-images.ubuntu.com/locator/ec2/)), tipo de instância e tag.

A instância é baseada no Amazon EBS (o que significa que o volume raiz é um volume do EBS). Você pode especificar a zona de disponibilidade na qual sua instância é executada ou deixar o Amazon EC2 selecionar uma zona de disponibilidade para você. Você pode pensar em uma zona de disponibilidade como um datacenter isolado. Para criar a instânia abra o [console do EC2](https://console.amazonaws.cn/ec2) e clique e m **Lauch Instance** para criar e configurar:

![Criando Instância](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4elo5ntbc2vkadbeoff4.png)

Configurando nossa instância, nesta tela são mostradas opções para escolher uma Imagem da Máquina do Amazon (AMI). OS AMIs são modelos de servidor pré-configurados que você pode usar para iniciar uma instância. Cada AMI inclui um sistema operacional, e também pode incluir aplicativos e servidores de aplicativos.

Para este tutorial, encontre o **Amazon Linux AMI** e clique em **Select**.

![Amazon Linux AMI](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j4mn67lqmu1wtit7bqkg.png)

Agora você escolherá um tipo de instância. Os tipos de instâncias compreendem combinações variadas de CPU, memória, armazenamento e capacidade de rede para que você possa escolher o mix apropriado para seus aplicativos. Para obter mais informações, consulte [os Tipos de Instâncias do Amazon EC2](https://www.amazonaws.cn/en/ec2/details/).

![Instância](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xnh7osfnwnjmceikfn0x.png)

A opção padrão do *t2.micro* já deve ser verificada. Este tipo de instância oferece capacidade de computação suficiente para lidar com cargas de trabalho simples. Clique em **Review e Launch** na parte inferior da página.

Podemos revisar as configurações, armazenamento, marcação e configurações de segurança selecionadas para nossa instância. Possuímos a opção de personalizar essas configurações, mas recomendo (e a Amazon também) a aceitar os valores padrão para este tutorial.

Na próxima tela, seremos solicitados a escolher um par de keys existente ou criar um novo par de keys. Um par de keys é usado para acessar com segurança sua instância Linux usando SSH. A Amazon Web Services armazena a parte pública do par-chave que é como um cadeado de casa. Você baixa e usa a parte privada do par de keys que é como uma chave de casa.

Selecione **Create a new key pair** e vamos dar o nome MyKeyPair (você pode escolher o que preferir). Clicamos em seguida, no botão "**Download Key Pair**".

![Key](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/28vkiohrxoj7zi8gbjx5.png)

Depois de baixar a chave MyKeyPair, você vai querer armazenar sua chave em um local seguro. 

⚠️ Se você perder sua chave, você não será capaz de acessar sua instância. Se outra pessoa tiver acesso à sua chave, ela poderá acessar, simples assim. Para saber mais sobre como armazenar sua Key de forma segura sugiro que dê uma lida [aqui](https://www.amazonaws.cn/en/getting-started/tutorials/launch-a-virtual-machine/)

### Finalmentes

Calma estamos chegando no final já, no passo anterior criamos uma instância no EC2 via interface mas agora vamos criar tudo utilizando o Terraform e lembrando que também precisamos criar uma Bucket no S3 chamado `bucket-launched-use-terrafrom-20220304`. O nome do bucket deve ser único na AWS. Sugiro de digite o código abaixo no arquivo `configuration.tf` fornencendo a Access Key, Secret Key, região e o nome do Bucket (eu sei que vai copiar em colar)

```
#Define keys and region
provider "aws" {
access_key = "YOUR-ACCESS-KEY"
secret_key = "YOUR-SECRET-KEY"
region = "us-west-2"
}
#Define ec2 instance 
resource "aws_instance" "instance1" {
ami = "ami-089668cd321f3cf82"
instance_type = "t2.micro"
tags = {
Name = "ubuntu-20.04"
}
}
#Define s3 bucket
resource "aws_s3_bucket" "bucket1" {
bucket = "bucket-launched-using-terrafrom-20210106"
acl = "private" # or can be "public-read"
tags = {
Name = "Bucket"
Environment = "Production"
}
}
```

Agora vamos inicializar, planejar e executar nosso código. 
A inicializar o terraform ele fará a configuração necessária, já o planejamento é como nós vamos ver o que vai acontecer na realidade, ele também descobrirá erros de sintaxe. E, por fim, implantará o código na nuvem. Para isso vamos executar o seguinte comando um por um.

Seguindo o fluxo vamos a inicialização do terraform que fará a configuração necessária. Para isso precisaremos executar o seguinte comando:

```
$ terraform init
```

Temos que executar o planejamento que é como vamos ver o que vai acontecer na realidade e como dito, também descobrirá seu erro de sintaxe.

```
$ terraform plan
```
e por último mas não menos importante vem aplicação que significa que implantaremos o código na nuvem. Vamos fazer isso apenas executando o comando:

```
$ terraform apply
```

Ele nos pedirá confirmação, e basta digitar "sim" e pressionar o enter para poucos segundos depois nossa infraestrutura estará pronta. Agora podemos fazer login no console AWS e ir para o serviço EC2

![EC2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/khx1o2y7iopvim6g8yeu.png)

E encontraremos o EC2 é funcionando. Da mesma forma, podemos para S3 e procure o nosso Bucket:

![Bucket](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vitjuwvza47g8l9iu3xu.png)

## Destruindo a estrutura

Se quiser destruir a infraestrutura acima, podemos simplesmente digitar `terraform destroy`:

```
$ terraform destroy
```

Ele vai solicitar umaa confirmação e basta apenas dizer **sim** e pressione **enter**. A instância EC2 e o Balde S3 que criamos acima devem ser removidos de nossa conta AWS. Mas por via das dúvidas é bom verificarmos fazendo login no console AWS.

Fontes onde pesquisei esse conteúdo:
- https://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/EC2_GetStarted.html
- https://www.amazonaws.cn/en/getting-started/tutorials/launch-a-virtual-machine/