第1章: TerraformとAWSの基礎
1. TerraformとIaCの概念
そもそもIaCが必要な理由
インフラストラクチャ・アズ・コード(IaC)が登場する前は、サーバーやネットワークなどのインフラ構築は手作業で行われていました。この手動プロセスには以下のような問題がありました:
- 再現性の欠如: 同じ環境を別の場所に構築するのが困難
- ヒューマンエラー: 手作業による設定ミスが頻発
- ドキュメント不足: 実際の構成とドキュメントの乖離
- スケーリングの困難: 大規模環境での一貫した管理が難しい
IaCはこれらの問題を解決します。インフラの定義をコード化することで、以下のメリットを得られます:
- バージョン管理: GitなどでインフラのすべてのバージョンをTrack
- 再現性: 同一環境を何度でも正確に再現可能
- 自動化: デプロイメントプロセスの自動化
- 一貫性: 環境間での構成差異を排除
- 監査対応: 変更履歴の追跡が容易
TerraformがAWS CloudFormationやAnsibleと異なる点
特徴 | Terraform | AWS CloudFormation | Ansible |
---|---|---|---|
対応クラウド | マルチクラウド対応 | AWS専用 | マルチプラットフォーム |
記述言語 | HCL (HashiCorp Configuration Language) | JSON/YAML | YAML |
実行モデル | 宣言型+状態管理 | 宣言型+状態管理 | 手続き型 |
状態管理 | 外部状態ファイル | AWS内部で管理 | 基本的に状態を持たない |
プロバイダーモデル | プラグイン方式 | 組み込み | モジュール方式 |
Terraformの最大の特徴はクラウドに依存しない設計であり、異なるプロバイダー(AWS、Azure、GCPなど)を組み合わせたインフラ構築が可能です。
Terraformを使用するメリット
- プロバイダー非依存: 特定のクラウドプロバイダーにロックインされない
- 宣言型アプローチ: 最終状態を定義し、Terraformが実現方法を決定
- 状態管理: tfstateファイルで現状と理想状態の差分を管理
- モジュール化: 再利用可能なコンポーネントの作成が容易
- プラン機能: 実行前に変更内容を確認可能
- グラフベースの依存関係: リソース間の依存関係を自動解決
- 大規模コミュニティ: 豊富なモジュールとプロバイダー
2. Terraformの基本コマンド
terraform init
:初期化
このコマンドは作業ディレクトリを初期化し、以下の処理を行います:
terraform init
- 必要なプロバイダープラグインのダウンロード
- バックエンド設定の初期化
- モジュールのダウンロードと設定
新しいTerraformプロジェクトや、新しいマシンでの作業を始める際に最初に実行します。
terraform plan
:変更プランの確認
現在の状態から目標状態への変更内容を計画し表示します:
terraform plan
出力例:
+ aws_instance.example
ami: "ami-0c55b159cbfafe1f0"
instance_type: "t2.micro"
...
+
は追加、-
は削除、~
は変更を示します。このステップは実際の変更を行わず、安全に実行計画を確認できます。
terraform apply
:変更適用
plan
で確認した変更を実際に適用します:
terraform apply
このコマンドは変更内容を表示し、確認プロンプトを表示します。-auto-approve
フラグを使用すると確認なしで適用できます。
terraform destroy
:リソースの削除
Terraformで管理されているすべてのリソースを削除します:
terraform destroy
このコマンドも確認プロンプトを表示します。部分的なリソース削除には-target
オプションを使用します。
terraform fmt
/ terraform validate
:コードのフォーマットと検証
コードの整形と検証を行います:
terraform fmt # コードを標準形式に整形
terraform validate # 構文とリソース設定の検証
fmt
はコードの読みやすさと一貫性を保ち、validate
は構文エラーや設定ミスを事前に検出します。
3. AWSとTerraformの接続
AWS CLIの設定
TerraformがAWSリソースを管理するには、適切な認証情報が必要です:
- AWS CLIのインストール:
# Macの場合 brew install awscli # Linuxの場合 pip install awscli
- 認証情報の設定:
aws configure
以下の情報を入力:- AWS Access Key ID
- AWS Secret Access Key
- Default region name (例: ap-northeast-1)
- Default output format (json推奨)
IAMユーザーの作成とTerraformからの扱い
Terraformで使用するIAMユーザーには適切な権限が必要です:
- AWSコンソールから専用IAMユーザーを作成
- 以下のポリシーをアタッチ(最小権限の原則に従いカスタムポリシーが理想的):
- AmazonEC2FullAccess
- AmazonS3FullAccess
- AmazonRDSFullAccess
- AmazonVPCFullAccess など(必要に応じて)
Terraformファイルでの認証設定方法:
provider "aws" {
region = "ap-northeast-1"
# 明示的な認証情報の指定(非推奨、環境変数かAWS CLIの設定を推奨)
# access_key = "AKIAIOSFODNN7EXAMPLE"
# secret_key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}
より安全な方法として環境変数を使用:
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_DEFAULT_REGION="ap-northeast-1"
Terraform Provider AWSの概念
Terraformプロバイダーは、特定のクラウドプロバイダーやサービスとの連携を可能にするプラグインです。
AWS Provider設定の基本:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16" # バージョン指定(重要)
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "ap-northeast-1"
# オプション設定
default_tags {
tags = {
Environment = "dev"
Project = "terraform-demo"
}
}
}
主要な設定オプション:
- region: 使用するAWSリージョン
- profile: AWS CLIのプロファイル名
- assume_role: 別のIAMロールを引き受ける
- default_tags: すべてのリソースに適用されるタグ
複数リージョンやアカウントの管理も可能:
provider "aws" {
alias = "tokyo"
region = "ap-northeast-1"
}
provider "aws" {
alias = "oregon"
region = "us-west-2"
}
# リソース定義時に使用するプロバイダーを指定
resource "aws_instance" "example_tokyo" {
provider = aws.tokyo
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
この設定により、Terraformは指定されたAWSアカウントとリージョンに対してリソースを適切に管理できるようになります。
コメント