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?

【IaC超入門】30日でAWS CloudFormationとTerraformをマスターするロードマップ - 29日目: CI/CDパイプラインにIaCを組み込む

Last updated at Posted at 2025-08-28

CI/CDパイプラインにIaCを組み込む

はじめに

IaC(Infrastructure as Code)をGitで管理することで、インフラの変更をコードとして扱えるようになりました。しかし、このコードを毎回手動でデプロイするのは非効率的です。今回は、CI/CDパイプラインにIaCを組み込み、インフラの変更を安全かつ効率的に自動化する方法を解説します。これにより、インフラ管理の品質と生産性を大幅に向上させることができます。

1. なぜCI/CDにIaCを組み込むのか?

CI/CD(継続的インテグレーション・継続的デリバリー)は、アプリケーション開発で広く使われている手法ですが、IaCにも同様のメリットをもたらします。

主要なメリット

  • 自動化によるヒューマンエラーの排除: 手動でのコマンド実行や設定ミスを防ぎ、一貫したデプロイプロセスを確立します
  • デプロイの高速化: 変更がGitリポジトリにプッシュされると自動でデプロイが開始されるため、リリースサイクルが短縮されます
  • 変更の可視化とレビューの強制: プルリクエスト(PR)での自動plan実行により、すべての変更内容がレビューされ、意図しない変更が本番環境にデプロイされるのを防ぎます
  • 監査ログの自動記録: すべての変更が自動的に記録され、コンプライアンス要件を満たしやすくなります

2. CI/CDパイプラインの構成

IaCのためのCI/CDパイプラインは、通常以下のステップで構成されます。

基本的なワークフロー

  1. 静的解析(Linting): コードの文法エラーや命名規則の違反を自動でチェックします

    • Terraformの場合:terraform fmtterraform validate
    • セキュリティスキャン:tfseccheckovなど
  2. 実行計画の確認(Planning): 変更がマージされる前に、実行計画を自動生成・確認します

    • terraform planの結果をPRコメントに自動投稿
    • 変更内容をレビューアが確認可能
  3. 適用(Applying): 変更が承認され、メインブランチにマージされると自動デプロイを実行します

    • ステージング環境での事前テスト
    • 本番環境への段階的デプロイ

3. セキュリティとベストプラクティス

認証情報の管理

  • GitHub Secrets環境変数を使用してAWSクレデンシャルを安全に管理
  • IAMロールの最小権限の原則を適用
  • 短期間の一時的な認証情報を使用(OIDC推奨)

状態ファイル(State)の管理

terraform {
  backend "s3" {
    bucket = "your-terraform-state-bucket"
    key    = "infrastructure/terraform.tfstate"
    region = "ap-northeast-1"
    
    # 状態ロック用DynamoDBテーブル
    dynamodb_table = "terraform-state-locks"
    encrypt        = true
  }
}

4. 具体的なパイプライン例(GitHub Actions)

以下は、セキュリティとベストプラクティスを考慮したGitHub Actionsのワークフロー例です。

.github/workflows/terraform.yml

name: Terraform CI/CD

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

env:
  TF_VERSION: '1.5.0'
  AWS_REGION: 'ap-northeast-1'

jobs:
  validate:
    name: Validate and Plan
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
      id-token: write  # OIDC用
    
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: ${{ env.AWS_REGION }}
      
      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: ${{ env.TF_VERSION }}
      
      - name: Terraform Format Check
        run: terraform fmt -check -recursive
      
      - name: Terraform Init
        run: terraform init
      
      - name: Terraform Validate
        run: terraform validate
      
      - name: Security Scan
        uses: aquasecurity/tfsec-pr-commenter-action@v1.3.1
        with:
          github_token: ${{ github.token }}
      
      - name: Terraform Plan
        id: plan
        run: |
          terraform plan -no-color -out=tfplan
          terraform show -no-color tfplan > plan.txt
        continue-on-error: true
      
      - name: Upload Plan Artifact
        uses: actions/upload-artifact@v4
        with:
          name: terraform-plan
          path: |
            tfplan
            plan.txt
      
      - name: Comment PR
        if: github.event_name == 'pull_request'
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const plan = fs.readFileSync('plan.txt', 'utf8');
            const maxLength = 60000; // GitHubコメントの文字数制限
            const truncatedPlan = plan.length > maxLength 
              ? plan.substring(0, maxLength) + '\n...(truncated)'
              : plan;
            
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `## Terraform Plan Result
              
              \`\`\`
              ${truncatedPlan}
              \`\`\`
              
              Plan Status: ${{ steps.plan.outcome }}`
            });

  deploy:
    name: Apply Infrastructure
    needs: validate
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    environment: production  # GitHub Environment保護ルール
    permissions:
      contents: read
      id-token: write
    
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: ${{ env.AWS_REGION }}
      
      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: ${{ env.TF_VERSION }}
      
      - name: Terraform Init
        run: terraform init
      
      - name: Download Plan Artifact
        uses: actions/download-artifact@v4
        with:
          name: terraform-plan
      
      - name: Terraform Apply
        run: terraform apply -auto-approve tfplan
      
      - name: Notify Deployment
        if: success()
        run: |
          echo "✅ Infrastructure deployment completed successfully"
          # Slackやメール通知の設定も可能

コードの解説

セキュリティの強化点

  • OIDC認証: 長期間のAWSアクセスキーの代わりに、短期間の一時的な認証情報を使用
  • 権限の最小化: 各ジョブに必要最小限の権限のみを付与
  • 環境保護: 本番デプロイにGitHub Environmentsを使用し、承認フローを追加可能

機能の改善点

  • フォーマットチェック: terraform fmt -checkでコードフォーマットを強制
  • セキュリティスキャン: tfsecでセキュリティ問題を自動検出
  • 計画の可視化: PRコメントにTerraform planの結果を自動投稿
  • アーティファクト管理: 計画ファイルをジョブ間で安全に共有

5. 段階的デプロイメント戦略

本番環境へのリスクを最小化するために、以下のような段階的デプロイメント戦略を推奨します。

環境分離

開発環境 (dev) → ステージング環境 (staging) → 本番環境 (prod)

ブランチ戦略

  • feature/*: 開発環境への自動デプロイ
  • develop: ステージング環境への自動デプロイ
  • main: 本番環境への承認後デプロイ

6. モニタリングとアラート

デプロイ後の監視体制も重要です。

実装例

- name: Health Check
  run: |
    # デプロイされたリソースの健全性チェック
    aws elbv2 describe-target-health --target-group-arn $TARGET_GROUP_ARN
    
- name: Rollback on Failure
  if: failure()
  run: |
    echo "Deployment failed. Consider rollback procedures."
    # 必要に応じてロールバック処理を実装

まとめ

CI/CDパイプラインにIaCを組み込むことで、以下の効果が期待できます。

  • 品質向上: 自動テストとレビュープロセスにより、インフラ変更の品質が向上
  • セキュリティ強化: 自動化されたセキュリティチェックと適切な認証情報管理
  • 運用効率化: 手動作業の削減と標準化されたデプロイプロセス
  • 監査対応: すべての変更履歴が自動的に記録され、コンプライアンス要件を満たす

IaCのCI/CD化は単なる自動化以上の価値をもたらします。適切に設計されたパイプラインは、チーム全体のインフラ管理能力を底上げし、安全で効率的な開発環境を実現します。

次回は、より高度なIaCパターンや、マルチクラウド環境での運用について詳しく解説予定です。お楽しみに!

参考資料

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?