Skip to content

Latest commit

 

History

History
618 lines (514 loc) · 21.6 KB

README.md

File metadata and controls

618 lines (514 loc) · 21.6 KB

Terraform


Ler em Português - BR


Terraform é uma ferramenta de infraestrutura como código (IaC) desenvolvida pela HashiCorp. Ela permite que você defina sua infraestrutura de maneira declarativa, ou seja, você descreve o que quer que sua infraestrutura seja e o Terraform se encarrega de criar e gerenciar os recursos necessários para atender às suas especificações.

Com o Terraform, você pode gerenciar recursos em uma variedade de provedores de nuvem, incluindo Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP), dentre outros. Além disso, você também pode gerenciar recursos on-premises, como servidores físicos e virtuais.

O Terraform usa uma linguagem simples para definir a infraestrutura, chamada HashiCorp Configuration Language (HCL), que é fácil de entender e escrever. Ele permite que você crie, atualize e exclua recursos com segurança e facilidade, enquanto mantém um histórico completo de todas as mudanças feitas em sua infraestrutura.

O Terraform também oferece suporte a módulos, que são blocos reutilizáveis de configuração que podem ser compartilhados entre projetos e equipes. Isso ajuda a promover a reutilização de código e a padronização das configurações de infraestrutura.

Em resumo, o Terraform é uma ferramenta poderosa e flexível para gerenciar infraestrutura como código, permitindo que você crie, atualize e exclua recursos em diferentes provedores de nuvem e on-premises de maneira segura e fácil.


Configurações iniciais

AWS CLI

Para realizar a comunicação da sua aplicação do Terraform com os serviços da AWS é necessário fazer um vinculo

Uma forma de fazer essa comunicação é através da AWS CLI. As configurações que serão feitas, ficará salva em ~/aws/credentials:

  • Configurar profile (usuário) em sua máquina: se você possui apenas um único usuário na sua conta da aws, basta:
    aws configure
    

    mas, se você possui mais de um usuário em sua conta aws, é necessário especificar o usuário:

    aws configure --profile "nome_do_usuario"
    
  • Configurar Access Key e Secret Key: após informar o usuário, a AWS CLI vai pedir o Access Key e Secret Key. Caso não tenha, acesse a AWS na parte de usuário (IAM), e habilite essa forma de credencial. Tendo a Access Key e Secret Key, apenas cole.
  • Configurar a região: será pedido a região da sua aplicação, vai descobrir acesse a sua conta na AWS e clique na Guia global, a primeira opção que aparecer é a sua região ou olhe no link da aws, vai ter escrito region=nome_da_sua_regiao. Digite/cole a sua região no AWS CLI.
  • Configurar o output format: para confirgurar a saída dos dados, pode ser escolhido o formato json. Então basta digitar json.

Provedores

No contexto do Terraform e da infraestrutura como código (IaC), um "provider" refere-se ao plugin responsável por gerenciar e interagir com um provedor de nuvem ou serviço específico. Cada provedor de nuvem (por exemplo, AWS, Azure, Google Cloud) ou provedor de serviço (por exemplo, GitHub, Docker) possui seu próprio provedor no Terraform.

Para encontrar os scripts de exemplos, considere usar a página oficial do Terraform Registry

Clique em 'documentação' e pesquise pelo nome do recurso da AWS que você deseja construir usando o Terraform: EC2, ECS, S3, SNS, SQS, DynamoDB, Lambda, etc.

Comandos

Comuns

Comando Ação
terraform init inicializa o gerenciamento
terraform plan Organiza o projeto e se necessário faz validações
terraform validate Faz validações no projeto e indica melhorias
terraform apply Se tudo estiver bem, esse comando vai enviar o que foi feito para a AWS
terraform fmt Formata a identação do código

Variáveis de Ambiente

Essa é a forma de configurar as variáveis de ambiente via terminal/cli. Existem outras formas como: credential (um arquivo de autenticação da AWS) ou criando um arquivo para guardar as variáveis de ambiente

Amostra Comando Ação
VAR_NAME = VALUE AWS_ACCESS_KEY_ID=[VALUE AWS_ACCESS_KEY_ID] Configura o valor da variável de ambiente do Access key ID
AWS_SECRET_KEY=[VALUE AWS_SECRET_KEY] Configura o valor da variável de ambiente do Secret access key
TF_VAR_ + name_var = [value terraform plan] TF_VAR_aws_profile=value terraform plan Configura o valor da variável de ambiente do usuário
terraform plan + -var="aws_ + var=[value]" terraform plan -var="aws_profile=[profile_value]" Configura o valor da variável de ambiente do usuário
terraform plan -var="instance_type=[instance_value]" Configura o valor da variável de ambiente da instância

Extras

Comando Ação
terraform -h permite visualizar todos os comandos
terraform plan -out="tfplan.out" Prepara para criar um arquivo chamado "tfplan.out" que conterá as informações de saída
terraform apply "tfplan.out" Cria um arquivo chamado "tfplan.out" que vai conter as informações de saída
terraform console Após esse comando basta digitar o nome de um recurso mais '.this' para ver todos os atributos (recurso.this) ou se quiser ver um atributo em específico adiciona '.nome_do_atributo' (recurso.this.nome_do_atributo)

Arquivos

Variáveis de ambiente

Uma forma de criar variáveis de ambiente além de comandos (seção comandos), é por meio de arquivos:

Arquivos Estrutura do código Utilização da variável no main.tf
.tf
variable "aws_region" {
type = string
description = ""
default = "us-east-1"
}
provider "aws" {
region  = var.aws_region
}
.tfvars
aws_region  = "us-east-1"
aws_profile = "default"
provider "aws" {
region  = var.aws_region
profile = var.aws_profile
}

terraform.tfstate

O arquivo "terraform.tfstate" é um arquivo JSON gerado pelo Terraform que contém o estado atual dos recursos de infraestrutura gerenciados por ele. O arquivo é geralmente criado quando se executa o comando "terraform apply" pela primeira vez, e é atualizado a cada alteração subsequente feita pela execução do Terraform, possui a versão do projeto, outputs, resources (ID e tipo), variáveis de ambiente, configurações de atributos específicos, histórico de mundanças que foram feitas.

Este arquivo é extremamente importante para o Terraform, pois ele usa essas informações para determinar qual é o estado atual da infraestrutura gerenciada, e então decide qual mudança precisa ser feita para trazer a infraestrutura para o estado desejado. Além disso, ele permite que o Terraform possa facilmente comparar o estado atual da infraestrutura com o estado desejado definido no código, e gerenciar as diferenças de forma automática.

 {
  "version": 4,
  "terraform_version": "1.0.3",
  "serial": 1,
  "lineage": "e90d4231-8bb2-4e63-93c3-3edc53f165b9",
  "outputs": {},
  "resources": [
    {
      "type": "aws_instance",
      "depends_on": [],
      "primary": {
        "id": "i-0a1b2c3d4e5f67890",
        "attributes": {
          "ami": "ami-0c55b159cbfafe1f0",
          "instance_type": "t2.micro",
          "subnet_id": "subnet-0123456789abcdef0",
          "vpc_security_group_ids": [
            "sg-0123456789abcdef0"
          ]
        },
        "meta": {},
        "tainted": false
      }
    },
    {
      "type": "aws_security_group",
      "depends_on": [],
      "primary": {
        "id": "sg-0123456789abcdef0",
        "attributes": {
          "description": "My security group",
          "name": "my-security-group",
          "tags.%": "1",
          "tags.Name": "my-security-group"
        },
        "meta": {},
        "tainted": false
      }
    }
  ]
}

  
  

Exemplos

Projeto Propósitos Recursos
01-bucket-s3 criação de um bucket no S3 aws_s3_bucket
02-bucket-s3-update-delete Foi feito um reaproveitamento do projeto 01-bucket-s3, onde atualizei algumas propriedades para testar o comportamento do Terraform ao atualizar e deletar
03-variables-with-ec2 criação de um EC2 utilizando variaveis de ambiente aws_instance
04-variables-and-precedence-with-ec2 criação de um EC2 utilizando diferentes formas de variáveis de ambiente e utilizando a precedência Precedência de definição de variável

Read in English - US


Terraform is an Infrastructure as Code (IaC) tool developed by HashiCorp. It allows you to define your infrastructure declaratively, meaning you describe what you want your infrastructure to be and Terraform takes care of creating and managing the necessary resources to meet your specifications.

With Terraform, you can manage resources in a variety of cloud providers, including Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP), among others. Additionally, you can also manage on-premises resources such as physical and virtual servers.

Terraform uses a simple language to define infrastructure called HashiCorp Configuration Language (HCL), which is easy to understand and write. It enables you to create, update, and delete resources safely and easily, while maintaining a complete history of all changes made to your infrastructure.

Terraform also supports modules, which are reusable configuration blocks that can be shared across projects and teams. This helps promote code reuse and standardization of infrastructure configurations.

In summary, Terraform is a powerful and flexible tool for managing infrastructure as code, allowing you to create, update, and delete resources across different cloud providers and on-premises in a safe and easy way.


Initial Settings

AWS CLI

To establish communication between your Terraform application and AWS services, it's necessary to create a link.

One way to do this is through AWS CLI. The settings made will be saved in ~/aws/credentials:

  • Set up a profile (user) on your machine: if you have only one user in your AWS account, just type:
    aws configure
    

    but if you have more than one user in your AWS account, you need to specify the user:

    aws configure --profile "user_name"
    
  • Set up Access Key and Secret Key: after informing the user, AWS CLI will ask for the Access Key and Secret Key. If you don't have them, access AWS under the user section (IAM), and enable this type of credential. With the Access Key and Secret Key, just copy and paste.
  • Set up the region: the region of your application will be requested. To find out, access your AWS account and click on the Global tab. The first option that appears is your region or check the aws link, it will have "region=your_region_name" written. Enter/paste your region in AWS CLI.
  • Set up the output format: to configure the output data, the json format can be chosen. So just type json.

Providers

In the context of Terraform and infrastructure as code (IaC), a "provider" refers to the plugin responsible for managing and interacting with a specific cloud or service provider. Each cloud provider (e.g., AWS, Azure, Google Cloud) or service provider (e.g., GitHub, Docker) has its own Terraform provider.

To find the examples script, consider to use the oficial page Terraform Registry

Click on 'documentation' and search by the name of AWS resource you wish to build using Terraform: EC2, ECS, S3, SNS, SQS, DynamoDB, Lambda, etc

Commands

Commons

Command Action
terraform init initializes the management
terraform plan Organizes the project and, if necessary, performs validations
terraform validate Validates the project and suggests improvements
terraform apply If everything is ok, this command will send what was done to AWS
terraform fmt Formats code indentation

Environment Variables

This is the way to configure environment variables via terminal/cli. There are other ways, such as using a credential file (an AWS authentication file) or creating a file to store the environment variables.

Sample Command Action
VAR_NAME = VALUE AWS_ACCESS_KEY_ID=[VALUE AWS_ACCESS_KEY_ID] Configures the value of the Access key ID environment variable
AWS_SECRET_KEY=[VALUE AWS_SECRET_KEY] Configures the value of the Secret access key environment variable
TF_VAR_ + name_var = [value terraform plan] TF_VAR_aws_profile=value terraform plan Configures the value of the user environment variable
terraform plan + -var="aws_ + var=[value]" terraform plan -var="aws_profile=[profile_value]" Configures the value of the user environment variable
terraform plan -var="instance_type=[instance_value]" Configures the value of the instance environment variable

Extras

Command Action
terraform -h to see all commands
terraform plan -out="tfplan.out" Prepare to create a file called "tfplan.out" which will contain the output information
terraform apply "tfplan.out" Creates a file named "tfplan.out" that will contain the output information
terraform console After running this command, just type the name of a resource followed by '.this' to see all of its attributes (resource.this), or if you want to see a specific attribute, add '.attribute_name' (resource.this.attribute_name)

Files

Environment Variables

One way to create environment variables in addition to commands (commands section) is through files:

Files Code structure Usage of the variable in main.tf
.tf
variable "aws_region" {
type = string
description = ""
default = "us-east-1"
}
provider "aws" {
region  = var.aws_region
}
.tfvars
aws_region  = "us-east-1"
aws_profile = "default"
provider "aws" {
region  = var.aws_region
profile = var.aws_profile
}

terraform.tfstate

The "terraform.tfstate" file is a JSON file generated by Terraform that contains the current state of the infrastructure resources managed by it. The file is usually created when running the "terraform apply" command for the first time, and it's updated with every subsequent change made by Terraform. It includes the project version, outputs, resources (ID and type), environment variables, specific attribute configurations, and change history.

This file is extremely important for Terraform because it uses this information to determine what the current state of the managed infrastructure is, and then decides what changes need to be made to bring the infrastructure to the desired state. Additionally, it allows Terraform to easily compare the current state of the infrastructure with the desired state defined in the code and manage the differences automatically.

  
 {
  "version": 4,
  "terraform_version": "1.0.3",
  "serial": 1,
  "lineage": "e90d4231-8bb2-4e63-93c3-3edc53f165b9",
  "outputs": {},
  "resources": [
    {
      "type": "aws_instance",
      "depends_on": [],
      "primary": {
        "id": "i-0a1b2c3d4e5f67890",
        "attributes": {
          "ami": "ami-0c55b159cbfafe1f0",
          "instance_type": "t2.micro",
          "subnet_id": "subnet-0123456789abcdef0",
          "vpc_security_group_ids": [
            "sg-0123456789abcdef0"
          ]
        },
        "meta": {},
        "tainted": false
      }
    },
    {
      "type": "aws_security_group",
      "depends_on": [],
      "primary": {
        "id": "sg-0123456789abcdef0",
        "attributes": {
          "description": "My security group",
          "name": "my-security-group",
          "tags.%": "1",
          "tags.Name": "my-security-group"
        },
        "meta": {},
        "tainted": false
      }
    }
  ]
}
  

Examples

Project Purposes Resources
01-bucket-s3 create an S3 bucket aws_s3_bucket
02-bucket-s3-update-delete Reuse of the 01-bucket-s3 project, where I updated some properties to test Terraform's behavior when updating and deleting
03-variables-with-ec2 Creation of an EC2 using environment variables aws_instance
04-variables-and-precedence-with-ec2 Creation of an EC2 using different types of environment variables and utilizing precedence Variable definition precedence