CloudFormation テンプレート¶
CloudFormation テンプレートで、何をどこへ書けば要件を満たせるかを整理するページ。
まず押さえたいテンプレート構造¶
Parameters: 環境ごとに変えたい値を書くResources: 実際に作る AWS リソースを書くOutputs: 作成後に参照したい値を書く
基本形¶
AWSTemplateFormatVersion: "2010-09-09"
Description: Sample template
Parameters:
ProjectName:
Type: String
Resources:
SampleResource:
Type: AWS::Service::Resource
Properties: {}
Outputs:
SampleOutput:
Value: !Ref SampleResource
サービスごとにどこを書くか¶
VPCResourcesにAWS::EC2::VPCとAWS::EC2::SubnetSecurity GroupResourcesにAWS::EC2::SecurityGroupEC2ResourcesにAWS::EC2::InstanceParametersにInstanceTypeやImageIdを置くと流用しやすいS3ResourcesにAWS::S3::Bucketバージョニングや暗号化はPropertiesに書くIAM RoleResourcesにAWS::IAM::Role信頼ポリシーはAssumeRolePolicyDocumentに書く
VPC を作りたいとき¶
Resources:
MainVpc:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
PublicSubnetA:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MainVpc
CidrBlock: 10.0.1.0/24
AvailabilityZone: ap-northeast-1a
見るポイント:
TypeがAWS::EC2::VPCか- Subnet が VPC を
!Refしているか
Security Group を作りたいとき¶
Resources:
WebSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow HTTP and HTTPS
VpcId: !Ref MainVpc
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
見るポイント:
VpcIdを忘れない- Ingress は
SecurityGroupIngressに書く
EC2 を作りたいとき¶
Parameters:
ImageId:
Type: String
InstanceType:
Type: String
Default: t3.micro
Resources:
WebInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
SubnetId: !Ref PublicSubnetA
SecurityGroupIds:
- !Ref WebSecurityGroup
見るポイント:
ImageIdとInstanceTypeはParameters化すると使い回しやすい- Subnet と Security Group を参照できているか
S3 を作りたいとき¶
Resources:
LogsBucket:
Type: AWS::S3::Bucket
Properties:
VersioningConfiguration:
Status: Enabled
見るポイント:
- バケット本体は
AWS::S3::Bucket - バージョニング、暗号化、ライフサイクルは
Propertiesに追加する
IAM Role を作りたいとき¶
Resources:
Ec2Role:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- sts:AssumeRole
見るポイント:
AssumeRolePolicyDocumentが信頼ポリシー- 何に assume させるかを
Principalに書く
Outputs でよく返すもの¶
Outputs:
VpcId:
Value: !Ref MainVpc
PublicSubnetId:
Value: !Ref PublicSubnetA
InstanceId:
Value: !Ref WebInstance
BucketName:
Value: !Ref LogsBucket
どう育てるか¶
- Parameters で最小限の差分だけ受ける
- まずは単体リソースの基本形を作る
- 使うたびに Outputs やタグを整える
まず揃えたい雛形¶
- VPC と Subnet の最小構成
- EC2 と Security Group
- 暗号化付き S3
- IAM Role と AssumeRolePolicy
公式ドキュメント¶
- CloudFormation template anatomy: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html
- CloudFormation StackSets: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html
- CloudFormation resource and property reference: https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html
メモ¶
- 実際のテンプレートは、使ったものから順に育てる方針でよい
- CloudFormation は YAML が長くなりやすいので、まずは短い雛形から残したい
- 個別サービスの要件は、まず
TypeとPropertiesのどこを見るかが分かればかなり追いやすくなる