お疲れ様です。きざきまるおです。
今回は個人的な備忘録として、AWSのCloudFormationを試してみたいと思います。
AWS上での環境構築を自動化/汎化したいときにばっちりはまるサービスなのでそんな要望がある方は是非読んでみてください。
それではどうぞ。
CloudFormationとは
JSON、YAMLもしくはプログラミング言語を用いてAWS上での環境構築を自動で行うサービスです。
もちろん、作成したソースはGithub等で管理することもできますし、そのままAWSのCloudFormationに流し込むことで環境構築できるので、とても便利なサービスとなっています。
一方で、CloudFormation特有の記述やAWS環境のイメージ図を文字で表現するなどもあって、学習コストはやや高めとなっています。
テンプレート作成
では早速サンプルコードをいったんすべて貼り付けます。
・main.yml
AWSTemplateFormatVersion: 2010-09-09
Description:
main
Parameters:
EventRuleTemplateURL:
Type: String
Description: Template URL for EventRule
Default: S3に置いたsub.ymlファイルのURL
Resources:
EventRule:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: !Ref EventRuleTemplateURL
パーツごとに解説していきます。
以下部分は決まり文句のようでCloudFormationを記述する際に頭に記述します。
AWSTemplateFormatVersion: 2010-09-09
Description句はテンプレートの名前を記述します。
Description:
main
Parameter句はテンプレート内のリスト変数のようなもので、何度も呼び出される定義を指定することが多いです。
Parameters:
EventRuleTemplateURL:
Type: String
Description: Template URL for EventRule
Default: S3に置いたsub.ymlファイルのURL
最後のResources句は実行部分になります。
main.ymlではParameter句で指定したURLからファイルを持ってきて実行するようにしています。
Resources:
EventRule:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: !Ref EventRuleTemplateURL
・sub.yml
AWSTemplateFormatVersion: "2010-09-09"
Description:
sample
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Label:
default: EC2 Configuration
Parameters:
- AMIId
- KeyName
-
Label:
default: RDS Configuration
Parameters:
- DatabaseName
- MasterUserName
- MasterUserPassword
Parameters:
AMIId:
Description: AMI ID
Type : String
Default: ami-0329eac6c5240c99d
KeyName:
Description: key pair name
Type: String
Default: キーペア名
DatabaseName:
Description: Database Name
Type : String
Default: mydb
MasterUserName:
Description: Master User Name
Type : String
Default: mysqluser
MasterUserPassword:
Description: Master User Password
Type : String
Default: mysqlpassword
Resources:
# ------------------------------------------------------------#
# EC2
# ------------------------------------------------------------#
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref AMIId
KeyName: !Ref KeyName
InstanceType: t2.micro
NetworkInterfaces:
- AssociatePublicIpAddress: "true"
DeviceIndex: "0"
SubnetId: サブネットID
GroupSet:
- セキュリティグループID
BlockDeviceMappings:
- DeviceName: '/dev/xvda'
Ebs:
VolumeType: gp3
VolumeSize: 10
DeleteOnTermination: "true"
Tags:
- Key: Name
Value: test
# ------------------------------------------------------------#
# RDS
# ------------------------------------------------------------#
Database:
Type: AWS::RDS::DBInstance
Properties:
AllocatedStorage: 20
AllowMajorVersionUpgrade: false
AutoMinorVersionUpgrade: false
AvailabilityZone: ap-northeast-1a
BackupRetentionPeriod: 0
DBInstanceClass: db.t3.micro
DBInstanceIdentifier: test-mysql
DBName: !Ref DatabaseName
DBSubnetGroupName: サブネットグループ名
DeleteAutomatedBackups: true
DeletionProtection: false
Engine: mysql
EngineVersion: 8.0.28
MasterUsername: !Ref MasterUserName
MasterUserPassword: !Ref MasterUserPassword
MaxAllocatedStorage: 500
MultiAZ: false
PubliclyAccessible: false
StorageEncrypted: false
StorageType: gp2
Tags:
- Key: Name
Value: MYSQL-RDS
VPCSecurityGroups:
- セキュリティグループID
先ほど紹介した内容は省略してまたパーツごと解説していきます。
Metadata句はParameter句で設定した内容をグルーピングします。
なぜグルーピングが必要かというと、CloudFormationへこのファイルを流し込んだ時、Parameterの中身がアルファベット順で並んでおり、設定変更時に手動で入力する際に非常にわかりづらいため、こちらでグルーピングするようにしています。
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Label:
default: EC2 Configuration
Parameters:
- AMIId
- KeyName
-
Label:
default: RDS Configuration
Parameters:
- DatabaseName
- MasterUserName
- MasterUserPassword
それではまた。