Spec-Zone.ru › OpenTofu 1.9

Тип бэкенда: 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:DescribeTable
  • dynamodb:GetItem
  • dynamodb:PutItem
  • dynamodb: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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API