Como Executar Scripts Terraform Utilizando um AWS IAM User com MFA Habilitado?

Edson Morais
3 min readMay 2, 2021

É muito comum executarmos scripts Terraform em esteiras DevOps, cenário no qual as credenciais (sejam elas Service Accounts ou Access e Secret Keys) são fornecidas automaticamente e transparente, ou seja, o executor do processo não precisa se preocupar nem conhecer as credenciais necessárias para o provisionamento e interação entre os scripts e o provedor de nuvem utilizado.

Neste artigo vou focar em um cenário no qual o executor do processo precisa executar scripts Terraform em seu host local utilizando além das suas credenciais da AWS (Access e Secret Keys), também fornecer o seu token MFA. Considerando que o executor do processo acessa as várias contas AWS somente a partir de switch role.

Este modelo de organização de IAM, pode implicar que o executor do processo organize suas credenciais em seu host local seguindo boas práticas conforme a documentação [doc 1], [doc 2] e [doc 3]. Que pode resultar na seguinte estrutura dos arquivos que contém as informações das credenciais AWS:

Podemos organizar os scripts Terraform de diversar maneiras. E gostaria de compartilhar este pequeno exemplo:

O fato de possibilitar mais de uma ‘versão própria’ para os scripts dos cloud components, se deve ao fato de que em determinados ambientes, mesmo com um controle de versionamento de código, prefere não instanciar versões considerando um determinado ‘código commitado’ e sim o latest de determinada ‘versão própria’ commitada. Já o fato de de possibilitar mais de uma compatibilidade com versões do Terraform, se deve ao fato de que em determinados ambientes não é possível atualizar os scripts Terraform, ou o nível de risco é alto o suficiente para não permitir a atualização destes scripts.

Por fim ao invés de executar os scripts Terraform, executando comandos como terraform plan, terraform apply ou terraform destroy — diretamente no diretório onde estão os scripts, deixo um exemplo de uso de um script Bash (que também pode ser um Shell ou ser utilizado como um Makefile) para orquestrar a execução dos scripts Terraform — e aonde está, enfim, o momento onde vamos especificar a necessidade da digitação do token MFA:

É o bloco de código cujo comentário é # Starting AWS Session é o trigger para a chamada ao Assume Role e Requerimento do token MFA.

Também, neste exemplo, quero abordar a possibilidade de isolar o processamento dos scripts contidos nos diretórios do projeto, ou seja, o executor consegue controlar, por exemplo, o Plan, Apply e Destroy dos componentes Storage e User (como demonstrei na estrutura de organização dos scripts Terraform) separadamente.

E o bloco de código cujo comentário é # Provisioning AWS S3 Bucket for TF State vai garantir que todo estado do processamento seja devidamente armazenado (para futuras checagens do Terraform), neste exemplo utilizando o AWS S3 como storage.

Encerrando o raciocínio, para executar o script de orquestração da automação, considerando todos os exemplos e sugestões anteriores temos:

./automation.sh @aws_account_prefix @aws_account_number @aws_account_region @aws_credentials_profile @project_name @project_component @terraform_action

Onde:

@aws_account_prefix [dev ; qa ; prd]
@aws_account_number [111111111111 ; 222222222222 ; 333333333333]
@aws_account_region [eu-west-1]
@aws_credentials_profile [env-dev ; env-qa ; env-pp]
@project_name [my-big-systems]
@project_component [storage ; iam]
@terraform_action [plan ; apply ; destroy]

./automation.sh dev 111111111111 eu-west-1 env-dev my-big-systems storage plan

Desejo que estes exemplos sejam úteis, que além dos comandos e lógicas técnicas, a idéia possa gerar novas idéias! E ainda melhores!

--

--