Terraform: Como refletir as mudanças dinâmicas de recursos no estado remoto?

1

Eu tropecei em um problema geral no Terraform. Por exemplo, tenho um recurso como aws_autoscaling_group , que tem desired_capacity , que pode ser ampliado ou reduzido com base nos alarmes do CloudWatch.

No entanto, ao executar terraform apply o arquivo de estado do Terraform não sabe sobre essas mudanças e tenta definir a capacidade de volta ao valor inicial definido no estado.

Eu pensei em uma solução e descobri isso:

# initialise terraform, ideally against a remote state in S3
terraform init
# remove resource from state
terraform state rm "aws_autoscaling_group.main"
# import resource from remote so it reflects the current capacity
terraform import "aws_autoscaling_group.main" "my-autoscaling-group"

No entanto, ao executar terraform plan , isso não reflete as alterações importadas:

~ aws_autoscaling_group.main
      desired_capacity:          "3" => "2"
      force_delete:              "" => "true"
      metrics_granularity:       "" => "1Minute"
      wait_for_capacity_timeout: "" => "10m"
Plan: 0 to add, 1 to change, 0 to destroy.

Além disso, isso é muito propenso a erros: por exemplo, depois de importar o recurso, o recurso remoto pode mudar (por exemplo, um alarme é acionado diretamente depois de eu ter importado o recurso) para que fique fora de sincronia novamente.

É este o design pretendido e, em caso afirmativo, o que posso fazer em relação a isso?

    
por bitbrain 09.10.2017 / 12:59

1 resposta

2

Sim, é assim que o terraform funciona. Ele olha para o seu arquivo de estado para o que ele sabe que deve ser o estado da sua infraestrutura e, em seguida, ele consulta a API para o que é atualmente e basicamente faz um diff e diz a você o que mudou e eu vou mudar isso para fazer o estado que você me contou. Claro que você está usando ASGs que podem mudar dinamicamente.

Então terraform como opções de ciclo de vida que você pode usar

link

Portanto, podemos usá-los para informar ao terraform que você deseja ignorar quaisquer alterações em determinadas opções em um recurso

Então, no seu caso

lifecycle {
    ignore_changes = ["desired_capacity"]
}
    
por 09.10.2017 / 13:14