1. はじめに
terraform initでエラーを直してもterraform planでエラーが発生し、更に直してもterraform applyでエラーが発生する…ということが何度もあり、「全部terraform initの時点で教えてくれればいいのに!」と思ったため調べました。
目的:コマンドごとにエラーの発生原因を大まかに絞り込むことができるようになりたい。
対象: Terraformを少し触ったことのある初心者の方向けです。
注意
初心者調べのため、間違いなどありましたらご指摘をお願いいたします![]()
2. Terraform コマンドの概要
そもそもinit/plan/applyがどんなコマンドなのかを簡単に説明すると、
terraform init: Terraformを使える状態にするための準備をする
terraform plan: 設定ファイルを読み込み、差分を検出する
terraform apply: リソースを作成・更新する
といった役割を持つ、Terraformを使用する上での最重要コマンドです。
詳しい役割は以下の記事を見るとよくわかります。
3. 各コマンドで発生するエラーの種類
各コマンドで発生する主なエラーの原因と、その実際のエラーメッセージをいくつか挙げます。
terraform init で発生する主なエラー
プロバイダー関連のエラー
プロバイダーが見つからない場合、バージョンが指定されていない場合
#ネットワーク設定が原因でプロバイダーが見つからない
| Error: Failed to query available provider packages
|
| Could not retrieve the list of available versions for provider hashicorp/aws: could not connect to registry.terraform.io: failed to
| request discovery document: Get "https://registry.terraform.io/.well-known/terraform.json": context deadline exceeded
|
| To see which modules are currently depending on hashicorp/aws and what versions are specified, run the following command:
| terraform providers
依存関係のロックファイルの不一致
.terraform.lock.hcl の依存関係が現在の構成と一致しない場合
#.terraform.lock.hclとproviders.tfのバージョン情報の不一致
| Error: Failed to query available provider packages
|
| Could not retrieve the list of available versions for provider hashicorp/aws: locked provider
| registry.terraform.io/hashicorp/aws 6.4.0 does not match configured version constraint ~> 5.0; must use
| terraform init -upgrade to allow selection of new versions
プロバイダーやモジュールのダウンロード失敗
プロバイダーやモジュールがダウンロードできない場合(ネットワークの問題やプロバイダーが利用できない)
#無効なモジュールのパスを指定
| Error: Unreadable module directory
|
| Unable to evaluate directory symlink: lstat modules: no such file or
| directory
terraform plan で発生する主なエラー
構成ファイルの不整合
構成ファイルのリソース定義に誤りがある場合(無効なリソースタイプ、未定義の属性など)
#無効なリソース名の使用(aws_s"a"bnet)
| Error: Invalid resource type
|
| on vpc/main.tf line 11, in resource "aws_sabnet" "public":
| 11: resource "aws_sabnet" "public" {
|
| The provider hashicorp/aws does not support resource type "aws_sabnet". Did you mean "aws_subnet"?
不足している変数や引数:
必要な変数や引数が指定されていない場合
#サブネットの作成に必須の"vpc_id"が指定されていない
| Error: Missing required argument
|
| on vpc/main.tf line 11, in resource "aws_subnet" "public":
| 11: resource "aws_subnet" "public" {
|
| The argument "vpc_id" is required, but no definition was found.
依存関係エラー
リソース間の依存関係が正しく設定されていない場合(重複した変数、依存関係の循環など)
#同モジュール内で同名の変数("cidr_block")が使用されている
| Error: Duplicate variable declaration
|
| on vpc/variables.tf line 12:
| 12: variable "cidr_block" {
|
| A variable named "cidr_block" was already declared at vpc/variables.tf:6,1-22. Variable names must be unique
| within a module.
terraform apply で発生する主なエラー
リソース作成失敗
リソースを作成できない場合(リソース作成数制限、既存リソースとの競合など)
#既存のリソース(CIDRブロック)が競合している
| Error: creating EC2 VPC: operation error EC2: CreateVpc,
| with aws_vpc.this,
| on main.tf line 30, in resource "aws_vpc" "this":
| 30: resource "aws_vpc" "this" {
アクセス権限の問題
IAMの権限不足によりリソースの作成や変更ができない場合
#作成権限のないユーザーで実行
| Error: creating EC2 VPC: operation error EC2: CreateVpc,
| with module.vpc.aws_vpc.this,
| on vpc/main.tf line 1, in resource "aws_vpc" "this":
| 1: resource "aws_vpc" "this" {
4. まとめ
各コマンドのエラーについて、以下のようなイメージを持つとわかりやすいかと思います。
-
terraform initのエラー: povider.tfの設定不備が原因の場合が多い -
terraform planのエラー: 各設定ファイルの変数定義や参照が原因の場合が多い -
terraform applyのエラー:作成時の権限や既存リソースとの競合が原因の場合が多い
コマンドによってエラーが発生する原因や見直すべき設定ファイルが異なるため、エラーメッセージとどのコマンドを実行したかに注目してエラーの解決にあたるようにすると、少し楽になるかもしれません。