Тип бэкенда: s3
Сохраняет состояние под заданным ключом в заданном бакете Amazon S3. Этот бэкенд также поддерживает блокировку состояния и проверку согласованности с помощью DynamoDB. Эту возможность можно включить, задав в поле dynamodb_table имя существующей таблицы DynamoDB. Одну таблицу DynamoDB можно использовать для блокировки нескольких файлов удалённого состояния. OpenTofu генерирует имена ключей, включающие значения переменных bucket и key.
Настоятельно рекомендуется включить управление версиями бакета для бакета S3, чтобы обеспечить восстановление состояния в случае случайного удаления или ошибки пользователя.
Пример конфигурации
terraform {
backend "s3" {
bucket = "mybucket"
key = "path/to/my/key"
region = "us-east-1"
}
}Предполагается, что мы создали бакет с именем mybucket. Состояние OpenTofu записывается по ключу path/to/my/key.
Для учётных данных доступа рекомендуется использовать частичную конфигурацию.
Разрешения для бакета S3
Для целевого бакета бэкенда OpenTofu потребуются следующие разрешения AWS IAM:
-
s3:ListBucketдляarn:aws:s3:::mybucket -
s3:GetObjectдляarn:aws:s3:::mybucket/path/to/my/key -
s3:PutObjectдляarn:aws:s3:::mybucket/path/to/my/key -
s3:DeleteObjectдляarn:aws:s3:::mybucket/path/to/my/key
Это показано в следующем операторе AWS IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::mybucket"
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::mybucket/path/to/my/key"
}
]
}AWS может управлять доступом к бакетам S3 с помощью политик IAM, назначенных пользователям, группам или ролям (как в примере выше), либо политик ресурсов, назначенных объектам бакета (они выглядят похоже, но также требуют Principal для указания сущности, которой предоставлены эти разрешения). Дополнительные сведения см. в документации Amazon о управлении доступом к S3.
Разрешения для таблицы DynamoDB
Если вы используете блокировку состояния, OpenTofu потребуются следующие разрешения AWS IAM для таблицы DynamoDB (arn:aws:dynamodb:::table/mytable):
dynamodb:DescribeTabledynamodb:GetItemdynamodb:PutItemdynamodb:DeleteItem
Это показано в следующем операторе AWS IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:DescribeTable",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:DeleteItem"
],
"Resource": "arn:aws:dynamodb:*:*:table/mytable"
}
]
}Настройка источника данных
Чтобы использовать удалённое состояние S3 в другой конфигурации, воспользуйтесь источником данных terraform_remote_state.
data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "tofu-state-prod"
key = "network/terraform.tfstate"
region = "us-east-1"
}
}Источник данных terraform_remote_state возвращает все выходные значения корневого модуля, определённые в указанном удалённом состоянии (но не выходные значения вложенных модулей, если только они не выведены явно ещё раз в корневом модуле). Пример выходных данных может выглядеть так:
data.terraform_remote_state.network: id = 2016-10-29 01:57:59.780010914 +0000 UTC addresses.# = 2 addresses.0 = 52.207.220.222 addresses.1 = 54.196.78.166 backend = s3 config.% = 3 config.bucket = tofu-state-prod config.key = network/terraform.tfstate config.region = us-east-1 elb_address = web-elb-790251200.us-east-1.elb.amazonaws.com public_subnet_id = subnet-1e05dd33
Конфигурация
Для этого бэкенда необходимо настроить регион AWS и хранилище состояния S3. Другие параметры, например включение блокировки состояния с помощью DynamoDB, являются необязательными.
Учётные данные и общая конфигурация
Рекомендуется использовать переменные среды для передачи учётных данных и других конфиденциальных данных. Если вы используете -backend-config или указываете эти значения непосредственно в конфигурации, OpenTofu включит их как в подкаталог .terraform, так и в файлы плана. Подробности см. в разделе Учётные данные и конфиденциальные данные.
Необходимо указать следующую конфигурацию:
-
region— (Обязательно) регион AWS, в котором находятся бакет S3 и таблица DynamoDB (если используется). Также можно задать с помощью переменных средыAWS_DEFAULT_REGIONиAWS_REGION.
Следующая конфигурация является необязательной:
-
access_key— (Необязательно) ключ доступа AWS. Если он задан, необходимо также настроитьsecret_key. Значение также можно получить из переменной средыAWS_ACCESS_KEY_ID, общего файла учётных данных AWS (например,~/.aws/credentials) или общего файла конфигурации AWS (например,~/.aws/config). -
secret_key— (Необязательно) ключ доступа AWS. Если он задан, необходимо также настроитьaccess_key. Значение также можно получить из переменной средыAWS_SECRET_ACCESS_KEY, общего файла учётных данных AWS (например,~/.aws/credentials) или общего файла конфигурации AWS (например,~/.aws/config). -
iam_endpoint— (Необязательно) Устарело. Пользовательская конечная точка API AWS Identity and Access Management (IAM). Значение также можно получить из переменной средыAWS_IAM_ENDPOINT. -
max_retries— (Необязательно) максимальное число повторных попыток запроса к AWS API при ошибках, допускающих повтор. По умолчанию — 5. -
retry_mode— (Необязательно) задаёт способ выполнения повторных попыток. Допустимые значения:standardиadaptive. Значение также можно получить из переменной средыAWS_RETRY_MODE. -
profile— (Необязательно) имя профиля AWS в общем файле учётных данных AWS (например,~/.aws/credentials) или общем файле конфигурации AWS (например,~/.aws/config), используемого для получения учётных данных и/или конфигурации. Значение также можно получить из переменной средыAWS_PROFILE. -
shared_credentials_file— (Необязательно) Устарело. Путь к общему файлу учётных данных AWS. По умолчанию —~/.aws/credentials. -
shared_credentials_files— (Необязательно) список путей к общим файлам учётных данных AWS. По умолчанию —~/.aws/credentials. Значение также можно получить из переменной средыAWS_SHARED_CREDENTIALS_FILE. -
shared_config_files— (Необязательно) список путей к общим файлам конфигурации AWS. По умолчанию —~/.aws/config. Значение также можно получить из переменной средыAWS_SHARED_CONFIG_FILE. -
skip_s3_checksum— (Необязательно) не включать контрольную сумму во входные данные при загрузке объектов S3. Полезно для API, совместимых с S3, но не относящихся к AWS, которые не поддерживают проверку контрольной суммы. -
skip_credentials_validation— (Необязательно) пропустить проверку учётных данных через API STS. -
skip_region_validation— (Необязательно) пропустить проверку указанного имени региона. -
skip_metadata_api_check— (Необязательно) не использовать API метаданных EC2. -
skip_requesting_account_id— (Необязательно) не запрашивать идентификатор учётной записи. Полезно для реализаций AWS API, в которых отсутствуют API IAM, STS или API метаданных. -
sts_endpoint— (Необязательно) Устарело. Пользовательская конечная точка API AWS Security Token Service (STS). Значение также можно получить из переменной средыAWS_STS_ENDPOINT. -
sts_region— (Необязательно) регион AWS для STS. Если не задан, AWS использует для STS тот же регион, что и для операций, не связанных с STS. -
token— (Необязательно) токен многофакторной аутентификации (MFA). Значение также можно получить из переменной средыAWS_SESSION_TOKEN. -
allowed_account_ids(Необязательно): список разрешённых идентификаторов учётных записей AWS для защиты от случайного нарушения работы действующей среды. Этот параметр несовместим сforbidden_account_ids. -
forbidden_account_ids(Необязательно): список запрещённых идентификаторов учётных записей AWS, чтобы предотвратить непреднамеренное нарушение работы действующей среды. Этот параметр несовместим сallowed_account_ids. -
custom_ca_bundle— файл с пользовательскими корневыми и промежуточными сертификатами. Также можно настроить с помощью переменной средыAWS_CA_BUNDLE. -
ec2_metadata_service_endpoint— адрес конечной точки службы метаданных EC2 (IMDS), которую следует использовать. Значение также можно получить из переменной средыAWS_EC2_METADATA_SERVICE_ENDPOINT. -
ec2_metadata_service_endpoint_mode— режим взаимодействия со службой метаданных. Допустимые значения:IPv4иIPv6. Значение также можно получить из переменной средыAWS_EC2_METADATA_SERVICE_ENDPOINT_MODE. -
http_proxy— (Необязательно) адрес HTTP-прокси для доступа к AWS API. Значение также можно получить из переменной средыHTTP_PROXY. -
https_proxy— (Необязательно) адрес HTTPS-прокси для доступа к AWS API. Значение также можно получить из переменной средыHTTPS_PROXY. -
no_proxy— (Необязательно) значения, разделённые запятыми, задающие узлы, для которых не следует использовать прокси при доступе к AWS API. Значение также можно получить из переменной средыNO_PROXY. Подробнее см. здесь. -
insecure— (Необязательно) явно разрешить бэкенду выполнять «небезопасные» запросы SSL; по умолчанию —false. -
use_dualstack_endpoint— (Необязательно) использовать конечную точку с поддержкой DualStack. -
use_fips_endpoint— (Необязательно) использовать конечную точку с поддержкой FIPS.
Настройка конечных точек AWS API
Необязательный аргумент endpoints содержит следующие параметры:
-
s3— (Необязательно) задаёт пользовательский URL конечной точки для AWS S3 API. Значение также можно получить из переменной средыAWS_ENDPOINT_URL_S3или устаревшей переменной средыAWS_S3_ENDPOINT. -
iam— (Необязательно) задаёт пользовательский URL конечной точки для AWS IAM API. Значение также можно получить из переменной средыAWS_ENDPOINT_URL_IAMили устаревшей переменной средыAWS_IAM_ENDPOINT. -
sts— (Необязательно) задаёт пользовательский URL конечной точки для AWS STS API. Значение также можно получить из переменной средыAWS_ENDPOINT_URL_STSили устаревшей переменной средыAWS_STS_ENDPOINT. -
dynamodb— (Необязательно) задаёт пользовательский URL конечной точки для AWS DynamoDB API. Значение также можно получить из переменной средыAWS_ENDPOINT_URL_DYNAMODBили устаревшей переменной средыAWS_DYNAMODB_ENDPOINT.
terraform {
backend "s3" {
endpoints = {
dynamodb = "http://localhost:4569"
s3 = "http://localhost:4572"
}
}
}Настройка принятия роли
Принятие роли IAM является необязательным и может быть настроено двумя способами. Предпочтительный способ — использовать аргумент assume_role; другой способ считается устаревшим.
Аргумент assume_role содержит следующие аргументы:
-
role_arn— (Обязательно) имя ресурса Amazon (ARN) роли IAM, которую нужно принять. -
duration— (Необязательно) срок действия отдельных учётных данных. Эти учётные данные автоматически обновляются в пределах максимального срока, заданного учётной записью AWS. Продолжительность следует указывать в формате<hours>h<minutes>m<seconds>s, при этом любую единицу измерения можно опустить. Например, полтора часа можно указать как1h30mили просто90m. Срок должен составлять от 15 минут (15m) до 12 часов (12h). -
external_id— (Необязательно) внешний идентификатор, используемый при принятии роли. -
policy— (Необязательно) представление политики IAM в формате JSON, дополнительно ограничивающей разрешения принимаемой роли IAM. -
policy_arns— (Необязательно) набор имён ресурсов Amazon (ARN) политик IAM, дополнительно ограничивающих разрешения принимаемой роли IAM. -
session_name— (Необязательно) имя сеанса, используемое при принятии роли. -
tags— (Необязательно) набор тегов, связанных с сеансом принятой роли. -
transitive_tag_keys— (Необязательно) набор ключей тегов из сеанса принятой роли, передаваемых последующим сеансам.
Следующие аргументы верхнего уровня устарели:
-
assume_role_duration_seconds— (Необязательно) длительность сеанса принятия роли в секундах. Вместо этого используйтеassume_role.duration. -
assume_role_policy— (Необязательно) JSON политики IAM, описывающий дополнительные ограничения разрешений принимаемой роли IAM. Вместо этого используйтеassume_role.policy. -
assume_role_policy_arns— (Необязательно) набор имён ресурсов Amazon (ARN) политик IAM, описывающих дополнительные ограничения разрешений принимаемой роли IAM. Вместо этого используйтеassume_role.policy_arns. -
assume_role_tags— (Необязательно) набор тегов сеанса принятия роли. Вместо этого используйтеassume_role.tags. -
assume_role_transitive_tag_keys— (Необязательно) набор ключей тегов сеанса принятия роли, передаваемых последующим сеансам. Вместо этого используйтеassume_role.transitive_tag_keys. -
external_id— (Необязательно) внешний идентификатор, используемый при принятии роли. Вместо этого используйтеassume_role.external_id. -
role_arn— (Необязательно) имя ресурса Amazon (ARN) роли IAM, которую нужно принять. Вместо этого используйтеassume_role.role_arn. -
session_name— (Необязательно) имя сеанса, используемое при принятии роли. Вместо этого используйтеassume_role.session_name.
terraform {
backend "s3" {
bucket = "mybucket"
key = "my/key.tfstate"
region = "us-east-1"
assume_role = {
role_arn = "arn:aws:iam::ACCOUNT-ID:role/Opentofu"
}
}
}Настройка принятия роли с удостоверением веб-идентичности
Следующий блок конфигурации assume_role_with_web_identity является необязательным:
-
role_arn— (Обязательно) имя ресурса Amazon (ARN) роли IAM, которую нужно принять. Также можно задать с помощью переменной средыAWS_ROLE_ARN. -
duration— (Необязательно) срок действия отдельных учётных данных. Учётные данные автоматически обновляются в пределах максимального срока, заданного учётной записью AWS. Значение задаётся в формате<hours>h<minutes>m<seconds>s, при этом любую единицу измерения можно опустить. Например, полтора часа можно указать как1h30mили90m. Срок должен составлять от 15 минут (15m) до 12 часов (12h). -
policy— (Необязательно) JSON политики IAM, описывающий дополнительные ограничения разрешений принимаемой роли IAM. -
policy_arns— (Необязательно) набор имён ресурсов Amazon (ARN) политик IAM, описывающих дополнительные ограничения разрешений принимаемой роли IAM. -
session_name— (Необязательно) имя сеанса, используемое при принятии роли. Также можно задать с помощью переменной средыAWS_ROLE_SESSION_NAME. -
web_identity_token— (Необязательно) значение токена веб-идентичности от поставщика OpenID Connect (OIDC) или OAuth. Необходимо указать один из параметров:web_identity_tokenилиweb_identity_token_file. -
web_identity_token_file— (Необязательно) файл с токеном веб-идентичности от поставщика OpenID Connect (OIDC) или OAuth. Необходимо указать один из параметров:web_identity_token_fileилиweb_identity_token. Также можно задать с помощью переменной средыAWS_WEB_IDENTITY_TOKEN_FILE.
terraform {
backend "s3" {
bucket = "mybucket"
key = "my/key.tfstate"
region = "us-east-1"
assume_role_with_web_identity = {
role_arn = "arn:aws:iam::ACCOUNT-ID:role/Opentofu"
web_identity_token = "<token value>"
}
}
}Можно ограничить принимаемую роль, указав политику.
terraform {
backend "s3" {
bucket = "mybucket"
key = "my/key.tfstate"
region = "us-east-1"
assume_role_with_web_identity = {
role_arn = "arn:aws:iam::ACCOUNT-ID:role/Opentofu"
web_identity_token = "<token value>"
policy = <<-JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket"
]
}
]
}
JSON
}
}
}Хранение состояния в S3
Необходимо указать следующую конфигурацию:
-
bucket— (Обязательно) имя бакета S3. -
key— (Обязательно) путь к файлу состояния в бакете S3. При использовании рабочего пространства не по умолчанию путь к состоянию будет иметь вид/workspace_key_prefix/workspace_name/key(см. также конфигурациюworkspace_key_prefix).
Следующая конфигурация является необязательной:
-
acl— (Необязательно) предустановленный ACL, применяемый к файлу состояния. -
encrypt— (Необязательно) включить шифрование на стороне сервера файла состояния. -
endpoint— (Необязательно) Устарело. Пользовательская конечная точка AWS S3 API. Значение также можно получить из переменной средыAWS_S3_ENDPOINT. -
force_path_style— (Необязательно) включить URL-адреса S3 в стиле пути (https://<HOST>/<BUCKET>вместоhttps://<BUCKET>.<HOST>). Вместо этого используйтеuse_path_style. -
use_path_style— (Необязательно) включить URL-адреса S3 в стиле пути (https://<HOST>/<BUCKET>вместоhttps://<BUCKET>.<HOST>). -
kms_key_id— (Необязательно) имя ресурса Amazon (ARN) ключа Key Management Service (KMS), используемого для шифрования состояния. Если это значение задано, OpenTofu потребуются разрешенияkms:Encrypt,kms:Decryptиkms:GenerateDataKeyдля этого ключа KMS. -
sse_customer_key— (Необязательно) ключ для шифрования состояния с помощью шифрования на стороне сервера с ключами, предоставленными клиентом (SSE-C). Это значение ключа в кодировке base64, которое после декодирования должно иметь длину 256 бит. Значение также можно получить из переменной средыAWS_SSE_CUSTOMER_KEY. Это рекомендуется делать из-за конфиденциальности значения. Если задать его в файле OpenTofu, оно будет сохранено на диске вterraform.tfstate. -
workspace_key_prefix— (Необязательно) префикс, добавляемый к пути состояния в бакете. Применяется только при использовании рабочего пространства не по умолчанию. По умолчанию —env:.
Блокировка состояния с помощью DynamoDB
Следующая конфигурация является необязательной:
-
dynamodb_endpoint— (Необязательно) Устарело. Пользовательская конечная точка AWS DynamoDB API. Значение также можно получить из переменной средыAWS_DYNAMODB_ENDPOINT. -
dynamodb_table— (Необязательно) имя таблицы DynamoDB, используемой для блокировки состояния и проверки согласованности. Таблица должна иметь ключ раздела с именемLockIDи типомString. Если параметр не задан, блокировка состояния отключена.
Архитектура AWS с несколькими учётными записями
Распространённый архитектурный подход заключается в использовании организацией нескольких отдельных учётных записей AWS для изоляции разных команд и сред. Например, система «staging» часто развёртывается в отдельной учётной записи AWS, а не в той же учётной записи, что и соответствующая ей система «production». Это позволяет свести к минимуму риск влияния тестовой среды на производственную инфраструктуру, будь то из-за ограничения частоты запросов, неверно настроенного управления доступом или других непредусмотренных взаимодействий.
Бэкенд S3 можно использовать несколькими способами, обеспечивающими различные компромиссы между удобством, безопасностью и изоляцией в такой организации. В этом разделе описан один из подходов, призванный найти разумный баланс между этими факторами и позволяющий использовать функцию рабочих пространств OpenTofu для удобного переключения между несколькими изолированными развёртываниями одной и той же конфигурации.
Используйте этот раздел как отправную точку, но имейте в виду, что, вероятно, потребуется внести изменения с учётом уникальных стандартов и нормативных требований вашей организации. Также потребуется адаптировать этот подход к уже существующим практикам в организации, например если для управления инфраструктурой ранее использовались другие инструменты.
OpenTofu — это инструмент администрирования, который управляет вашей инфраструктурой. Поэтому в идеале инфраструктура, используемая OpenTofu, должна находиться за пределами инфраструктуры, которой он управляет. Этого можно добиться, создав отдельную административную учётную запись AWS, в которой будут находиться учётные записи пользователей-операторов, а также инфраструктура и инструменты для управления другими учётными записями. Изоляция общих административных инструментов от основных сред даёт несколько преимуществ: например, позволяет избежать случайного повреждения административной инфраструктуры при изменении целевой инфраструктуры и снижает риск того, что злоумышленник использует производственную инфраструктуру для доступа к административной инфраструктуре, обычно обладающей более широкими правами.
Настройка административной учётной записи
В административной учётной записи AWS будут находиться как минимум следующие элементы:
- Один или несколько пользователей IAM для системных администраторов, которые будут входить в систему для обслуживания инфраструктуры в других учётных записях.
- При необходимости — одна или несколько групп IAM для разделения пользователей на группы с разными уровнями доступа к другим учётным записям AWS.
- Бакет S3, в котором будут храниться файлы состояния OpenTofu для каждого рабочего пространства.
- Таблица DynamoDB, используемая для блокировки и предотвращения одновременного выполнения операций в одном рабочем пространстве.
Укажите имя бакета S3 и имя таблицы DynamoDB в конфигурации бэкенда S3 OpenTofu с помощью аргументов bucket и dynamodb_table соответственно, а также настройте подходящий параметр workspace_key_prefix для хранения состояний различных рабочих пространств, которые впоследствии будут созданы для этой конфигурации.
Настройка учётной записи среды
В этом разделе термин «учётная запись среды» обозначает одну из учётных записей, содержимым которой управляет OpenTofu. Она отличается от описанной выше административной учётной записи.
Со временем в учётных записях сред появится инфраструктура для ваших продуктов. Кроме того, в них должна находиться как минимум одна роль IAM, предоставляющая OpenTofu достаточный доступ для выполнения необходимых задач управления.
Делегирование доступа
Каждый администратор будет запускать OpenTofu, используя учётные данные своего пользователя IAM в административной учётной записи. Для предоставления этим пользователям доступа к ролям, созданным в каждой учётной записи среды, используется делегирование ролей IAM.
Подробное описание делегирования ролей приведено в документации AWS по ссылке выше. Наиболее важные сведения:
- Политика принятия роли каждой роли должна предоставлять доступ административной учётной записи AWS, создавая доверительные отношения с ней, чтобы её пользователи могли принимать эту роль.
- Пользователи или группы административной учётной записи также должны иметь политику, устанавливающую обратные отношения и позволяющую этим пользователям или группам принимать эту роль.
Поскольку административная учетная запись предназначена только для размещения инструментов управления другими учетными записями, полезно предоставить административным учетным записям ограниченный доступ лишь к конкретным операциям, необходимым для принятия роли учетной записи среды и доступа к состоянию OpenTofu. Блокируя весь остальной доступ, вы устраняете риск того, что из-за ошибки пользователя ресурсы промежуточной или рабочей среды будут по ошибке созданы в административной учетной записи.
При настройке OpenTofu используйте переменные среды или стандартный файл учетных данных ~/.aws/credentials, чтобы предоставить учетные данные IAM пользователя-администратора в административной учетной записи как бэкенду S3, так и провайдеру AWS OpenTofu.
Используйте условную конфигурацию, чтобы передавать провайдеру AWS разные значения assume_role в зависимости от выбранной рабочей области. Например:
variable "workspace_iam_roles" {
default = {
staging = "arn:aws:iam::STAGING-ACCOUNT-ID:role/OpenTofu"
production = "arn:aws:iam::PRODUCTION-ACCOUNT-ID:role/OpenTofu"
}
}
provider "aws" {
# No credentials explicitly set here because they come from either the
# environment or the global credentials file.
assume_role {
role_arn = "${var.workspace_iam_roles[terraform.workspace]}"
}
}Если роли IAM рабочих областей централизованно управляются и совместно используются множеством отдельных конфигураций OpenTofu, ARN ролей также можно получить с помощью источника данных, например terraform_remote_state, чтобы не дублировать эти значения.
Создание и выбор рабочих областей
Создав необходимые объекты и настроив бэкенд, выполните tofu init, чтобы инициализировать бэкенд и создать начальную рабочую область с именем "default". Эта рабочая область не будет использоваться, но OpenTofu создает ее автоматически для удобства пользователей, не использующих функцию рабочих областей.
Создайте рабочую область для каждого ключа, указанного выше в значении переменной workspace_iam_roles:
$ tofu workspace new staging Created and switched to workspace "staging"! ... $ tofu workspace new production Created and switched to workspace "production"! ...
Из-за настройки assume_role в конфигурации провайдера AWS любые операции управления ресурсами AWS будут выполняться с использованием настроенной роли в соответствующей учетной записи AWS среды. Операции бэкенда, такие как чтение состояния из S3 и запись в него, будут выполняться напрямую от имени самого пользователя-администратора в административной учетной записи.
$ tofu workspace select staging $ tofu apply ...
Запуск OpenTofu в Amazon EC2
Команды, активно использующие OpenTofu для управления инфраструктурой, часто запускают OpenTofu в автоматизированном режиме, чтобы обеспечить единообразную рабочую среду и ограничить доступ к различным секретам и другой конфиденциальной информации, которая обычно требуется конфигурациям OpenTofu.
Если OpenTofu запускается с помощью инструмента автоматизации на экземпляре Amazon EC2, рассмотрите возможность запуска этого экземпляра в административной учетной записи и использования профиля экземпляра вместо различных пользователей IAM с правами администратора, предложенных выше. Профилю экземпляра IAM также можно предоставить доступ для делегирования между учетными записями с помощью политики IAM, чтобы этот экземпляр получил доступ, необходимый для запуска OpenTofu.
Чтобы изолировать доступ к разным учетным записям сред, используйте отдельный экземпляр EC2 для каждой целевой учетной записи, чтобы ограничить его доступ только этой учетной записью.
Аналогичные подходы можно применять с эквивалентными возможностями других вычислительных сервисов AWS, например ECS.
Защита доступа к состоянию рабочей области
В простой реализации шаблона, описанного в предыдущих разделах, все пользователи могут читать состояния всех рабочих областей и записывать их. Во многих случаях желательно точнее ограничить доступ к объектам состояния OpenTofu в S3, чтобы, например, только доверенные администраторы могли изменять состояние рабочей среды или чтобы контролировать чтение состояния, содержащего конфиденциальную информацию.
Amazon S3 поддерживает детальный контроль доступа на основе IAM-политик для отдельных путей объектов. Полное описание механизма контроля доступа S3 выходит за рамки этого руководства, но ниже приведен пример IAM-политики, предоставляющей доступ только к одному объекту состояния в корзине S3:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::myorg-tofu-states"
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::myorg-tofu-states/myapp/production/tfstate"
}
]
}Также можно настроить детальный контроль доступа к таблице DynamoDB, используемой для блокировок. Когда OpenTofu устанавливает блокировку состояния во время tofu plan, он сохраняет полный файл состояния в виде документа и задает ключ объекта s3 в качестве ключа раздела для этого документа. После снятия блокировки состояния OpenTofu помещает в DynamoDB дайджест обновленного файла состояния. Ключ похож на ключ исходного файла состояния, но имеет суффикс -md5.
В примере ниже показана простая IAM-политика, разрешающая роли для операций с бэкендом выполнять эти операции:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect" : "Allow",
"Action" : [
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:UpdateItem"
],
"Resource" : ["arn:aws:dynamodb:*:*:table/myorg-state-lock-table"],
"Condition" : {
"ForAllValues:StringEquals" : {
"dynamodb:LeadingKeys" : [
"myorg-tofu-states/myapp/production/tfstate", // during a state lock the full state file is stored with this key
"myorg-tofu-states/myapp/production/tfstate-md5" // after the lock is released a hash of the statefile's contents are stored with this key
]
}
}
}
]
}Дополнительные сведения см. в документации AWS по детализированной блокировке в DynamoDB.
Настройка пользовательской информации User-Agent
Обратите внимание: эта функция необязательна.
По умолчанию клиент AWS, используемый провайдером AWS OpenTofu, формирует запросы с заголовками User-Agent, содержащими сведения о версиях OpenTofu и AWS Go SDK. Чтобы добавить информацию в заголовки User-Agent, можно задать переменную среды TF_APPEND_USER_AGENT; ее значение будет напрямую добавлено в HTTP-запросы. Например:
$ export TF_APPEND_USER_AGENT="JenkinsAgent/i-12345678 BuildID/1234 (Optional Extra Information)"
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/settings/backends/s3/