AWS CloudFormationの使い方/サンプルを紹介

本サイトは広告収入およびアフィリエイト収益を受けております。

スポンサーリンク
スポンサーリンク

お疲れ様です。きざきまるおです。

今回は個人的な備忘録として、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

それではまた。

タイトルとURLをコピーしました