PR

第1章: TerraformとAWSの基礎

第1章: TerraformとAWSの基礎

1. TerraformとIaCの概念

そもそもIaCが必要な理由

インフラストラクチャ・アズ・コード(IaC)が登場する前は、サーバーやネットワークなどのインフラ構築は手作業で行われていました。この手動プロセスには以下のような問題がありました:

  • 再現性の欠如: 同じ環境を別の場所に構築するのが困難
  • ヒューマンエラー: 手作業による設定ミスが頻発
  • ドキュメント不足: 実際の構成とドキュメントの乖離
  • スケーリングの困難: 大規模環境での一貫した管理が難しい

IaCはこれらの問題を解決します。インフラの定義をコード化することで、以下のメリットを得られます:

  • バージョン管理: GitなどでインフラのすべてのバージョンをTrack
  • 再現性: 同一環境を何度でも正確に再現可能
  • 自動化: デプロイメントプロセスの自動化
  • 一貫性: 環境間での構成差異を排除
  • 監査対応: 変更履歴の追跡が容易

TerraformがAWS CloudFormationやAnsibleと異なる点

特徴TerraformAWS CloudFormationAnsible
対応クラウドマルチクラウド対応AWS専用マルチプラットフォーム
記述言語HCL (HashiCorp Configuration Language)JSON/YAMLYAML
実行モデル宣言型+状態管理宣言型+状態管理手続き型
状態管理外部状態ファイルAWS内部で管理基本的に状態を持たない
プロバイダーモデルプラグイン方式組み込みモジュール方式

Terraformの最大の特徴はクラウドに依存しない設計であり、異なるプロバイダー(AWS、Azure、GCPなど)を組み合わせたインフラ構築が可能です。

Terraformを使用するメリット

  1. プロバイダー非依存: 特定のクラウドプロバイダーにロックインされない
  2. 宣言型アプローチ: 最終状態を定義し、Terraformが実現方法を決定
  3. 状態管理: tfstateファイルで現状と理想状態の差分を管理
  4. モジュール化: 再利用可能なコンポーネントの作成が容易
  5. プラン機能: 実行前に変更内容を確認可能
  6. グラフベースの依存関係: リソース間の依存関係を自動解決
  7. 大規模コミュニティ: 豊富なモジュールとプロバイダー

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リソースを管理するには、適切な認証情報が必要です:

  1. AWS CLIのインストール: # Macの場合 brew install awscli # Linuxの場合 pip install awscli
  2. 認証情報の設定: aws configure 以下の情報を入力:
    • AWS Access Key ID
    • AWS Secret Access Key
    • Default region name (例: ap-northeast-1)
    • Default output format (json推奨)

IAMユーザーの作成とTerraformからの扱い

Terraformで使用するIAMユーザーには適切な権限が必要です:

  1. AWSコンソールから専用IAMユーザーを作成
  2. 以下のポリシーをアタッチ(最小権限の原則に従いカスタムポリシーが理想的):
    • 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アカウントとリージョンに対してリソースを適切に管理できるようになります。

コメント

タイトルとURLをコピーしました