AWS CloudFormation テンプレート作成ガイド
インフラストラクチャをコードとして管理する方法
AWS CloudFormation は、AWSリソースをコードとして定義し、一貫した方法でプロビジョニングするためのサービスです。JSON または YAML 形式のテンプレートファイルを作成することで、インフラストラクチャ全体を自動的にデプロイ、更新、削除できます。
メリット:
コード化されたインフラ(IaC)により、リソース作成の自動化、再現性の向上、バージョン管理が可能になります。
テンプレート構造(YAML形式)
AWSTemplateFormatVersion
:
"2010-09-09"
Description
:
"シンプルなEC2インスタンスを作成するテンプレート"
Metadata
:
AWS::CloudFormation::Interface
:
ParameterGroups
:
-
Parameters
:
-
"InstanceType"
Parameters
:
InstanceType
:
Type
:
"String"
Default
:
"t2.micro"
Description
:
"EC2インスタンスタイプ"
Mappings
:
RegionMap
:
ap-northeast-1
:
AMI
:
"ami-0ab0bbbd329f565e6"
Conditions
:
CreateProdResources
:
!Equals [!Ref "Environment", "prod"]
Resources
:
MyEC2Instance
:
Type
:
"AWS::EC2::Instance"
Properties
:
InstanceType
:
!Ref "InstanceType"
ImageId
:
!FindInMap [RegionMap, !Ref "AWS::Region", AMI]
Outputs
:
InstanceId
:
Description
:
"EC2インスタンスID"
Value
:
!Ref "MyEC2Instance"
セクションの説明
-
AWSTemplateFormatVersion:
テンプレートの形式バージョン(現在は "2010-09-09" のみ)
-
Description:
テンプレートの説明文
-
Metadata:
テンプレートに関する追加情報
-
Parameters:
スタック作成時に指定可能なパラメータ
-
Mappings:
キーと値のマッピングテーブル
-
Conditions:
条件付きでリソースを作成するための条件式
-
Resources:
作成するAWSリソースの定義(必須)
-
Outputs:
スタック作成後に参照できる出力値
重要:
テンプレートでは
Resources
セクションのみが必須で、他はオプションです。YAMLまたはJSON形式で記述できますが、YAMLの方が読みやすく推奨されています。
テンプレート作成の手順
1
要件の定義
作成したいインフラストラクチャの要件を明確にします。必要なリソース、依存関係、パラメータを特定します。
2
構造の設計
テンプレートの基本構造を設計します。必要なセクション(リソース、パラメータなど)を決めます。
3
リソースの定義
必要なAWSリソースを定義します。各リソースのプロパティと設定を指定します。
4
パラメータの追加
テンプレートを再利用可能にするためのパラメータを追加します。デフォルト値や制約を設定します。
5
出力の定義
参照用の出力値を定義します。これらは他のスタックで使用したり、情報表示に利用できます。
6
テストと検証
AWS CloudFormation コンソールやCLIでテンプレートを検証し、エラーがないことを確認します。
代表的なパラメータと属性
パラメータの型
|
パラメータ型
|
説明
|
例
|
|
String
|
文字列値
|
インスタンス名、キー名など
|
|
Number
|
整数または小数
|
ポート番号、容量サイズなど
|
|
AWS::EC2::VPC::Id
|
既存のVPC ID
|
vpc-0123456789abcdef0
|
|
AWS::EC2::Subnet::Id
|
既存のサブネットID
|
subnet-0123456789abcdef0
|
|
CommaDelimitedList
|
カンマ区切りの値リスト
|
test1,test2,test3
|
|
List
|
数値のリスト
|
[80, 443, 8080]
|
パラメータの属性
|
属性
|
説明
|
例
|
|
Default
|
パラメータのデフォルト値
|
t2.micro
|
|
AllowedValues
|
許可される値のリスト
|
[t2.micro, t2.small, t2.medium]
|
|
AllowedPattern
|
正規表現パターン
|
^[a-zA-Z0-9]*$
|
|
MinLength/MaxLength
|
文字列の長さ制限
|
MinLength: 1, MaxLength: 255
|
|
MinValue/MaxValue
|
数値の範囲制限
|
MinValue: 1, MaxValue: 65535
|
|
NoEcho
|
パラメータ値を隠す(パスワードなど)
|
true
|
組み込み関数
Map
!FindInMap
マッピングから値を検索
関数の使用例
InstanceType
:
!Ref "InstanceTypeParameter"
PublicIP
:
!GetAtt "MyEC2Instance.PublicIp"
BucketName
:
!Join ["-", ["my-bucket", !Ref "AWS::AccountId"]]
Endpoint
:
!Sub "https://${ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/prod/"
AMI
:
!FindInMap [RegionMap, !Ref "AWS::Region", AMI]
EnvironmentType
:
!If [IsProd, "production", "development"]
代表的なリソースタイプ
コンピューティング
-
AWS::EC2::Instance
- EC2インスタンス
-
AWS::AutoScaling::AutoScalingGroup
- Auto Scalingグループ
-
AWS::ECS::Cluster
- ECSクラスター
-
AWS::Lambda::Function
- Lambda関数
ストレージ
-
AWS::S3::Bucket
- S3バケット
-
AWS::RDS::DBInstance
- RDSデータベース
-
AWS::DynamoDB::Table
- DynamoDBテーブル
-
AWS::EFS::FileSystem
- EFSファイルシステム
ネットワーキング
-
AWS::EC2::VPC
- 仮想プライベートクラウド
-
AWS::EC2::Subnet
- サブネット
-
AWS::EC2::SecurityGroup
- セキュリティグループ
-
AWS::ElasticLoadBalancing::LoadBalancer
- ロードバランサー
-
AWS::Route53::RecordSet
- DNS レコード
セキュリティ
-
AWS::IAM::Role
- IAMロール
-
AWS::IAM::Policy
- IAMポリシー
-
AWS::KMS::Key
- KMS暗号化キー
実践的なテンプレート例
基本的なWebサーバー構成
AWSTemplateFormatVersion
:
"2010-09-09"
Description
:
"基本的なWebサーバー構成"
Parameters
:
InstanceType
:
Type
:
"String"
Default
:
"t2.micro"
AllowedValues
:
-
"t2.micro"
-
"t2.small"
-
"t2.medium"
Description
:
"EC2インスタンスタイプ"
KeyName
:
Type
:
"AWS::EC2::KeyPair::KeyName"
Description
:
"EC2インスタンスへのSSHアクセス用のキーペア名"
Resources
:
WebServerSecurityGroup
:
Type
:
"AWS::EC2::SecurityGroup"
Properties
:
GroupDescription
:
"Webサーバー用セキュリティグループ"
SecurityGroupIngress
:
-
IpProtocol
:
"tcp"
FromPort
:
80
ToPort
:
80
CidrIp
:
"0.0.0.0/0"
-
IpProtocol
:
"tcp"
FromPort
:
22
ToPort
:
22
CidrIp
:
"0.0.0.0/0"
WebServer
:
Type
:
"AWS::EC2::Instance"
Properties
:
InstanceType
:
!Ref "InstanceType"
SecurityGroups
:
-
!Ref "WebServerSecurityGroup"
KeyName
:
!Ref "KeyName"
ImageId
:
"ami-0ab0bbbd329f565e6"
UserData
:
Fn::Base64
:
!Sub |
#!/bin/bash -xe
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<html><body><h1>CloudFormation で作成されたウェブサーバーへようこそ!</h1></body></html>" > /var/www/html/index.html