Terraform
简而言之:在 Linux 系统上通常会安装 Terraform 和 Yandex Cloud CLI (yc),然后执行 初始化,接着为 Terraform 设置 凭证(IAM Token 或服务账户密钥)。
1. Terraform
通过官方二进制文件(通用方法):
# 示例适用于 amd64 架构;如需其他版本或架构,请替换
TERRAFORM_VERSION=1.9.8
wget "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip"
unzip "terraform_${TERRAFORM_VERSION}_linux_amd64.zip"
sudo mv terraform /usr/local/bin/
terraform version
或通过包管理器安装(适用于 Ubuntu/Debian 系统,且已配置 HashiCorp 仓库——如您发行版文档中所述)。
2. Yandex Cloud CLI (yc)
curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
exec -l $SHELL # 或者打开一个新的终端
yc version
3. 配置云环境与访问权限
交互式操作(初次使用推荐):
yc init
需要提供:
- profile name(选择默认或创建新配置)
- OAuth token(会提示获取方式)
- cloud name(会建议选择,影响计费,决定账单归属哪个云)
- folder name(会建议选择)
- default compute zone(会建议从
ru-central1-a...k中选择)
之后 yc 会保存配置;验证如下:
yc config list
yc resource-manager cloud list
yc resource-manager folder list
4. Terraform 变量(Yandex 云提供商)
提供商读取标准环境变量。最少需要 标识符 和 一种认证方式。
方案 A —— 使用用户凭证(从 yc 获取 IAM Token):
export YC_TOKEN=$(yc iam create-token)
export YC_CLOUD_ID="<您的 cloud-id>"
export YC_FOLDER_ID="<您的 folder-id>"
IAM Token 有效期较短;如需长期运行,推荐使用服务账户。
方案 B —— 使用服务账户(JSON 密钥文件):
export YC_SERVICE_ACCOUNT_KEY_FILE="/absolute/path/to/key.json"
export YC_CLOUD_ID="<cloud-id>"
```export YC_FOLDER_ID=""<folder-id>
(在云服务提供商中,用于文件密钥的变量名即为此名称,请参阅 Yandex 服务商文档。)
## 5. 在 Terraform 配置目录中
```bash
cd /path/to/your/terraform/project
terraform init
terraform plan
实用提示:
YC_TOKEN=$(yc iam create-token)需要定期更新。- 对于 CI 环境或“持续运行”的场景,通常会创建一个具有所需权限(针对目录或云区域)的 服务账号,并为其配置 静态密钥(JSON 格式)。
cloud_id和folder_id可以从yc resource-manager cloud list/folder list命令输出中获取,或直接从 Yandex Cloud 控制台获取。
存储桶(Bucket)
如何获取现有存储桶(https://console.yandex.cloud/folders/b1g/storage/buckets/bucket)的 access_key 和 secret_key?
在 Yandex Object Storage 中,存储桶本身没有独立的 access_key / secret_key。这些密钥是由 服务账号(或您已为其创建的密钥)颁发的。存储桶通过 IAM 权限 与服务账号绑定,从而获得访问权限。
通过控制台操作
- 进入目录
b1g→ Object Storage → 存储桶bucket。 - 确保已存在一个需要访问该存储桶的服务账号(如无,可创建一个)。
- 在存储桶页面:访问权限 → 为该服务账号分配角色(如
storage.editor,或您已配置的 Object Storage 访问角色)。 - 进入 服务账号 → 目标账号 → 静态访问密钥(或“访问密钥”)标签页 → 创建新密钥。
- 保存 密钥 ID 和 密钥密文 —— 密钥密文仅显示一次。
密钥 ID = S3 客户端中通常称为 access_key / AWS_ACCESS_KEY_ID,密钥密文 = secret_key / AWS_SECRET_ACCESS_KEY。
通过 CLI (yc) 操作
列出目录中的服务账号:
yc iam service-account list --folder-id b1g
为指定服务账号创建静态密钥(请替换 <SERVICE_ACCOUNT_ID>):
yc iam access-key create --service-account-id <SERVICE_ACCOUNT_ID>
响应中将包含 key_id 和 secret —— 这就是 S3 API 所需的密钥对。
建议提前为存储桶分配权限(如授予 storage.editor 角色到存储桶资源或目录),例如通过控制台或 IAM API;在多数组织中,授予目录级别的权限通常已足够。
重要提示
- 已存在的密钥密文无法再次查看 —— 只能创建新密钥,必要时撤销旧密钥。
- 使用 Terraform 管理 S3 状态时,需使用相同密钥 + endpoint
https://storage.yandexcloud.net和区域ru-central1(或您所在区域)。
Yandex Cloud 官方文档中对 静态访问密钥 与通过 S3 API 访问 Object Storage 的逻辑有详细说明。
本地仓库
进入本地仓库目录,使用服务账号密钥初始化 Terraform 仓库:
terraform init \
-backend-config="access_key=<key_id>" \
-backend-config="secret_key=<secret>"
这样即可将云端目录与本地仓库绑定。
Hashicorp 限制
如果您遇到以下错误:
正在初始化后端...
后端 "s3" 配置成功!除非后端配置发生更改,Terraform 将自动使用此后端。
正在初始化提供者插件...
- 查找 yandex-cloud/yandex 的最新版本...
- 查找符合 "~> 3.2" 的 hashicorp/null 版本...
- 查找 hashicorp/local 的最新版本...
- 安装 yandex-cloud/yandex v0.200.0...
- 已安装 yandex-cloud/yandex v0.200.0(自签名,密钥 ID E40F590B50BB8E40)
合作伙伴和社区提供者由其开发者签名。
如需了解更多关于提供者签名的信息,可阅读此处:
https://www.terraform.io/docs/cli/plugins/signing.html
╷
│ 错误:无法查询可用的提供者包
│
│ 无法获取提供者 hashicorp/null 的可用版本列表:提供者注册表 registry.terraform.io 中不存在名为 registry.terraform.io/hashicorp/null 的提供者
│
│ 所有模块都应指定其 required_providers,以便外部使用者在使用模块时能获取正确的提供者。要查看当前哪些模块依赖于 hashicorp/null,请运行以下命令:
│ terraform providers
╵
╷
│ 错误:无法查询可用的提供者包
│
│ 无法获取提供者 hashicorp/local 的可用版本列表:提供者注册表 registry.terraform.io 中不存在名为 registry.terraform.io/hashicorp/local 的提供者
│
│ 所有模块都应指定其 required_providers,以便外部使用者在使用模块时能获取正确的提供者。要查看当前哪些模块依赖于 hashicorp/local,请运行以下命令:
│ terraform providers
请执行以下步骤。
发生了什么
yandex-cloud/yandex 已成功拉取,但 hashicorp/null 和 hashicorp/local 未成功拉取。这种情况通常发生在 registry.terraform.io 不可用(网络、DNS、策略)或响应异常时:Terraform 会提示“提供者不存在”。
请自行操作
-
Yandex Cloud 镜像 — 将 Terraform 配置文件复制到家目录(从仓库复制
terraform.rc.example):cp ~/terraform.rc.example ~/.terraformrc在配置文件中,将
registry.terraform.io/*/*设置为https://terraform-mirror.yandexcloud.net/,如 Yandex Cloud 文档 所示。 -
重新执行:
cd ~/yc-cloud terraform init -
在代码中,已在
provider.tf中显式声明local提供者(之前仅声明了null),以便版本统一固定。
若需直接访问而不使用镜像,请检查 VPN/代理,确认 curl -sI https://registry.terraform.io 能正常访问。```
$ terraform init -backend-config=“access_key=YCA” -backend-config=“secret_key=YCN”
正在初始化后端…
正在初始化提供者插件…
- 查找符合 “~> 3.2” 的 hashicorp/null 版本…
- 查找符合 “~> 2.5” 的 hashicorp/local 版本…
- 查找 yandex-cloud/yandex 的最新版本…
- 安装 yandex-cloud/yandex v0.200.0…
- 已安装 yandex-cloud/yandex v0.200.0(未认证)
- 安装 hashicorp/null v3.2.4…
- 已安装 hashicorp/null v3.2.4(未认证)
- 安装 hashicorp/local v2.8.0…
- 已安装 hashicorp/local v2.8.0(未认证)
Terraform 已创建锁文件 .terraform.lock.hcl,用于记录上述选择的提供者。请将此文件纳入您的版本控制系统,以便 Terraform 在您将来运行 “terraform init” 时能够保证默认使用相同的选择。
╷
│ 警告:提供者的锁文件信息不完整
│
│ 由于您使用了自定义的提供者安装方式,Terraform 被迫为以下提供者本地计算锁文件校验和:
│ - hashicorp/local
│ - hashicorp/null
│ - yandex-cloud/yandex
│
│ 当前的 .terraform.lock.hcl 文件仅包含 linux_amd64 平台的校验和,因此在其他平台上运行 Terraform 将无法安装这些提供者。
│
│ 为其他平台计算额外的校验和,请运行:
│ terraform providers lock -platform=linux_amd64
│ (其中 linux_amd64 是要生成的平台)
╵
Terraform 已成功初始化!
您现在可以开始使用 Terraform。尝试运行 “terraform plan” 以查看基础设施所需的任何更改。所有 Terraform 命令现在都应正常工作。
如果您以后设置了或更改了 Terraform 的模块或后端配置,请重新运行此命令以重新初始化您的工作目录。如果您忘记执行此操作,其他命令将检测到并提醒您必要时重新执行。
Terraform 计划 / 应用
terraform plan -input=false -var-file=count_vars.vars -out=tfplan
terraform apply -auto-approve tfplan
terraform destroy -auto-approve -var-file="count_vars.vars"