# Напісанне канфігурацый Terraform

## Выкарыстоўвайце `locals` каб задаць дакладныя залежнасці паміж рэсурсамі

Карысны спосаб даць Terraform падказку, што некаторыя рэсурсы павінны быць выдаленыя, нават калі ў канфігурацыях Terraform няма прамой залежнасці.

<https://raw.githubusercontent.com/antonbabenko/terraform-best-practices/master/snippets/locals.tf>

## Terraform 0.12 - абавязковыя і неабавязковыя аргументы

1. Абавязковы аргумент `index_document` павінен быць заданы, калі `var.website` ня ёсць пустой мапай.
2. Дадатковы аргумент `error_document` можна прапусціць.

{% code title="main.tf" %}

```hcl
variable "website" {
  type    = map(string)
  default = {}
}

resource "aws_s3_bucket" "this" {
  # omitted...

  dynamic "website" {
    for_each = length(keys(var.website)) == 0 ? [] : [var.website]

    content {
      index_document = website.value.index_document
      error_document = lookup(website.value, "error_document", null)
    }
  }
}
```

{% endcode %}

{% code title="terraform.tfvars" %}

```hcl
website = {
  index_document = "index.html"
}
```

{% endcode %}

## Кіраванне сакрэтамі ў Terraform

Сакрэты ёсць канфідэнцыйнай інфармацыя, якая можа ўключаць усё што заўгодна: ад пароляў і ключоў шыфравання да токенаў API і service certificates. Звычайна яны выкарыстоўваюцца для наладкі аўтэнтыфікацыі і аўтарызацыі cloud рэсурсаў. Абарона гэтых канфідэнцыйных рэсурсаў мае вырашальнае значэнне, бо іх раскрыццё можа прывесці да парушэнняў бяспекі. Настойліва рэкамендуецца пазбягаць захоўвання сакрэтных даных у канфігурацыі і стане Terraform, паколькі любы чалавек з доступам да сістэмы кантролю версій можа атрымаць да іх доступ. Замест гэтага разгледзьце магчымасць выкарыстання знешніх крыніц даных для атрымання сакрэтных даных з вонкавых крыніц падчас выканання. Напрыклад, калі вы выкарыстоўваеце AWS Secrets Manager, вы можаце выкарыстоўваць крыніцу дадзеных `aws_secretsmanager_secret_version`  для доступу да значэння сакрэта. У наступным прыкладзе выкарыстоўваюцца аргументы толькі для запісу, якія падтрымліваюцца ў Terraform 1.11+ і захоўваюць значэнне па-за станам Terraform.

{% code title="main.tf" %}

```hcl
# Fetch the secret’s metadata
data "aws_secretsmanager_secret" "db_password" {
  name = "my-database-password"
}

# Get the latest secret value
data "aws_secretsmanager_secret_version" "db_password" {
  secret_id = data.aws_secretsmanager_secret.db_password.id
}

# Use the secret without persisting it to state
resource "aws_db_instance" "example" {
  engine         = "mysql"
  instance_class = "db.t3.micro"
  name           = "exampledb"
  username       = "admin"

  # write-only: Terraform sends it to AWS then forgets it
  password_wo = data.aws_secretsmanager_secret_version.db_password.secret_string
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.terraform-best-practices.com/be/writing-terraform-configurations.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
