Terraform é uma ferramenta popular de software de infraestrutura como código desenvolvida pela HashiCorp. Você o usa para provisionar todos os tipos de infraestrutura e serviços, incluindo New Relic e alerta.
Terragrunt é um wrapper fino em torno do Terraform que fornece ferramentas extras para:
- Reduzindo a repetição
- Trabalhando com vários módulos Terraform
- Gerenciando estado remoto
Neste guia, você usa o Terragrunt para:
- Gere sua configuração do Terraform
- Criar arquivos
- Gerenciar vários ambientes
Antes de você começar
Para usar este guia, você deve ter algum conhecimento básico do New Relic e do Terraform.
Se você ainda não o fez:
Para seguir os exemplos neste guia, você pode encontrar código de exemplo no GitHub.
Crie uma configuração
Terragrunt fornece ferramentas extras para sua configuração do Terraform. Aqui, você cria uma configuração usando Terragrunt, Terraform e New Relic.
Inicialize um espaço de trabalho:
$mkdir terragrunt-config && cd terragrunt-config
Na sua nova pasta, crie um arquivo terragrunt.hcl :
$touch terragrunt.hcl
A seguir, crie uma pasta de ambientes com uma subpasta chamada dev:
$mkdir -p environments/dev
Em seguida, crie uma pasta src com os arquivos main.tf e provider.tf :
$mkdir src$touch src/main.tf$touch src/provider.tf
Você configura recursos do Terraform em main.tf e provedores em provider.tf.
Em src/provider.tf, configurar um provedor New Relic.
terraform { required_version = "~> 0.14.3" required_providers { newrelic = { source = "newrelic/newrelic" version = "~> 2.14.0" } }}
Em src/main.tf, adicione uma política de alertas da New Relic chamada DemoPolicy
:
resource "newrelic_alert_policy" "DemoPolicy" { name = "My Demo Policy"}
Em ambientes/dev, crie um arquivo chamado terragrunt.hcl:
$touch environments/dev/terragrunt.hcl
Nele, adicione a seguinte instrução include
:
include { path = find_in_parent_folders()}
Isso instrui o Terragrunt a usar qualquer .hcl arquivos de configuração encontrados nas pastas pai.
Adicione um bloco terraform
para fornecer ao Terragrunt uma referência de origem:
include { path = find_in_parent_folders()}
terraform { source = "../../src"}
Em src/provider.tf, configure o provedor New Relic com uma chave de API, ID de conta e região:
terraform { required_version = "~> 0.14.3" required_providers { newrelic = { source = "newrelic/newrelic" version = "~> 2.14.0" } }}
variable "newrelic_personal_apikey" {}variable "newrelic_account_id" {}variable "newrelic_region" {}
provider "newrelic" { account_id = var.newrelic_account_id api_key = var.newrelic_personal_apikey region = var.newrelic_region}
Você usa variáveis para manter sua configuração dinâmica.
Em ambientes/dev, inicialize o terragrunt:
$terragrunt init
Isso configura um pouco de contexto, incluindo variáveis de ambiente, e então executa terraform init
:
Terraform has created a lock file .terraform.lock.hcl to record the providerselections it made above. Include this file in your version control repositoryso that Terraform can guarantee to make the same selections by default whenyou run "terraform init" in the future.Terraform has been successfully initialized!You may now begin working with Terraform. Try running "terraform plan" to seeany changes that are required for your infrastructure. All Terraform commandsshould now work.If you ever set or change modules or backend configuration for Terraform,rerun this command to reinitialize your working directory. If you forget, othercommands will detect it and remind you to do so if necessary.[terragrunt] [/workspace/terragrunt-config/environments/dev] 2021/02/02 13:30:31 Copying lock file [output] from /workspace/terragrunt-config/environments/dev/.terragrunt-cache/e-PoBgWhdv3v8QGOtDQxS_WeYu4/69zjIFUfApJiUt8gFmi-6-dcPe8/.terraform.lock.hcl to /workspace/terragrunt-config/environments/dev
Em environments/dev/terragrunt.hcl, adicione um bloco inputs
para fornecer valores para as variáveis da sua conta New Relic:
inputs = { newrelic_personal_apikey = "NRAK-*<DNT>**" # Your New Relic account ID newrelic_account_id = "12345" # Your New Relic account ID newrelic_region = "US" # US or EU (defaults to US)}
Agora, execute terragrunt plan
:
An execution plan has been generated and is shown below.Resource actions are indicated with the following symbols: + createTerraform will perform the following actions: # newrelic_alert_policy.DemoPolicy will be created + resource "newrelic_alert_policy" "DemoPolicy" { + account_id = (known after apply) + id = (known after apply) + incident_preference = "PER_POLICY" + name = "My Demo Policy" }Plan: 1 to add, 0 to change, 0 to destroy.------------------------------------------------------------------------Note: You didn't specify an "-out" parameter to save this plan, so Terraformcan't guarantee that exactly these actions will be performed if"terraform apply" is subsequently run.
Terragrunt fornece os valores do bloco inputs
.
Execute terragrunt apply
:
$terragrunt apply
Agora sua Política de Demonstração está em sua conta New Relic.
Adicione à sua configuração
Agora que você criou uma configuração básica do New Relic, adicione as configurações de nossos guias de introdução ao New Relic e aos módulos Terraform e Terraform .
Dica
Se você ainda não seguiu esses guias, pode copiar a configuração do repositório Github de introdução do Terragrunt.
Em src/main.tf, atualize o endereço de e-mail no canal de alerta para o endereço de e-mail de sua preferência:
resource "newrelic_alert_policy" "DemoPolicy" { name = "My Demo Policy"}
resource "newrelic_alert_channel" "DemoChannel" { name = "My Demo Channel" type = "email"
config { recipients = "your@email_address.com" include_json_attachment = "1" }}
resource "newrelic_alert_policy_channel" "ChannelSubs" { policy_id = newrelic_alert_policy.DemoPolicy.id channel_ids = [ newrelic_alert_channel.DemoChannel.id ]}
module "HostConditions" { source = "git::https://github.com/jsbnr/demo-terraform.git" policyId = newrelic_alert_policy.DemoPolicy.id cpu_critical = 88 cpu_warning = 78 diskPercent = 68}
Aqui, você adicionou um canal de alerta New Relic, inscreveu a política de demonstração no canal de alerta e adicionou um módulo hospedado no Github.
Execute terragrunt init
e depois execute terragrunt apply
:
$terragrunt init$terragrunt apply
Após a conclusão do processamento do Terraform, sua política de alertas terá duas condições e um canal de alerta.
Use seu ambiente como uma variável Terragrunt
Com o Terragrunt, você pode adicionar o nome do ambiente que está executando ao nome dos dados que está criando, tornando seu recurso mais identificável no New Relic.
No arquivo raiz terragrunt.hcl , crie uma entrada para env_name
:
inputs = { env_name = "develop"}
No src/main.tf, file adicione uma nova variável chamada env_name
:
variable "env_name" {}
Adicione a nova variável env_name
à política de alertas e aos blocos de recursos do canal de alerta:
resource "newrelic_alert_policy" "DemoPolicy" { name = "${var.env_name}: My Demo Policy"}
resource "newrelic_alert_channel" "DemoChannel" { name = "${env_name}: My Demo Channel" type = "email"
config { recipients = "your@email_address.com" include_json_attachment = "1" }}
Execute terragrunt plan
para ver a variável de ambiente adicionada ao nome da sua política:
# newrelic_alert_policy.DemoPolicy will be updated in-place~ resource "newrelic_alert_policy" "DemoPolicy" { id = "1216533" ~ name = "My Demo Policy" -> "develop: My Demo Policy" # (2 unchanged attributes hidden) }# newrelic_alert_policy_channel.ChannelSubs must be replaced-/+ resource "newrelic_alert_policy_channel" "ChannelSubs" { ~ channel_ids = [ - 4737437, ] -> (known after apply) # forces replacement ~ id = "1216533:4737437" -> (known after apply) # (1 unchanged attribute hidden) }
Aqui, você codificou o ambiente em terragrunt.hcl. Para tornar isso mais dinâmico, use uma função integrada do terragrunt para obter o ambiente para você.
No arquivo raiz terragrunt.hcl , atualize a entrada para usar path_relative_to_include()
e passe o valor como a variável env_name
:
inputs = { env_name = path_relative_to_include()}
Execute terragrunt plan
:
# newrelic_alert_policy.DemoPolicy will be updated in-place~ resource "newrelic_alert_policy" "DemoPolicy" { id = "1216533" ~ name = "My Demo Policy" -> "environments/dev: My Demo Policy" # (2 unchanged attributes hidden) }# newrelic_alert_policy_channel.ChannelSubs must be replaced-/+ resource "newrelic_alert_policy_channel" "ChannelSubs" { ~ channel_ids = [ - 4737437, ] -> (known after apply) # forces replacement ~ id = "1216533:4737437" -> (known after apply) # (1 unchanged attribute hidden) }Plan: 2 to add, 1 to change, 2 to destroy.
Observe que a variável env_name
possui todo o caminho ./environments/dev/
. Em vez disso, você deseja incluir apenas a parte “dev”.
Atualize o terragrunt.hcl para remover "environements/" de env_name
:
locals { env_name = replace(path_relative_to_include(), "environments/", "")}
inputs = { env_name = local.env_name}
Aqui, você adicionou um bloco locals
para criar uma variável local e usou a função replace
integrada para remover as partes indesejadas do caminho relativo. Em seguida, você atualizou o bloco inputs
para usar a variável local.
Execute terragrunt plan
:
# newrelic_alert_policy.DemoPolicy will be updated in-place ~ resource "newrelic_alert_policy" "DemoPolicy" { id = "1216533" ~ name = "My Demo Policy" -> "dev: My Demo Policy" # (2 unchanged attributes hidden) } # newrelic_alert_policy_channel.ChannelSubs must be replaced-/+ resource "newrelic_alert_policy_channel" "ChannelSubs" { ~ channel_ids = [ - 4737437, ] -> (known after apply) # forces replacement ~ id = "1216533:4737437" -> (known after apply) # (1 unchanged attribute hidden) }Plan: 2 to add, 1 to change, 2 to destroy.
O nome da sua nova política é "dev: My Demo Policy".
Execute terragrunt apply
para atualizar sua configuração:
$terragrunt apply
Mova seu estado para armazenamento remoto
No momento, seu arquivo de estado é local. Agora, você atualiza sua configuração do Terraform para armazená-la no Amazon S3.
Dica
Como o Terragrunt permite configurar vários ambientes, você deve armazenar arquivos de estado em seus próprios buckets S3 para que não se sobrescrevam.
Crie um bucket S3 para seu arquivo de estado de desenvolvimento.
Na sua raiz terragrunt.hcl, adicione um bloco remote_state
que informa ao Terragrunt onde colocar seu arquivo no S3:
remote_state { backend = "s3" generate = { path = "backend.tf" if_exists = "overwrite_terragrunt" } config = { bucket = "YOUR_S3_BUCKET_NAME" # Amazon S3 bucket required
key = "envs/${local.env_name}/terraform.tfstate" region = "us-east-1" encrypt = true profile = "YOUR_PROFILE_NAME" # Profile name required }}
Aqui, você definiu uma configuração de estado remoto que especifica um nome de bucket, região, criptografia e perfil. Certifique-se de substituir os valores do espaço reservado por valores reais. Para key
, você usou o env_name
local criado anteriormente para definir dinamicamente o ambiente para o arquivo de estado. Finalmente, você disse ao Terragrunt para gerar um novo arquivo chamado backend.tf em seu bucket.
Execute terragrunt plan
:
$terragrunt plan
No seu bucket, você verá uma pasta chamada envs. Dentro dela há uma pasta chamada devs contendo um arquivo terraform.tfstate .
Dica
Dentro de envs/dev
, existe uma pasta oculta chamada terragrunt-cache. Nele está o arquivo backend.tf que o Terragrunt gerou.
Crie um novo ambiente
Agora que você configurou seu ambiente de desenvolvimento, crie outro que reutilize a maior parte do seu trabalho.
Em ambientes, crie uma pasta chamada nonprod. Nele, crie um arquivo chamado terragrunt.hcl:
$mkdir nonprod && cd nonprod$touch terragrunt.hcl
Em environments/nonprod/terragrunt.hcl, copie a configuração de environments/dev/terragrunt.hcl:
include { path= find_in_parent_folders()}
terraform { source = "../../src"}
inputs = { newrelic_personal_apikey = "NRAK-**</DNT>*" # Your New Relic account ID newrelic_account_id = "12345" # Your New Relic account ID newrelic_region = "US" # US or EU (defaults to US)}
Dica
Se você estiver usando uma conta diferente para seu ambiente que não seja de produção, atualize inputs
com um novo ID de conta, chave de API e região.
Dentro de nonprod, execute terragrunt init
e terragrunt apply
:
$terragrunt init$terragrunt apply
O Terraform cria um novo conjunto de recursos prefixados com "nonprod:".
Agora, você criou dois ambientes, dev e nonprod, mas eles são iguais, exceto pelo nome.
Em src/main.tf, adicione novas variáveis para o módulo Host Conditions:
variable "cpu_critical" {default = 89}variable "cpu_warningl" {default = 79}variable "diskPercentage" {default = 69}
Usar variáveis como essas torna sua configuração mais dinâmica.
Atualize HostConditions
para usar as variáveis cpu_critical
, cpu_warning
e diskPercentage
:
module "HostConditions" { source = "git::https://github.com/jsbnr/demo-terraform.git" policyId = newrelic_alert_policy.DemoPolicy.id cpu_critical = var.cpu_critical cpu_warning = var.cpu_warninig diskPercent = var.dskPercentage}
Execute terragrunt plan
:
$terragrunt plan
Os valores HostConditions
agora incluem os padrões de variáveis.
Em nonprod/terragrunt.hcl, adicione valores para suas variáveis:
inputs = { newrelic_personal_apikey = "NRAK-***" # Your New Relic account ID newrelic_account_id = "12345" # Your New Relic account ID newrelic_region = "US" # US or EU (defaults to US)
cpu_critical = 50 cpu_warninig = 40 diskPercentage = 98}
Isso passa os valores para a configuração do seu ambiente.
Execute terragrunt apply
:
$terragrunt apply
Na sua conta New Relic, você tem uma nova política com configuração não específica do produto.
Conclusão
Parabéns! Você usou o Terragrunt para gerar a configuração do New Relic e gerenciar vários ambientes. Revise o exemplo de introdução do Terragrunt, a documentação do provedor New Relic Terraform e o início rápido do Terragrunt para saber como você pode levar sua configuração para o próximo nível.