エラーの概要

Terraform の 401 エラーは、クラウドプロバイダー(AWS・Azure・GCP等)または Terraform Cloud/Enterprise への認証に失敗したときに発生します。認証情報の不足・期限切れ・形式エラーなどが原因で、リソースの操作やプランの実行が中断されます。

実際のエラーメッセージ例

Error: error configuring Terraform AWS Provider: error validating provider credentials: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included in the request is invalid
  on main.tf line 1, in provider "aws":
   1: provider "aws" {
Error: Failed to retrieve available provider versions from Terraform Registry (registry.terraform.io).
This may be caused by network connectivity issues, or an incorrect API token.
HTTP status code: 401 Unauthorized

よくある原因と解決手順

原因1:AWS アクセスキーの認証情報が不正または期限切れ

AWS のアクセスキーが間違っているか、IAMAWS Identity and Access Management)ユーザーの権限削除されている場合に発生します。特に複数の AWS アカウントを扱う環境では、設定ミスが起こりやすくなります。

Before(エラーが起きるコード):

# 期限切れまたは不正なキーを使用
export AWS_ACCESS_KEY_ID=<your-access-key-id>
export AWS_SECRET_ACCESS_KEY=<your-secret-access-key>

terraform plan

After(修正後):

# 最新の認証情報を取得・確認
aws sts get-caller-identity

# 有効なキーを再設定
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7NEWKEY
export AWS_SECRET_ACCESS_KEY=<your-secret-access-key>

# または ~/.aws/credentials ファイルで管理
cat ~/.aws/credentials

terraform plan

原因2:環境変数が設定されていない

Terraform が認証情報を探すとき、環境変数AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY など)が未設定の場合、プロバイダー認証に失敗します。特に CI/CD パイプラインやサーバーレス環境では見落としやすい原因です。

Before(エラーが起きるコード):

# main.tf
provider "aws" {
  region = "us-east-1"
}

resource "aws_s3_bucket" "example" {
  bucket = "my-bucket"
}
# 環境変数が設定されていない状態で実行
terraform plan
# Error: error configuring Terraform AWS Provider: no valid credential sources found

After(修正後):

# 環境変数を設定してから実行
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export AWS_REGION="us-east-1"

terraform plan

# または ~/.aws/credentials と ~/.aws/config で設定
# ~/.aws/credentials:
# [default]
# aws_access_key_id = your-access-key
# aws_secret_access_key = your-secret-key

# ~/.aws/config:
# [default]
# region = us-east-1

原因3:Terraform Cloud の認証トークンが無効または期限切れ

terraform login で取得した Terraform Cloud のトークンが有効期限を超えた場合や、トークン削除された場合に発生します。リモート状態を利用している環境では特に重要です。

Before(エラーが起きるコード):

# ~/.terraformrc に古いトークンが保存されている
cat ~/.terraformrc
# credentials "app.terraform.io" {
#   token = "expired-token-xxxxx"
# }

terraform init
# Error: Failed to retrieve available provider versions from Terraform Registry
# HTTP status code: 401 Unauthorized

After(修正後):

# 新しいトークンで再認証
terraform login

# 対話的にトークンを入力(Terraform Cloud Web UI で生成したトークン)
# Generated a CLI configuration token. But it isn't stored by this command.
# ...
# Token saved to ~/.terraformrc

# トークンが正しく設定されたか確認
cat ~/.terraformrc

terraform init
# Success! The configuration has been successfully validated.

原因4:プロバイダーブロックの認証情報が直接記述されている場合のキー値エラー

プロバイダーブロック内に直接認証情報を記述している場合、キー名やフォーマットのタイプミスが 401 エラーを引き起こします。

Before(エラーが起きるコード):

# main.tf
provider "aws" {
  region            = "us-east-1"
  access_key        = "<your-access-key-id>"  # キー名が誤っている
  secrect_access_key = "<your-secret-access-key>"  # タイプミス
}

After(修正後):

# main.tf
provider "aws" {
  region            = "us-east-1"
  access_key        = var.aws_access_key
  secret_access_key = var.aws_secret_access_key
}

# variables.tf
variable "aws_access_key" {
  type      = string
  sensitive = true
}

variable "aws_secret_access_key" {
  type      = string
  sensitive = true
}

# または環境変数を優先(推奨)
provider "aws" {
  region = "us-east-1"
  # AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 環境変数を自動読込
}

ツール固有の注意点

複数プロバイダーを利用する場合

Terraform で AWS・Azure・GCP など複数のクラウドプロバイダーを組み合わせる場合、各プロバイダーの認証情報をそれぞれ設定する必要があります。一つのプロバイダーの認証が失敗すると、全体の terraform plan がブロックされます。

provider "aws" {
  region = "us-east-1"
  # AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY を読込
}

provider "azurerm" {
  features {}
  # ARM_CLIENT_ID, ARM_CLIENT_SECRET, ARM_SUBSCRIPTION_ID を読込
}

provider "google" {
  project = "<your-gcp-project>"
  region  = "us-central1"
  # GOOGLE_APPLICATION_CREDENTIALS を読込
}

各プロバイダーの認証状態は個別に検証しましょう。

# AWS の認証確認
aws sts get-caller-identity

# Azure の認証確認
az account show

# GCP の認証確認
gcloud auth list

Terraform Cloud / Enterprise でのリモート状態管理

terraform login で正常に認証できても、後で組織の API トークンポリシーが変更される場合があります。Terraform Cloud の Web UI で自分のトークン有効期限を確認し、期限が近い場合は新規トークンを生成してください。

# トークン情報の確認(Terraform Cloud Web UI: https://app.terraform.io/app/settings/tokens)
# 期限切れトークンは削除し、新しいトークンを生成する

terraform login  # 新しいトークンで再設定

CI/CD パイプライン(GitHub Actions・GitLab CI 等)での環境変数設定

パイプラインで Terraform を実行する場合、シークレット環境変数として認証情報を登録する必要があります。例えば GitHub Actions では以下のように設定します。

# .github/workflows/terraform.yml
name: Terraform

on: push

jobs:
  terraform:
    runs-on: ubuntu-latest
    env:
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      TF_TOKEN_APP_TERRAFORM_IO: ${{ secrets.TF_TOKEN_APP_TERRAFORM_IO }}
    steps:
      - uses: actions/checkout@v3
      - uses: hashicorp/setup-terraform@v2
      - run: terraform init
      - run: terraform plan

それでも解決しない場合

ログレベルを上げてデバッグ情報を取得

Terraform のログレベルを DEBUG に設定すると、認証フローの詳細が表示されます。

export TF_LOG=DEBUG
terraform plan > terraform_debug.log 2>&1

# ログから "401" や "Unauthorized" のキーワードで検索
grep -i "401\|unauthorized" terraform_debug.log

認証情報キャッシュをクリア

古いキャッシュが残っている場合、以下のコマンドで Terraform のプラグインキャッシュを削除してください。

# Terraform プラグインキャッシュをクリア
rm -rf ~/.terraform.d/plugin-cache

# または .terraform ディレクトリをリセット
rm -rf .terraform .terraform.lock.hcl

# 再初期化
terraform init

プロバイダーと API 仕様の確認

使用するプロバイダーのバージョンが古い場合、API 仕様変更により認証方式が変わっている可能性があります。最新バージョンへのアップグレードを試してください。

# プロバイダーのバージョン確認
terraform version

# .terraform.lock.hcl でプロバイダーバージョンを確認し、手動でアップグレード
terraform init -upgrade

公式ドキュメントでの確認

各プロバイダーの公式認証ドキュメントを参照してください:


免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。