Infrastructure as Code

インフラの構成をコードで定義し、バージョン管理・自動化・再現性を実現する手法

IaCDevOps

Infrastructure as Code とは

Infrastructure as Code (IaC) は、インフラの構成をコード (YAML, JSON, HCL) で定義し、バージョン管理・自動化・再現性を実現する手法である。手動でコンソールを操作する代わりに、コードでインフラを宣言する。

IaC のメリット

同じコードから同じ環境を何度でも作成できる再現性が最大の利点だ。Git で変更履歴を追跡でき、PR でインフラ変更をコードレビューできる。CI/CD パイプラインに組み込めば自動デプロイが可能で、コードと実際のインフラの差分 (ドリフト) も検出できる。

AWS の IaC ツール

ツール 言語 特徴
CloudFormation YAML/JSON AWS ネイティブ
SAM YAML サーバーレス特化
CDK TypeScript 等 プログラミング言語で定義
Terraform HCL マルチクラウド

SAM テンプレートの例

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: nodejs22.x
      Handler: index.handler
      Events:
        Api:
          Type: HttpApi
          Properties:
            Path: /hello
            Method: GET

  MyTable:
    Type: AWS::DynamoDB::Table
    Properties:
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - { AttributeName: id, AttributeType: S }
      KeySchema:
        - { AttributeName: id, KeyType: HASH }

宣言的 vs 命令的

方式 説明 ツール
宣言的 望ましい状態を定義 CloudFormation, Terraform
命令的 手順を記述 AWS CLI スクリプト
# 宣言的: 「DynamoDB テーブルが存在すべき」
Resources:
  MyTable:
    Type: AWS::DynamoDB::Table
# CloudFormation が差分を計算して適用

IaC のベストプラクティス

全リソースをコードで管理し、コンソールで手動作成しない。dev/stg/prod を同じテンプレートでパラメータ化し、デプロイ前に変更セットで影響範囲を確認する。ネストされたスタックでモジュール化し、再利用性を高める。

コンソール操作の禁止

❌ コンソールで Lambda を作成 → Git に記録されない → ドリフト
✅ SAM テンプレートで定義 → Git で管理 → 再現可能

実務での活用方法は関連書籍にも詳しい。

関連用語