プロバイダーの設定
プロバイダーの設定
Terraformでインフラストラクチャを管理するには、プロバイダーの設定が必要です。プロバイダーは、Terraformが特定のクラウドサービスやAPIと通信するためのプラグインです。
プロバイダーとは
プロバイダーは、Terraformとクラウドプラットフォームやサービスの間のインターフェースとして機能します。各プロバイダーは、そのプラットフォーム固有のリソースやデータソースを提供します。
主要なプロバイダー:
- AWS (Amazon Web Services)
- Azure (Microsoft Azure)
- Google Cloud Platform (GCP)
- Kubernetes
- その他1000以上のプロバイダー
プロバイダーの基本設定
Terraformブロック
プロバイダーを使用する前に、terraformブロックで必要なプロバイダーを宣言します。
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
設定項目の説明:
required_version: 使用するTerraformのバージョンrequired_providers: 必要なプロバイダーとそのバージョンsource: プロバイダーのソース(通常はhashicorp/プロバイダー名)version: プロバイダーのバージョン制約
バージョン制約の指定方法
# 特定のバージョン
version = "5.0.0"
# バージョン範囲
version = ">= 5.0.0, < 6.0.0"
# ペシミスティックバージョン制約(推奨)
version = "~> 5.0" # 5.0.x の最新版を使用
AWS プロバイダーの設定
基本設定
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
認証方法
1. 環境変数を使用(推奨)
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export AWS_DEFAULT_REGION="ap-northeast-1"
2. 共有認証情報ファイルを使用
provider "aws" {
region = "ap-northeast-1"
shared_credentials_files = ["~/.aws/credentials"]
profile = "default"
}
3. IAMロールを使用(EC2インスタンス上で実行する場合)
provider "aws" {
region = "ap-northeast-1"
# IAMロールが自動的に使用されます
}
複数リージョンの設定
# デフォルトのプロバイダー
provider "aws" {
region = "ap-northeast-1"
}
# 別リージョン用のプロバイダー
provider "aws" {
alias = "us_east"
region = "us-east-1"
}
# 使用例
resource "aws_instance" "tokyo" {
# デフォルトのプロバイダー(ap-northeast-1)を使用
ami = "ami-xxxxx"
instance_type = "t2.micro"
}
resource "aws_instance" "virginia" {
# us-east-1のプロバイダーを使用
provider = aws.us_east
ami = "ami-yyyyy"
instance_type = "t2.micro"
}
Azure プロバイダーの設定
基本設定
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}
provider "azurerm" {
features {}
}
認証方法
1. Azure CLIを使用(推奨)
# Azure CLIでログイン
az login
Terraformは自動的にAzure CLIの認証情報を使用します。
2. サービスプリンシパルを使用
export ARM_CLIENT_ID="your-client-id"
export ARM_CLIENT_SECRET="your-client-secret"
export ARM_SUBSCRIPTION_ID="your-subscription-id"
export ARM_TENANT_ID="your-tenant-id"
または、プロバイダーブロックで直接指定:
provider "azurerm" {
features {}
client_id = var.client_id
client_secret = var.client_secret
subscription_id = var.subscription_id
tenant_id = var.tenant_id
}
Google Cloud プロバイダーの設定
基本設定
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "~> 5.0"
}
}
}
provider "google" {
project = "my-project-id"
region = "asia-northeast1"
}
認証方法
1. サービスアカウントキーを使用
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account-key.json"
2. gcloud CLIを使用
# gcloud CLIでログイン
gcloud auth application-default login
3. プロバイダーブロックで指定
provider "google" {
credentials = file("/path/to/service-account-key.json")
project = "my-project-id"
region = "asia-northeast1"
}
プロバイダーの初期化
プロバイダーの設定を記述したら、terraform initコマンドでプロバイダーをダウンロードして初期化します。
terraform init
実行結果の例:
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 5.0"...
- Installing hashicorp/aws v5.31.0...
- Installed hashicorp/aws v5.31.0 (signed by HashiCorp)
Terraform has been successfully initialized!
.terraform ディレクトリ
terraform initを実行すると、.terraformディレクトリが作成され、プロバイダーのバイナリがダウンロードされます。
.
├── .terraform/
│ └── providers/
│ └── registry.terraform.io/
│ └── hashicorp/
│ └── aws/
│ └── 5.31.0/
├── main.tf
└── .terraform.lock.hcl
.terraformディレクトリはバージョン管理システム(Git)に含めないでください。.gitignoreに追加することをお勧めします。ロックファイル
terraform initを実行すると、.terraform.lock.hclファイルが作成されます。このファイルは、使用しているプロバイダーの正確なバージョンを記録します。
# .terraform.lock.hcl
provider "registry.terraform.io/hashicorp/aws" {
version = "5.31.0"
constraints = "~> 5.0"
hashes = [
"h1:...",
"zh:...",
]
}
ロックファイルの役割:
- チーム全体で同じプロバイダーバージョンを使用
- 予期しないバージョンアップを防止
- セキュリティとチェックサムの検証
.terraform.lock.hclはバージョン管理システムにコミットしてください。プロバイダーのアップグレード
プロバイダーを最新バージョンにアップグレードするには:
# ロックファイルを更新
terraform init -upgrade
複数プロバイダーの使用
1つのTerraform設定で複数のプロバイダーを使用できます。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
google = {
source = "hashicorp/google"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
provider "azurerm" {
features {}
}
provider "google" {
project = "my-project"
region = "asia-northeast1"
}
ベストプラクティス
1. バージョン制約を明示的に指定
# 良い例
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# 悪い例(バージョン指定なし)
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
}
}
}
2. 認証情報をコードに含めない
# 良い例(環境変数を使用)
provider "aws" {
region = var.aws_region
}
# 悪い例(ハードコーディング)
provider "aws" {
region = "ap-northeast-1"
access_key = "AKIAIOSFODNN7EXAMPLE" # 絶対にしないでください!
secret_key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" # 絶対にしないでください!
}
3. プロバイダーの設定を分離
大規模なプロジェクトでは、プロバイダーの設定を別ファイルに分離します。
.
├── main.tf # メインの設定
├── providers.tf # プロバイダーの設定
├── variables.tf # 変数の定義
└── outputs.tf # 出力の定義
次のステップ
より高度なシークレット管理
本ガイドでは環境変数や認証情報ファイルを使用した基本的な認証方法を紹介しましたが、エンタープライズ環境では、より安全なシークレット管理が必要になる場合があります。
HashiCorp Vaultとの連携
HashiCorp Vaultを使用すると、以下のような高度なシークレット管理が可能になります:
主な機能:
- 集中管理: すべての認証情報を一元管理
- 動的シークレット: 必要な時に一時的な認証情報を生成
- アクセス制御: きめ細かい権限管理とログ記録
- 自動ローテーション: 定期的なシークレットの更新
使用例:
# Vaultから認証情報を取得
data "vault_kv_secret_v2" "aws_creds" {
mount = "secret"
name = "aws/credentials"
}
provider "aws" {
region = "ap-northeast-1"
access_key = data.vault_kv_secret_v2.aws_creds.data["access_key"]
secret_key = data.vault_kv_secret_v2.aws_creds.data["secret_key"]
}
プロバイダーの設定が完了したら、実際にリソースを管理する方法を学びましょう。