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 で管理 → 再現可能
実務での活用方法は関連書籍にも詳しい。