0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Terraform】init/plan/applyコマンドで発生するエラーの違い

Posted at

1. はじめに

terraform initでエラーを直してもterraform planでエラーが発生し、更に直してもterraform applyでエラーが発生する…ということが何度もあり、「全部terraform initの時点で教えてくれればいいのに!」と思ったため調べました。

目的:コマンドごとにエラーの発生原因を大まかに絞り込むことができるようになりたい。
対象: Terraformを少し触ったことのある初心者の方向けです。

注意
初心者調べのため、間違いなどありましたらご指摘をお願いいたします:hatching_chick:

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 のエラー:作成時の権限や既存リソースとの競合が原因の場合が多い

コマンドによってエラーが発生する原因や見直すべき設定ファイルが異なるため、エラーメッセージとどのコマンドを実行したかに注目してエラーの解決にあたるようにすると、少し楽になるかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?