跳至主要内容

后端类型: s3

将状态存储为给定 Amazon S3 上给定存储桶中的给定密钥。此后端还支持通过 Dynamo DB 进行状态锁定和一致性检查,可以通过将 dynamodb_table 字段设置为现有的 DynamoDB 表名称来启用。单个 DynamoDB 表可用于锁定多个远程状态文件。OpenTofu 生成的密钥名称包含 bucketkey 变量的值。

示例配置

代码块
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:ListBucketarn:aws:s3:::mybucket
  • s3:GetObjectarn:aws:s3:::mybucket/path/to/my/key
  • s3:PutObjectarn:aws:s3:::mybucket/path/to/my/key
  • s3:DeleteObjectarn: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"
}
]
}

DynamoDB 表权限

如果您使用状态锁定,OpenTofu 将需要对 DynamoDB 表 (arn:aws:dynamodb:::table/mytable) 具有以下 AWS IAM 权限

  • 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 状态锁定)是可选的。

凭据和共享配置

需要以下配置

  • region - (必需) S3 存储桶和 DynamoDB 表 (如果使用) 的 AWS 区域。这也可以从 AWS_DEFAULT_REGIONAWS_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 - (可选)**已弃用** AWS Identity and Access Management (IAM) API 的自定义端点。也可以从 AWS_IAM_ENDPOINT 环境变量中获取。
  • max_retries - (可选)AWS API 请求在可重试失败时重试的最大次数。默认值为 5。
  • retry_mode - (可选)指定重试的尝试方式。有效值为 standardadaptive。也可以从 AWS_RETRY_MODE 环境变量中获取。
  • profile - (可选)AWS 共享凭据文件(例如 ~/.aws/credentials)或 AWS 共享配置文件(例如 ~/.aws/config)中要用于凭据和/或配置的 AWS 配置文件名称。也可以从 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 对象时,在输入中不包含校验和。这对不支持校验和验证的非 AWS S3 API 有用。
  • skip_credentials_validation - (可选)跳过通过 STS API 进行的凭据验证。
  • skip_region_validation - (可选)跳过对提供的区域名称的验证。
  • skip_metadata_api_check - (可选)跳过使用 EC2 元数据 API。
  • skip_requesting_account_id - (可选)跳过请求账户 ID。这对没有 IAM、STS API 或元数据 API 的 AWS API 实现有用。
  • sts_endpoint - (可选)**已弃用** AWS Security Token Service (STS) API 的自定义端点。也可以从 AWS_STS_ENDPOINT 环境变量中获取。
  • sts_region - (可选)STS 的 AWS 区域。如果未设置,AWS 将对 STS 使用与其他非 STS 操作相同的区域。
  • token - (可选)多因素身份验证 (MFA) 令牌。也可以从 AWS_SESSION_TOKEN 环境变量中获取。
  • allowed_account_ids(可选):允许的 AWS 账户 ID 列表,用于防止意外破坏实时环境。此选项与 forbidden_account_ids 冲突。
  • forbidden_account_ids(可选):禁止的 AWS 账户 ID 列表,用于防止意外破坏实时环境。此选项与 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 - 与元数据服务通信时要使用的模式。有效值为 IPv4IPv6。也可以从 AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE 环境变量中获取。
  • http_proxy - (可选)访问 AWS API 时要使用的 HTTP 代理的地址。也可以从 HTTP_PROXY 环境变量中获取。
  • https_proxy - (可选)访问 AWS API 时要使用的 HTTPS 代理的地址。也可以从 HTTPS_PROXY 环境变量中获取。
  • no_proxy - (可选)以逗号分隔的值,指定访问 AWS API 时应从代理中排除的主机。也可以从 NO_PROXY 环境变量中获取。更多详细信息,请参见 此处
  • insecure - (可选)显式允许后端执行“不安全”的 SSL 请求;默认值为 false
  • use_dualstack_endpoint - (可选)解析具有 DualStack 功能的端点。
  • use_fips_endpoint - (可选)解析具有 FIPS 功能的端点。

自定义 AWS API 端点

可选的 endpoints 参数包含以下选项

  • s3 - (可选)使用此选项设置 AWS S3 API 的自定义端点 URL。也可以从 AWS_ENDPOINT_URL_S3 环境变量或已弃用的环境变量 AWS_S3_ENDPOINT 中获取。
  • iam - (可选)使用此选项设置 AWS IAM API 的自定义端点 URL。也可以从 AWS_ENDPOINT_URL_IAM 环境变量或已弃用的环境变量 AWS_IAM_ENDPOINT 中获取。
  • sts - (可选)使用此选项设置 AWS STS API 的自定义端点 URL。也可以从 AWS_ENDPOINT_URL_STS 环境变量或已弃用的环境变量 AWS_STS_ENDPOINT 中获取。
  • dynamodb - (可选)使用此选项设置 AWS DynamoDB API 的自定义端点 URL。也可以从 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 - (必填)要假设的 IAM 角色的 Amazon 资源名称 (ARN)。
  • duration - (可选)指定单个凭据的有效期。这些凭据会自动续期,续期期限由 AWS 账户定义。持续时间应以 <hours>h<minutes>m<seconds>s 的格式指定,每个单位都是可选的。例如,一个半小时可以表示为 1h30m90m。持续时间必须在 15 分钟 (15m) 到 12 小时 (12h) 的范围内。
  • external_id - (可选)假设角色时要使用的外部标识符。
  • policy - (可选)IAM 策略的 JSON 表示形式,用于进一步限制要假设的 IAM 角色的权限。
  • policy_arns - (可选)要假设的 IAM 角色的 IAM 策略的 Amazon 资源名称 (ARN) 集,用于进一步限制权限。
  • session_name - (可选)假设角色时要使用的会话名称。
  • tags - (可选)要与假设的角色会话关联的标记映射。
  • transitive_tag_keys - (可选)要传递到任何后续会话的假设角色会话的标记键集。

以下顶级参数已弃用

  • assume_role_duration_seconds - (可选)限制假设角色会话持续时间的秒数。请使用 assume_role.duration 代替。
  • assume_role_policy - (可选)IAM 策略 JSON,用于描述进一步限制要假设的 IAM 角色的权限。请使用 assume_role.policy 代替。
  • assume_role_policy_arns - (可选)IAM 策略的 Amazon 资源名称 (ARN) 集,用于描述进一步限制要假设的 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 - (可选)要假设的 IAM 角色的 Amazon 资源名称 (ARN)。请使用 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"
}
}
}

使用 Web 身份配置假设角色

以下 assume_role_with_web_identity 配置块是可选的

  • role_arn - (必填)要假设的 IAM 角色的 Amazon 资源名称 (ARN)。也可以使用 AWS_ROLE_ARN 环境变量进行设置。
  • duration - (可选)单个凭据的有效期。凭据会自动续期,直到 AWS 账户定义的最大期限。以 <hours>h<minutes>m<seconds>s 的格式指定,任何单位都是可选的。例如,一个半小时可以指定为 1h30m90m。必须在 15 分钟 (15m) 到 12 小时 (12h) 之间。
  • policy - (可选)IAM 策略 JSON,用于描述进一步限制要假设的 IAM 角色的权限。
  • policy_arns - (可选)IAM 策略的 Amazon 资源名称 (ARN) 集,用于描述进一步限制要假设的 IAM 角色的权限。
  • session_name - (可选)假设角色时要使用的会话名称。也可以使用 AWS_ROLE_SESSION_NAME 环境变量进行设置。
  • web_identity_token - (可选)来自 OpenID Connect (OIDC) 或 OAuth 提供者的 Web 身份令牌的值。web_identity_tokenweb_identity_token_file 之一必填。
  • web_identity_token_file - (可选)包含来自 OpenID Connect (OIDC) 或 OAuth 提供者的 Web 身份令牌的文件。web_identity_token_fileweb_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 - (可选) 已弃用 启用路径样式 S3 URL(https://<HOST>/<BUCKET> 而不是 https://<BUCKET>.<HOST>)。 使用 use_path_style 代替。
  • use_path_style - (可选) 启用路径样式 S3 URL(https://<HOST>/<BUCKET> 而不是 https://<BUCKET>.<HOST>)。
  • kms_key_id - (可选) 用于加密状态的密钥管理服务 (KMS) 密钥的 Amazon 资源名称 (ARN)。 请注意,如果指定此值,OpenTofu 将需要对该 KMS 密钥拥有 kms:Encryptkms:Decryptkms:GenerateDataKey 权限。
  • 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 帐户来隔离不同的团队和环境。 例如,“暂存”系统通常会部署到与相应的“生产”系统不同的 AWS 帐户中,以最大限度地降低暂存环境影响生产基础设施的风险,无论是通过速率限制、配置错误的访问控制还是其他意外交互。

S3 后端可以在多种不同的方式中使用,这些方式在便利性、安全性以及隔离方面做出不同的权衡。 本节描述了一种旨在在这几种权衡之间找到良好折衷方案的方法,允许使用 OpenTofu 的工作区功能 在相同配置的多个隔离部署之间方便地切换。

将本节用作您方法的起点,但请注意,您可能需要根据适用于您组织的独特标准和法规进行调整。 您还需要对这种方法进行一些调整,以考虑您组织中现有的实践,例如,如果以前使用过其他工具来管理基础设施。

OpenTofu 是一种管理工具,用于管理您的基础设施,因此理想情况下,OpenTofu 使用的基础设施应该存在于 OpenTofu 管理的基础设施之外。 这可以通过创建一个单独的管理 AWS 帐户来实现,该帐户包含人类操作员使用的用户帐户以及用于管理其他帐户的任何基础设施和工具。 将共享的管理工具与您的主要环境隔离有许多优势,例如避免在更改目标基础设施时意外损坏管理基础设施,以及降低攻击者可能滥用生产基础设施以访问(通常具有更高权限)的管理基础设施的风险。

管理帐户设置

您的管理 AWS 帐户将至少包含以下项目

  • 一个或多个用于系统管理员的 IAM 用户,这些管理员将登录以维护其他帐户中的基础设施。
  • 可选地,一个或多个 IAM 组 用于区分具有不同级别的其他 AWS 帐户访问权限的不同用户组。
  • 一个将包含每个工作区 OpenTofu 状态文件的 S3 桶
  • 一个将用于锁定的 DynamoDB 表,以防止对单个工作区执行并发操作。

分别使用 bucketdynamodb_table 参数在 S3 后端配置中为 OpenTofu 提供 S3 桶名称和 DynamoDB 表名称,并配置适当的 workspace_key_prefix 来包含随后将为此配置创建的各种工作区的状态。

环境帐户设置

为了本节的方便,术语“环境帐户”指的是内容由 OpenTofu 管理的帐户之一,与上面描述的管理帐户分开。

您的环境帐户最终将包含您自己的产品特定基础设施。 除了这个之外,它还必须包含一个或多个 IAM 角色,这些角色授予 OpenTofu 执行所需管理任务的足够权限。

委派访问权限

每个管理员将使用其在管理帐户中的 IAM 用户的凭据运行 OpenTofu。 IAM 角色委派 用于授予这些用户访问每个环境帐户中创建的角色的权限。

上面链接的 AWS 文档中涵盖了角色委派的全部细节。 最重要的细节是

  • 每个角色的假设角色策略必须授予管理 AWS 帐户的访问权限,从而与管理 AWS 帐户建立信任关系,以便其用户可以假设该角色。
  • 管理帐户中的用户或组也必须具有创建相反关系的策略,允许这些用户或组假设该角色。

由于管理帐户的目的是仅托管用于管理其他帐户的工具,因此将管理帐户的访问权限限制为仅假设环境帐户角色和访问 OpenTofu 状态所需的特定操作很有用。 通过阻止所有其他访问,您可以消除用户错误导致错误地在管理帐户中创建暂存或生产资源的风险。

在配置 OpenTofu 时,请使用环境变量或标准凭据文件 ~/.aws/credentials 在管理帐户中为 S3 后端 OpenTofu 的 AWS 提供程序提供管理员用户的 IAM 凭据。

使用条件配置将不同的 assume_role 值传递给 AWS 提供程序,具体取决于所选工作区。 例如

代码块
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 配置之间共享,则还可以通过数据源(例如 terraform_remote_state)获取角色 ARN,以避免重复这些值。

创建和选择工作区

创建必要的对象并配置好后端后,运行 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"!

...

由于 AWS 提供程序配置中的 assume_role 设置,任何对 AWS 资源的管理操作都将通过相应环境 AWS 帐户中配置的角色执行。 后端操作(例如从 S3 读取和写入状态)将直接以管理员自己的用户身份在管理帐户中执行。

代码块
$ tofu workspace select staging
$ tofu apply
...

在 Amazon EC2 中运行 OpenTofu

广泛使用 OpenTofu 进行基础设施管理的团队通常会在自动化中运行 OpenTofu,以确保一致的操作环境并限制对 OpenTofu 配置通常需要的各种秘密和其他敏感信息的访问。

在 Amazon EC2 实例上运行的自动化工具中运行 OpenTofu 时,请考虑在管理帐户中运行此实例,并使用 实例配置文件 代替上面建议的各种管理员 IAM 用户。 IAM 实例配置文件也可以通过 IAM 策略授予跨帐户委派访问权限,从而为该实例提供运行 OpenTofu 所需的访问权限。

为了隔离对不同环境帐户的访问,请为每个目标帐户使用单独的 EC2 实例,以便其访问权限可以仅限于单个帐户。

可以使用其他 AWS 计算服务(如 ECS)中的等效功能采取类似的方法。

保护对工作区状态的访问

在对前几节描述的模式进行简单实现时,所有用户都可以访问所有工作空间的读写状态。在许多情况下,需要对 S3 中的 OpenTofu 状态对象应用更精确的访问约束,例如,只允许受信任的管理员修改生产状态,或者控制包含敏感信息的读取状态。

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 期间锁定状态时,它将完整的 state 文件作为文档存储,并将 s3 对象键设置为文档的分区键。在释放状态锁后,OpenTofu 将更新后的 state 文件的摘要置于 DynamoDB 中。该键类似于原始 state 文件的键,但以 -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 信息

请注意,此功能是可选的。

默认情况下,OpenTofu AWS 提供程序使用的底层 AWS 客户端使用包含有关 OpenTofu 和 AWS Go SDK 版本的信息在 User-Agent 标头中创建请求。若要在 User-Agent 标头中提供其他信息,可以设置 TF_APPEND_USER_AGENT 环境变量,其值将直接添加到 HTTP 请求中,例如:

代码块
$ export TF_APPEND_USER_AGENT="JenkinsAgent/i-12345678 BuildID/1234 (Optional Extra Information)"