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

はじめに

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

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

テンプレートの全体像

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

デプロイされるリソース

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

以下のイメージはCloudFormation Designerを用いて生成したものである。

テンプレートファイル

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

Description:
  This template builds EFS for WordPress.

Parameters:
  WordPressEFSSecurityGroup:
    Type: String
    Description   : Please enter VPC Security Group ID for EFS.
  WordPressPrivateSubnet1:
    Type: String
    Description   : Please enter VPC private subnet1 for MountTarget.
  WordPressPrivateSubnet2:
    Type: String
    Description   : Please enter VPC private subnet2 for MountTarget.

Resources:
  WordPressEFS:
    Type: AWS::EFS::FileSystem
  WordPressEFSMountTarget1:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId   : !Ref WordPressEFS
      SecurityGroups :
        - !Ref WordPressEFSSecurityGroup
      SubnetId       : !Ref WordPressPrivateSubnet1
  WordPressEFSMountTarget2:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId   : !Ref WordPressEFS
      SecurityGroups :
        - !Ref WordPressEFSSecurityGroup
      SubnetId       : !Ref WordPressPrivateSubnet2

Outputs:
  WordPressEFS:
    Value: !Ref WordPressEFS

Parameters

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

テンプレートでは以下の記述が該当箇所となる。

Parameters:
  WordPressEFSSecurityGroup:
    Type: String
    Description   : Please enter VPC Security Group ID for EFS.
  WordPressPrivateSubnet1:
    Type: String
    Description   : Please enter VPC private subnet1 for MountTarget.
  WordPressPrivateSubnet2:
    Type: String
    Description   : Please enter VPC private subnet2 for MountTarget.

本記載の詳細については第2回を参照いただきたい。

Resources

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

AWSリソースType
EFSAWS::EFS::FileSystem
Mount TargetAWS::EFS::MountTarget

EFS FileSystem

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

Resources:
  WordPressEFS:
    Type: AWS::EFS::FileSystem
記載内容目的
WordPressEFSリソース名に任意の文字列を指定する。
Type: AWS::EFS::FileSystemデプロイするリソースタイプにEFSのFileSystem指定する。

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

「WordPressEFS(任意の文字列)」という名前でEFSのFileSystemをデプロイする。

Mount Target

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

Resources:
<中略>
  WordPressEFSMountTarget1:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId   : !Ref WordPressEFS
      SecurityGroups :
        - !Ref WordPressEFSSecurityGroup
      SubnetId       : !Ref WordPressPrivateSubnet1
<後略>
記載内容目的
WordPressEFSMountTarget1リソース名に任意の文字列を指定する。
Type: AWS::EFS::MountTargetデプロイするリソースタイプにEFSのMount Targetを指定する。
Propertiesリソースをデプロイする際のオプションを指定する。
FileSystemIdMount Targetの接続先となるEFS FileSystemを指定する。
SecurityGroupsMount Targetに関連付けるSecurity Groupを指定する。
SubnetIdMount Targetを接続するVPC Subnetを指定する。

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

「WordPressEFS(FileSystemId)」へ接続できるMount Targetを「Private Subnet1(SubnetId)」にデプロイし、「WordPressEFSMountTarget1(任意の文字列)」という名前を付ける。Mount Targetには「EFS用のSecurity Group(SecurityGroups)」を関連付け、接続元をAPサーバに限定する。

Outputs

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

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

Outputs:
  WordPressEFS:
    Value: !Ref WordPressEFS
記載内容目的
WordPressEFS出力値に任意の名前を指定する。
Value出力値を指定する。
!Ref WordPressEFSWordPressEFSの情報を取得する。

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

「WordPressEFS(任意の文字列)」という名前で、「WordPressEFSのID(!Ref WordPressEFS)」を公開する。

おわりに

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