Terraform
要約:Linux では通常、Terraform と Yandex Cloud CLI (yc) をインストールし、初期化を実行します。その後、Terraform には 認証情報(IAM トークンまたはサービスアカウントのキー)を設定します。
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
必要な情報:
- プロファイル名(既存の
defaultを選択または新しいプロファイルを作成) - OAuth トークン(リンクを提示して取得方法を案内)
- クラウド名(選択肢が提示され、請求先のクラウドに依存)
- フォルダー名(選択肢が提示される)
- デフォルトのコンピュートゾーン(
ru-central1-a...kのリストから選択)
次に yc はプロファイルを保存します。確認:
yc config list
yc resource-manager cloud list
yc resource-manager folder list
4. Terraform の変数(Yandex プロバイダー向け)
プロバイダーは標準の環境変数を読み取ります。最低限必要なのは 識別子 と 認証方法のいずれか。
方法 A — ユーザーによる認証(yc から取得した IAM トークン):
export YC_TOKEN=$(yc iam create-token)
export YC_CLOUD_ID="<あなたのクラウドID>"
export YC_FOLDER_ID="<あなたのフォルダーID>"
IAM トークンは一時的です。長期間の運用にはサービスアカウントの方が便利です。
方法 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 の設定ディレクトリ内
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 コンソールから取得できます。
バケット
既存のバケット(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> を実際の ID に置き換えてください):
yc iam access-key create --service-account-id <SERVICE_ACCOUNT_ID>
返答には key_id と secret が含まれ、これが S3 API 用のペアです。
バケットへの権限は事前に割り当てておくのが望ましい(バケットまたはフォルダレベルのロール、例:storage.editor)。組織内での慣習により、フォルダレベルの権限で十分な場合もあります。
重要
- 既存のシークレットは再表示できません。新しいキーを作成し、必要に応じて古いキーを回収する必要があります。
- Terraform State を S3 に保存する際は、同じキーを使用し、エンドポイント
https://storage.yandexcloud.netとリージョンru-central1(またはご自身のリージョン)を指定します。
Yandex Cloud の公式ドキュメント(静的アクセスキー)および Object Storage への S3 API によるアクセス方法が参照可能です。
ローカルリポジトリ
リポジトリのフォルダに移動し、サービスアカウントのキーを使用して Terraform リポジトリを初期化します:
terraform init \
-backend-config="access_key=<key_id>" \
-backend-config="secret_key=<secret>"
これにより、クラウド上のフォルダとローカルのリポジトリが紐付けられます。
Hashicorp の制限
もし次のようなエラーが発生する場合:ruby
terraform init -backend-config=“access_key=YCA” -backend-config=“secret_key=YCN”
バックエンドの初期化…
バックエンド「s3」の設定が正常に完了しました!バックエンド構成が変更されるまでは、Terraform が自動的にこのバックエンドを使用します。
プロバイダープラグインの初期化…
- 最新バージョンの yandex-cloud/yandex を検索中…
- hashicorp/null のバージョン「~> 3.2」に一致するものを検索中…
- 最新バージョンの hashicorp/local を検索中…
- yandex-cloud/yandex v0.200.0 をインストール中…
- yandex-cloud/yandex v0.200.0 をインストールしました(自己署名、キーID E40F590B50BB8E40)
パートナーおよびコミュニティプロバイダーは開発者が署名しています。
プロバイダー署名について詳しく知りたい場合は、以下をご覧ください:
Plugin signatures | Terraform | HashiCorp Developer
╷
│ エラー: 利用可能なプロバイダー・パッケージの照合に失敗しました
│
│ 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 はそのような場合に「プロバイダーが存在しない」と表示します。
### 自分で行うべきこと
1. **Yandex Cloud のミラーリング設定** — 自宅のカタログに Terraform の設定ファイル(リポジトリからコピーした `terraform.rc.example`)を配置します:
```bash
cp ~/terraform.rc.example ~/.terraformrc
ここでは、https://terraform-mirror.yandexcloud.net/ を registry.terraform.io/*/* に指定します(Yandex Cloud ドキュメント参照:Верификация
-
再度実行:
cd ~/yc-cloud terraform init -
コードに
provider.tfでlocalプロバイダーの明示的な宣言を追加(以前はnullだけが記述されていました)し、バージョンを1か所で固定します。
直接アクセスが必要な場合は、VPN/プロキシの設定を確認し、curl -sI https://registry.terraform.io が正常に開くかを検証してください。ruby
$ terraform init -backend-config=“access_key=YCA” -backend-config=“secret_key=YCN”
バックエンドの初期化中…
プロバイダーのプラグインの初期化中…
- hashicorp/null のバージョン “~> 3.2” に一致するものを検索中…
- hashicorp/local のバージョン “~> 2.5” に一致するものを検索中…
- 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 init」実行時に Terraform が同じ選択を保証できます。
╷
│ 警告: プロバイダーのロックファイル情報が不完全です
│
│ あなたのカスタムプロバイダーインストール方法のため、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 plan / apply
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”
# 使用方法
```ruby
terraform plan -input=false -var-file=count_vars.vars -out=tfplan
╷
│ エラー: 必要な変数の値がありません
│
│ variable.tf の行 1 で:
│ 1: variable "yc_cloud" {}
│
│ ルートモジュールの入力変数 "yc_cloud" が設定されておらず、デフォルト値もありません。この変数の値を提供するには、-var または -var-file コマンドライン引数を使用してください。
╵
╷
│ エラー: 必要な変数の値がありません
│
│ variable.tf の行 3 で:
│ 3: variable "yc_folder" {}
│
│ ルートモジュールの入力変数 "yc_folder" が設定されておらず、デフォルト値もありません。この変数の値を提供するには、-var または -var-file コマンドライン引数を使用してください。
╵
╷
│ エラー: 必要な変数の値がありません
│
│ variable.tf の行 5 で:
│ 5: variable "yc_token" {}
│
│ ルートモジュールの入力変数 "yc_token" が設定されておらず、デフォルト値もありません。この変数の値を提供するには、-var または -var-file コマンドライン引数を使用してください。
terraform plan は、count_vars.vars に yc_cloud、yc_folder、yc_token の3つの必須変数が存在しないため失敗します。このファイルはサイズとイメージに関するものであり、クラウド/フォルダの認証情報やトークンは別途リポジトリで記述されています。
どう対処するか
方法 A: ローカルに terraform.tfvars を作成し、以下のような内容を記述してください(Git にはコミットしないでください):
yc_cloud = "b1g..." # クラウド ID
yc_folder = "b1g0" # ドキュメントの ya-cloud ステック用
yc_token = "t1.…" # IAM トークンまたは OAuth; コミットしないでください
実行コマンド:
terraform plan -input=false -var-file=terraform.tfvars -var-file=count_vars.vars -out=tfplan
方法 B — 環境変数経由(yc iam create-token でトークンを取得する場合に便利):
export TF_VAR_yc_cloud="$(yc config get cloud-id)" # または明示的に b1g...
export TF_VAR_yc_folder="$(yc config get folder-id)" # または b1g0
export TF_VAR_yc_token="$(yc iam create-token)"
terraform plan -input=false -var-file=count_vars.vars -out=tfplan
````export YC_TOKEN=...` は単体で `var.yc_token` に展開されません — Terraform には明示的に **`TF_VAR_yc_token`** または `-var`/`-var-file` が必要です。
**方法C — 2つのvarファイル:** たとえば `secrets.auto.tfvars` / `local.tfvars` に `yc_*` の3つを含め、`count_vars.vars` を別途 `-var-file` として指定します。
---
ターミナルで切り取られた文字列 `export YC_CLOUD_ID=\"` について — Terraform には **`yc_cloud`** が必要で、`YC_CLOUD_ID` という別々の変数は不要です。より簡単な方法として、`yc resource-manager cloud list` または `yc config get cloud-id` からクラウドIDを取得してください。
`init` 後に表示される **Incomplete lock file** の警告 — CIや他のOSで必要であれば、Terraform が推奨するように `-platform=...` を指定して `terraform providers lock` を実行してください。
**S3バックエンド:** `terraform init` または stateの読み込みには、**Object Storage への静的アクセスキー**が必要です(README/WORKFLOW §3.1参照)。`yc_token` はバックエンドで使用されません — これは別途の話で、`init` が既に完了しているということは、アクセスキーがすでに設定されているということです。