Criei dois recursos simples que fazem parte do arquivo main.tf:
resource "aws_iam_user" "super_admin" {
count = var.super_admin ? 1 : 0
name = "super_admin"
}
data "aws_iam_user" "super_admin" {
count = var.super_admin ? 0 : 1
user_name = "super_admin"
}
O primeiro bloco verifica se super_admin foi criado, caso contrário, crie-o. O segundo bloco verifica se super_admin foi criado; em caso afirmativo, não faça nada. Talvez eu sinta falta de alguma coisa, de qualquer forma era minha intenção.
Atualmente não funciona e gera erro:
│ Error: getting user: NoSuchEntity: The user with name super_admin cannot be found.
│ status code: 404, request id: 11bf9e73-690c-454b-b739-a71ed56e9315
│
│ with data.aws_iam_user.super_admin[0],
│ on main.tf line 14, in data "aws_iam_user" "super_admin":
│ 14: data "aws_iam_user" "super_admin" {
Minha intenção é criar o usuário super_admin caso ele não exista usando 1 : 0
apenas para fins de aprendizado e para entender melhor como funciona.
Uma configuração do Terraform normalmente não deve ter um
resource
bloco e umdata
bloco referentes ao mesmo objeto, porque umresource
bloco declara que esta configuração irá gerenciar algo diretamente enquanto umdata
bloco declara que você deseja usar um objeto que é gerenciado em outro lugar (ou em outra configuração do Terraform ou nem mesmo com o Terraform).Se quiser incluir ambos na mesma configuração, você precisará ajudar o Terraform a entender que os dois dependem um do outro adicionando uma referência entre eles:
Quando um recurso se refere a outro desta forma, o Terraform infere que as ações do primeiro devem acontecer antes das ações do segundo. O Terraform deve, portanto, planejar a leitura do objeto do
data
bloco apenas durante a fase de aplicação, pois deve aguardar que as alterações relacionadas aoresource
bloco sejam aplicadas primeiro.No entanto, é raro que você precise escrever algo como o acima. Não há necessidade de "verificar" se um objeto foi criado, porque o
hashicorp/aws
provedor (que possui a implementação deaws_iam_user
) retornará um erro se a criação falhar. Se você precisar usar dados sobre esse usuário, como seu ARN, em outro lugar da configuração, poderá consultar diretamente oresource
bloco: