
AWSのCloudFormation入門ガイド
AWS CloudFormationは、AWSリソースをコードとして定義し、そのコードをテンプレートとして使用してインフラストラクチャをプロビジョニングするサービスです。このガイドでは、CloudFormationの基本概念から実際の利用方法、そして運用のベストプラクティスまでを解説します。
CloudFormationとは何か
AWS CloudFormationは、Amazon Web Servicesが提供するInfrastructure as Code(IaC)サービスです。コードとしてインフラストラクチャを定義することで、一貫性のあるリソースの作成、更新、削除を行えます。
CloudFormationの主な特徴は以下の通りです:
- インフラストラクチャのコード化: YAML/JSONテンプレートを使用してインフラをコードとして定義
- 自動化されたデプロイ: 大規模なインフラストラクチャも一括でデプロイ可能
- バージョン管理: テンプレートをソースコード管理システムに保存し、変更履歴を追跡
- 依存関係の管理: リソース間の依存関係を自動的に解決
- 変更の予測と検証: 変更をデプロイ前に確認できる「変更セット」機能
- ロールバック機能: エラー発生時に自動的に以前の状態に戻す
- クロスアカウント・クロスリージョンデプロイ: 複数のAWSアカウントやリージョンに展開
- パラメータによるカスタマイズ: 環境ごとに異なる設定を適用
CloudFormationの重要性と採用広がる背景
近年、CloudFormationはシステム開発における重要な要素として認識されています。特に、以下のような背景から政府機関や大企業でも広く採用が進んでいます:
- ガバナンス強化:システム構成を明文化し、監査対応やコンプライアンス要件への適合が容易になる
- 標準化の推進:組織全体で一貫性のあるクラウド環境を構築・運用できる
- リスク軽減:手動操作によるミスを防止し、環境間の差異をなくす
- 計画的な変更管理:変更内容を事前に確認・承認することが可能
- ドキュメントとしての価値:テンプレート自体が最新のインフラ構成を示す正確なドキュメントとなる
多くの政府機関が調達仕様書においてIaC採用を明記するケースが増えており、CloudFormationはその要件を満たす代表的な選択肢となっています。
CloudFormationの基本概念
CloudFormationの理解に必要な基本概念を見ていきましょう。
テンプレート
CloudFormationのテンプレートは、JSONまたはYAML形式で記述され、以下のようなセクションで構成されます:
- Resources: 作成するAWSリソースを定義する(必須)
- Parameters: テンプレートに渡す入力値
- Mappings: 条件に基づいて使用する値のマッピング
- Conditions: リソース作成の条件
- Outputs: スタック作成後に参照できる出力値
- Metadata: テンプレートに関する追加情報
- Transform: マクロやAWS SAMなどの変換を指定
スタック
スタックは、CloudFormationテンプレートをデプロイして作成されるAWSリソースの集合体です。スタックは一つの単位として管理され、作成・更新・削除が行われます。
変更セット
変更セットは、既存のスタックに対する変更をプレビューする機能です。実際に変更を適用する前に、どのリソースが追加、変更、削除されるかを確認できます。
CloudFormationの基本的な使い方
1. テンプレートの作成
簡単なEC2インスタンスを作成するYAML形式のテンプレート例:
AWSTemplateFormatVersion: '2010-09-09'
Description: 'シンプルなEC2インスタンスを作成するCloudFormationテンプレート'
Parameters:
InstanceType:
Description: EC2インスタンスタイプ
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t2.small
- t3.micro
ConstraintDescription: インスタンスタイプはt2.micro、t2.small、またはt3.microから選択してください
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType
ImageId: ami-0c3fd0f5d33134a76 # Amazon Linux 2 AMI (東京リージョン)
SecurityGroups:
- !Ref InstanceSecurityGroup
Tags:
- Key: Name
Value: CloudFormationテスト
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: EC2インスタンス用セキュリティグループ
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Outputs:
InstanceId:
Description: 作成されたEC2インスタンスのID
Value: !Ref MyEC2Instance
PublicDNS:
Description: EC2インスタンスのパブリックDNS
Value: !GetAtt MyEC2Instance.PublicDnsName
2. スタックの作成
スタックを作成する方法は複数あります:
AWSマネジメントコンソールを使用
- CloudFormationコンソールにアクセス
- 「スタックの作成」をクリック
- テンプレートのアップロードまたはS3 URLを指定
- パラメータを入力
- オプション設定(タグ、IAMロール等)
- 確認と作成
AWS CLIを使用
aws cloudformation create-stack \
--stack-name MyTestStack \
--template-body file://template.yaml \
--parameters ParameterKey=InstanceType,ParameterValue=t2.micro
3. スタックの更新
テンプレートを変更した後、既存のスタックを更新できます:
マネジメントコンソールを使用
- CloudFormationコンソールでスタックを選択
- 「更新」をクリック
- 新しいテンプレートをアップロード
- パラメータを確認・変更
- 変更セットをプレビュー
- 変更を適用
AWS CLIを使用
aws cloudformation update-stack \
--stack-name MyTestStack \
--template-body file://updated-template.yaml
CloudFormationの高度な機能と実践的活用法
ネストされたスタック
大規模なアーキテクチャをモジュール化するために、親スタックから子スタックを参照できます:
Resources:
NetworkStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://s3.amazonaws.com/bucket/network.yaml
クロススタック参照
複数のスタック間でリソースを参照する場合、Exportを使用します:
# スタックA: 値をエクスポート
Outputs:
VPCId:
Value: !Ref MyVPC
Export:
Name: !Sub "${AWS::StackName}-VPCID"
# スタックB: エクスポートされた値を参照
Resources:
MySubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !ImportValue MyStackA-VPCID
カスタムリソース
CloudFormationのネイティブサポートがないリソースや操作を扱うためのカスタムリソース:
Resources:
MyCustomResource:
Type: Custom::MyResource
Properties:
ServiceToken: !GetAtt MyLambdaFunction.Arn
CustomProperty: SomeValue
StackSets
複数のAWSアカウントやリージョンにスタックをデプロイするためのStackSets:
aws cloudformation create-stack-set \
--stack-set-name MultiRegionApp \
--template-body file://global-app.yaml \
--permission-model SELF_MANAGED
CloudFormationを使った実際のユースケース
ネットワーク環境の構築
VPC、サブネット、インターネットゲートウェイ、ルートテーブルなどのネットワークリソースをコードで定義:
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.1.0/24
AvailabilityZone: !Select [0, !GetAZs ""]
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: Public Subnet 1
# その他のネットワークリソース...
マイクロサービスアーキテクチャの構築
ECS、API Gateway、Lambda、DynamoDBなどを組み合わせたマイクロサービスアーキテクチャ:
Resources:
ApiGateway:
Type: AWS::ApiGateway::RestApi
Properties:
Name: MyServiceAPI
LambdaFunction:
Type: AWS::Lambda::Function
Properties:
Handler: index.handler
Runtime: nodejs14.x
Code:
S3Bucket: my-code-bucket
S3Key: lambda-code.zip
Role: !GetAtt LambdaExecutionRole.Arn
# その他のマイクロサービスリソース...
CI/CDパイプラインの構築
CodePipeline、CodeBuild、CodeDeployを使ったCI/CDパイプライン:
Resources:
CodePipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
RoleArn: !GetAtt CodePipelineServiceRole.Arn
ArtifactStore:
Type: S3
Location: !Ref ArtifactBucket
Stages:
- Name: Source
Actions:
- Name: Source
ActionTypeId:
Category: Source
Owner: AWS
Provider: CodeStarSourceConnection
Version: '1'
Configuration:
ConnectionArn: !Ref GitHubConnection
FullRepositoryId: "user/repo"
BranchName: main
OutputArtifacts:
- Name: SourceCode
# ビルドステージとデプロイステージの定義...
CloudFormationの運用ベストプラクティス
テンプレート設計のベストプラクティス
- モジュール化: 機能やリソースタイプ別にテンプレートを分割する
- 再利用可能な設計: 汎用的なテンプレートを作成し、パラメータで柔軟性を持たせる
- バージョン管理: テンプレートをGitなどのバージョン管理システムで管理する
- コメントと説明: 目的や設定理由を明記し、メンテナンス性を高める
セキュリティのベストプラクティス
- 最小権限の原則: 必要最小限のIAMパーミッションだけを付与
- 機密データの管理: パラメータの
NoEcho
プロパティや、AWS Secrets Managerの活用 - リソースのコンプライアンス確認: AWS Config Rulesを使用した継続的なコンプライアンス確認
コスト管理のベストプラクティス
- コスト見積もり: AWS Pricing Calculatorを使用して、スタックのコストを事前に見積もる
- タグ戦略: コスト配分タグを使用してリソースの費用を追跡
- リソースの削除: 不要になったスタックは完全に削除し、コストを抑える
公共セクターにおけるCloudFormationの活用事例
近年、多くの政府機関や地方自治体がCloudFormationを含むIaCツールを採用しています。具体的な活用事例として:
- セキュリティ要件への準拠: 特定のセキュリティ要件(例:NIST SP 800-53)に準拠したテンプレートを標準化
- 災害対応システム: 災害時に短時間で復旧できるよう、インフラ構成を事前にコード化
- 行政サービスのモダナイゼーション: レガシーシステムをクラウドに移行する際のプロセス標準化
このようなケースでは、仕様書やRFP(提案依頼書)で明示的にIaCの採用を要件とするケースが増えており、CloudFormationの知識はクラウドエンジニアにとって必須のスキルとなりつつあります。
CloudFormationの代替手段と比較
CloudFormationと類似したIaCツールとの比較:
ツール | 特徴 | 利点 | 欠点 |
---|---|---|---|
AWS CloudFormation | AWSネイティブ | AWSサービスとの完全な統合、変更セット機能 | AWSリソースのみに限定 |
Terraform | マルチクラウド | クラウドプロバイダーに依存しない、シンプルな構文 | リソース状態の管理が必要 |
AWS CDK | プログラマブル | 一般的なプログラミング言語を使用可能 | 学習曲線がやや高い |
Ansible | 手続き型 | エージェントレス、シンプルな記述 | 宣言的でないため状態管理が複雑 |
まとめ
AWS CloudFormationは、インフラストラクチャをコードとして管理するための強力なツールです。テンプレートベースの宣言的アプローチにより、一貫性のあるリソース管理とデプロイの自動化を実現します。
政府機関や大企業でのIaCの普及により、CloudFormationの重要性はますます高まっています。システム要件や仕様書でIaCが標準として求められる中、CloudFormationのスキルを習得することは、クラウドエンジニアにとって大きな強みとなるでしょう。
本ガイドで紹介した基本的な概念と実践的なユースケースを参考に、CloudFormationを活用したインフラストラクチャ管理に取り組んでみてください。コードとしてインフラストラクチャを管理することで、より信頼性の高いクラウド環境の構築と運用が可能になります。