AWS CloudFormationは、AWSリソースをコードとして定義し、プロビジョニングするためのインフラストラクチャ as コード(IaC)サービスです。CloudFormationを使用すると、テンプレートファイルを作成してAWSリソースとそれらの依存関係を記述し、それらのリソースを「スタック」として一緒にデプロイおよび管理できます。これにより、インフラストラクチャのプロビジョニングと管理を自動化し、一貫性のある再現可能な方法でAWS環境を構築することができます。
CloudFormationの基本的な仕組みは以下の通りです:
テンプレート作成 → テンプレート検証 → スタック作成/更新 → リソースプロビジョニング → スタック完了 ↓ [エラー発生] → 自動ロールバック
CloudFormationテンプレートは、JSONまたはYAML形式で記述され、以下のセクションで構成されています:
セクション | 必須 | 説明 |
---|---|---|
AWSTemplateFormatVersion | いいえ | テンプレートのバージョン(通常は "2010-09-09") |
Description | いいえ | テンプレートの説明 |
Metadata | いいえ | テンプレートに関する追加情報 |
Parameters | いいえ | スタック作成時に渡すことができる値 |
Rules | いいえ | スタック作成または更新時に適用されるパラメータの検証ルール |
Mappings | いいえ | キーと値のマッピング(例:リージョンごとのAMI ID) |
Conditions | いいえ | リソースの作成や設定を条件付きで行うための条件 |
Transform | いいえ | AWS SAMなどのマクロを適用するための指定 |
Resources | はい | 作成または更新するAWSリソースとその設定 |
Outputs | いいえ | スタックの作成後に参照できる値 |
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Simple EC2 instance template'
Parameters:
InstanceType:
Description: EC2 instance type
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t2.small
- t2.medium
ConstraintDescription: must be a valid EC2 instance type.
KeyName:
Description: Name of an existing EC2 KeyPair
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: must be the name of an existing EC2 KeyPair.
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType
KeyName: !Ref KeyName
ImageId: ami-0c55b159cbfafe1f0 # Amazon Linux 2 AMI in us-east-1
SecurityGroups:
- !Ref InstanceSecurityGroup
Tags:
- Key: Name
Value: MyInstance
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable SSH access
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Outputs:
InstanceId:
Description: The Instance ID
Value: !Ref MyEC2Instance
PublicIP:
Description: Public IP address of the EC2 instance
Value: !GetAtt MyEC2Instance.PublicIp
PublicDNS:
Description: Public DNS of the EC2 instance
Value: !GetAtt MyEC2Instance.PublicDnsName
AWSTemplateFormatVersion: '2010-09-09'
Description: 'VPC with public and private subnets'
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
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.2.0/24
AvailabilityZone: !Select [ 0, !GetAZs '' ]
Tags:
- Key: Name
Value: Private Subnet 1
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: MyIGW
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref MyVPC
InternetGatewayId: !Ref InternetGateway
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: Public Route Table
PublicRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref PublicRouteTable
Outputs:
VpcId:
Description: The VPC ID
Value: !Ref MyVPC
PublicSubnetId:
Description: The public subnet ID
Value: !Ref PublicSubnet1
PrivateSubnetId:
Description: The private subnet ID
Value: !Ref PrivateSubnet1
CloudFormationは、AWS Management Console、AWS CLI、SDKs、またはインフラストラクチャ as コード(IaC)ツールを使用して利用できます。
aws cloudformation create-stack \
--stack-name my-network-stack \
--template-body file://network.yaml \
--parameters ParameterKey=KeyName,ParameterValue=my-key
aws cloudformation create-stack \
--stack-name my-network-stack \
--template-body file://network.yaml \
--parameters file://parameters.json
parameters.jsonの例:
[
{
"ParameterKey": "KeyName",
"ParameterValue": "my-key"
},
{
"ParameterKey": "InstanceType",
"ParameterValue": "t2.micro"
}
]
aws cloudformation list-stacks
aws cloudformation describe-stacks --stack-name my-network-stack
aws cloudformation update-stack \
--stack-name my-network-stack \
--template-body file://updated-network.yaml
# 変更セットの作成
aws cloudformation create-change-set \
--stack-name my-network-stack \
--change-set-name my-change-set \
--template-body file://updated-network.yaml
# 変更セットの詳細表示
aws cloudformation describe-change-set \
--stack-name my-network-stack \
--change-set-name my-change-set
# 変更セットの実行
aws cloudformation execute-change-set \
--stack-name my-network-stack \
--change-set-name my-change-set
aws cloudformation delete-stack --stack-name my-network-stack
AWS Cloud Development Kit(CDK)は、プログラミング言語を使用してCloudFormationテンプレートを生成するためのフレームワークです。
特徴 | CloudFormation | AWS CDK |
---|---|---|
定義方法 | YAML/JSON(宣言的) | TypeScript、Python、Java、C#など(命令的) |
抽象化レベル | 低(リソースレベル) | 高(コンストラクトレベル) |
再利用性 | ネスト化されたスタック、カスタムリソース | クラス、モジュール、ライブラリ |
型安全性 | なし | あり(言語による) |
ロジックの実装 | 制限あり | プログラミング言語の機能を活用可能 |
学習曲線 | 比較的緩やか | プログラミング知識が必要 |
最終的な出力 | CloudFormationテンプレート | CloudFormationテンプレート |
TerraformはHashiCorpが提供するオープンソースのインフラストラクチャ as コードツールで、AWSだけでなく複数のクラウドプロバイダーをサポートしています。
特徴 | CloudFormation | Terraform |
---|---|---|
プロバイダー | AWSのみ | マルチクラウド(AWS、Azure、GCP、その他) |
言語 | YAML/JSON | HCL(HashiCorp Configuration Language) |
状態管理 | AWSが管理 | 状態ファイルを管理する必要あり |
変更検出 | ドリフト検出 | 計画フェーズ(terraform plan) |
リソースのサポート | AWSリソースの包括的なサポート | 多くのプロバイダーのリソースをサポート |
モジュール化 | ネスト化されたスタック | Terraformモジュール |
コミュニティ | AWSコミュニティ | 幅広いオープンソースコミュニティ |
統合 | AWSサービスとの緊密な統合 | 多くのサードパーティツールとの統合 |
AWS CloudFormationは、AWSリソースをコードとして定義し、プロビジョニングするための強力なインフラストラクチャ as コードサービスです。テンプレートを使用してAWSリソースとその依存関係を記述し、それらのリソースをスタックとして一緒にデプロイおよび管理することで、インフラストラクチャのプロビジョニングと管理を自動化できます。
CloudFormationの主な利点は以下の通りです:
CloudFormationを効果的に活用するには、テンプレートのバージョン管理、パラメータの適切な使用、変更セットの活用、ネスト化されたスタックの使用などのベストプラクティスを適用することが重要です。また、AWS CDKやTerraformなどの他のIaCツールと比較して、プロジェクトの要件に最も適したツールを選択することも重要です。