CloudFormationによるWordPressの自動構築 -RDS編-

はじめに

本記事はCloudFormationによるWordPressの自動構築の第4回記事である。
AWSでIaCを提供するサービスであるCloudFormationを用いて、WordPressを自動構築する。
本記事では、AWS上にWordPressを稼働させるために必要なAmazon Relational Database Service(以後RDS)を自動構築する。
読み進める際には、以下に注意していただきたい。

  • 本記事で掲載するCloudFormationテンプレートでは、WordPressの稼働に必要なプロパティのみを使用している。CloudFormationが提供するプロパティの詳細についてはAWS公式ドキュメントを参照頂きたい。
  • 同様の記述(コード)が連続する箇所は省略して紹介する。
  • 本連載で使用するテンプレートでは、「Resource」「Parameter」「Output」などの任意の文字列を指定できる文字列の先頭に便宜上「WordPress」を付与している。

テンプレートの全体像

まずは、本記事で取り扱うテンプレートの全体像を示す。

デプロイされるリソース

これまでの記事で左図の環境を自動構築している。本記事内では右図のリソースを自動展開する。

以下のイメージはCloudFormation Designerを用いて生成したものである。
※ イメージの生成に際して、テンプレートのMetadataを一部修正している

テンプレートファイル

使用するテンプレートはRDS.ymlである。テンプレート単体でも使用することは可能であるが、WordPress.ymlからネストされたスタックとして使用することでParametersの入力を簡略化可能となっている。

Description:
  This template builds RDS for WordPress.

Parameters:
  WordPressPrivateSubnet1:
    Type: String
    Description   : Please enter VPC private subnet1 for SubnetGroup.
  WordPressPrivateSubnet2:
    Type: String
    Description   : Please enter VPC private subnet2 for SubnetGroup.
  WordPressRDSInstanceClass:
    Type          : String
    Default       : db.t2.small
    AllowedValues :
      - db.t2.micro
      - db.t2.small
      - db.t2.medium
      - db.t2.large
      - db.t2.xlarge
      - db.t2.2xlarge
      - db.m5.large
      - db.m5.xlarge
      - db.m5.2xlarge
      - db.m5.4xlarge
      - db.m5.12xlarge
      - db.m5.24xlarge
      - db.r4.large
      - db.r4.xlarge
      - db.r4.2xlarge
      - db.r4.4xlarge
      - db.r4.8xlarge
      - db.r4.16xlarge
    Description   : Select RDS instance class.
  WordPressRDSDBName:
    Type           : String
    Default        : wordpress
    MinLength      : 1
    MaxLength      : 16
    AllowedPattern : '[a-z]+'
  WordPressRDSMasterUser:
    Type           : String
    Default        : admin
    MinLength      : 1
    MaxLength      : 16
    NoEcho         : true
    AllowedPattern : '[a-z]+'
  WordPressRDSMasterPassword :
    Type           : String
    Default        : password
    MinLength      : 8
    MaxLength      : 16
    NoEcho         : true
    AllowedPattern : '[^\/@"]+'
  WordPressDBSecurityGroup:
    Type: String
    Description   : Please enter VPC Security Group ID for RDS.

Resources:
  WordPressRDSSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: "SubnetGroup for WordPress"
      SubnetIds:
        - !Ref WordPressPrivateSubnet1
        - !Ref WordPressPrivateSubnet2
  WordPressRDSInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      AllocatedStorage   : 20
      DBSubnetGroupName  : !Ref WordPressRDSSubnetGroup
      DBInstanceClass    : !Ref WordPressRDSInstanceClass
      DBName             : !Ref WordPressRDSDBName
      MasterUsername     : !Ref WordPressRDSMasterUser
      MasterUserPassword : !Ref WordPressRDSMasterPassword
      Engine             : MySQL
      MultiAZ            : true
      PubliclyAccessible : false
      StorageType        : gp2
      VPCSecurityGroups  :
        - !Ref WordPressDBSecurityGroup
    DeletionPolicy: Delete

Outputs:
  WordPressRDSEndpoint:
    Value: !GetAtt WordPressRDSInstance.Endpoint.Address

Parameters

Parametersセクションでは、スタック作成時にユーザーに対して求める入力値のルールを定義する。
RDS.ymlでは、ユーザーに対して次の入力値が求められる。

テンプレートでは以下の記述が該当箇所となる。
※ 他のテンプレートで紹介している内容については大幅に割愛している。詳細は第2回を参照いただきたい。

Parameters:
  <中略>
  WordPressRDSInstanceClass:
    Type          : String
    Default       : db.t2.small
    AllowedValues :
      - db.t2.micro
      - db.t2.small
      <中略>
      - db.r4.8xlarge
      - db.r4.16xlarge
    Description   : Select RDS instance class.
  <後略>
記載内容目的
WordPressRDSInstanceClassパラメータ名に任意の文字列を指定する。
TypeString,Number,Listなど、パラメーターのデータ型を指定する。
Defaultユーザーがパラメーターを指定しなかった際の既定値を定義する。
AllowedValues許可する入力値を配列で指定する。
Descriptionユーザーに対してパラメーターを要求する際の説明文を指定する。

この記載をまとめると以下の意味となる。

ユーザーに対して「Select RDS instance class.(Description)」と提示し、「文字列(Type)」を要求する。入力値は「WordPressRDSInstanceClass(任意の文字列)」変数に格納する。管理画面では「管理者側で指定したリスト(AllowedValues)」を提示し、ユーザーが文字列を指定しなかった際には「db.t2.small(Default)」を入力値として扱う。

Resources

Resourcesセクションでは次のリソースを定義する。

AWSリソースType
Subnet GroupAWS::RDS::DBSubnetGroup
RDS DB InstanceAWS::RDS::DBInstance

Subnet Group

Subnet Groupのデプロイでは以下のリソースタイプを使用する。

Resources:
  WordPressRDSSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: "SubnetGroup for WordPress"
      SubnetIds:
        - !Ref WordPressPrivateSubnet1
        - !Ref WordPressPrivateSubnet2
記載内容目的
WordPressRDSSubnetGroupリソース名に任意の文字列を指定する。
Type: AWS::RDS::DBSubnetGroupSubnet Groupをデプロイするリソースタイプを指定する。
Propertiesリソースをデプロイする際のオプションを指定する。
DBSubnetGroupDescriptionSubnet Groupの説明文を指定する。
SubnetIdsSubnet Groupに含めるVPC Subnetを指定する。
!Ref WordPressPrivateSubnet1WordPressPrivateSubnet1の情報を取得する。
!Ref WordPressPrivateSubnet2WordPressPrivateSubnet2の情報を取得する。

この記載をまとめると以下の意味となる。

「WordPressRDSSubnetGroup(任意の文字列)」という名前でSubnet Groupをデプロイする。デプロイしたSubnet Groupには「WordPressPrivateSubnet1とWordPressPrivateSubnet2(SubnetIds)」を関連付け、説明欄に「SubnetGroup for WordPress(DBSubnetGroupDescription)」を指定する。

RDS DB Instance

RDS DB Instanceのデプロイでは以下のリソースタイプを使用する。

Resources:
<中略>
  WordPressRDSInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      AllocatedStorage   : 20
      DBSubnetGroupName  : !Ref WordPressRDSSubnetGroup
      DBInstanceClass    : !Ref WordPressRDSInstanceClass
      DBName             : !Ref WordPressRDSDBName
      MasterUsername     : !Ref WordPressRDSMasterUser
      MasterUserPassword : !Ref WordPressRDSMasterPassword
      Engine             : MySQL
      MultiAZ            : true
      PubliclyAccessible : false
      StorageType        : gp2
      VPCSecurityGroups  :
        - !Ref WordPressDBSecurityGroup
    DeletionPolicy: Delete
記載内容目的
WordPressRDSInstanceリソース名に任意の文字列を指定する。
Type: AWS::RDS::DBInstanceデプロイするリソースタイプにRDSのDB Instanceを指定する。
Propertiesリソースをデプロイする際のオプションを指定する。
AllocatedStorageRDSに割り当てるEBSの容量を指定する。
DBSubnetGroupNameRDSをデプロイするSubnet Groupを指定する。
DBInstanceClassRDSのInstance Class(性能)を指定する。
DBNameRDSに自動作成するデータベース名を指定する。
MasterUsernameRDSに自動作成する管理者ユーザの名前を指定する。
MasterUserPasswordRDSに自動作成する管理者ユーザのパスワードを指定する。
Engineデータベースのエンジンを指定する。
MultiAZMulti AZ(AZ間クラスタ)の利用有無を指定する。
PubliclyAccessibleインターネット経由でのアクセス許否を指定する。
StorageTypeEBSのタイプを指定する。
VPCSecurityGroupsRDSと紐付けるSecurity Groupをリスト形式で指定する。
DeletionPolicyCloudFormationのスタックを削除した際の、リソースの削除動作を指定する。

この記載をまとめると以下の意味となる。

Parametersで指定された情報を基に「WordPressRDSInstance(任意の文字列)」という名前でRDSのDB Instanceを作成する。DB Instanceには「GP2:汎用SSD(StorageType)」のEBSを「20GB(AllocatedStorage)」割り当てる。
DB Instanceには「WordPressDBSecurityGroup(VPCSecurityGroups)」を付与し、DB Instanceに接続可能なインスタンスをAPサーバのみに限定する。加えて、DB Instance故障時に備えてMulti AZ機能を有効化する。

デフォルトでは、DB Instanceのリソース削除時にDB Instanceのスナップショット(バックアップ)が作成される。本記事のテンプレートではスタック削除時の「ゴミ」を最小化するために「DeletionPolicy」に「Delete」を指定し、スナップショットが作成されない実装としている。

Outputs

Outputsセクションでは、スタック内のAWSリソースに関する情報をユーザー、もしくは外部のテンプレートに公開できる。

後続のテンプレートで使用する情報をOutputsセクションに記載する。本セクションに記載した内容は、親のテンプレート(本記事の場合はWordPress.yml)から「RDS.Outputs.WordPressRDSEndpoint」の様に参照する事が可能となる。

Outputs:
  WordPressRDSEndpoint:
    Value: !GetAtt WordPressRDSInstance.Endpoint.Address
記載内容目的
WordPressRDSEndpoint出力値に任意の名前を指定する。
Value出力値を指定する。
!GetAtt WordPressRDSInstance.Endpoint.AddressDB InstanceのEndpoint(DNS名)を取得する。

この記載をまとめると以下の意味となる。

「WordPressRDSEndpoint(任意の文字列)」という名前で、「DB InstanceのEndpoint(!GetAtt WordPressRDSInstance.Endpoint.Address)」を公開する。

他のテンプレートでは!Refを使用しているが、本テンプレートでは!GetAttを用いている。
これは、DB Instanceに対して!Refを用いると、DB InstanceのIDが返却されるためである。後続処理で必要な情報はDB InstanceのIDではなく、Endpoint(DNS名)であるため、!GetAttを使用している。

おわりに

本連載で紹介しているコードは筆者のGitHubでMITライセンスとして公開しているため、適宜流用し活用頂ければ幸いである。
次回は自動構築されたリソース上にAmazon Elastic File Systemを自動構築するテンプレートについて紹介する。