CloudFormationを使用したWeb3層構成のWordPress環境を作成してみた!【WebApサーバー編:起動テンプレート、EC2】

AWS

はじめに

今回は、前回に引き続きCloudFormationを使用してWeb3層構成のWordPress環境を作成していきます。
この記事では、WebApサーバーの役割を担うEC2を構築するための起動テンプレートとEC2の作成に焦点を当てます。以降の回でも、それらを組み合わせてWordPress環境を構築を進めていきます。

ただここで一つ注意しておくこととして、必ずしも、EC2と併せて起動テンプレートを作成する必要はありません。

ですが、今回、起動テンプレートを作成しておく理由としては、今後、オートスケーリングなどでEC2を自動増減させたい場合などに、起動するEC2にインストールしておきたいパッケージなどをユーザデータ(起動時に実行するスクリプト)に設定しておくことで、テンプレート化しておけるためです。

また、例によって、CloudFormationとは何かについて簡単に説明します。CloudFormationは、AWSリソースのプロビジョニングと管理を自動化するためのサービスです。
テキストベースのテンプレートを使用して、ネットワーク、データベース、アプリケーションサービスなどのAWSリソーススタックをモデル化し、それらを一貫した方法でプロビジョニングと管理できます。

CloudFormationテンプレートは以下を参考に作成していきます。

AWS::EC2::LaunchTemplate - AWS CloudFormation
Specifies the properties for creating a launch template.
AWS::EC2::Instance - AWS CloudFormation
Specifies an EC2 instance.

構成図

関連記事

CloudFormationで構築

CloudFormationテンプレートは以下にございます。
ダウンロードしてデスクトップなど任意のフォルダに保存します。

GitHub - kosments/wp-project
Contribute to kosments/wp-project development by creating an account on GitHub.

CloudFormation:YAMLテンプレートのポイント

YAMLテンプレートのポイントを記述します。

  • LaunchTemplate:EC2インスタンスの起動テンプレートを作成します。この起動テンプレートは、指定されたキーペア、AMI ID、インスタンスタイプ、IAMインスタンスプロファイルを使用します。また、ネットワークインターフェースとタグ仕様も設定されています。
  • KeyName:SSH接続に使用するキーペアの名前を指定します。
  • ImageId:EC2インスタンスに使用するAmazon Machine Image (AMI)のIDを指定します。
  • InstanceType:EC2インスタンスのタイプを指定します。この例ではt2.microが使用されています。
  • IamInstanceProfile:EC2インスタンスに関連付けるIAMインスタンスプロファイルのARNを指定します。
  • NetworkInterfaces:EC2インスタンスのネットワークインターフェース設定を指定します。この例では、パブリックIPアドレスの関連付け、デバイスインデックス、サブネットID、セキュリティグループが設定されています。
  • TagSpecifications:EC2インスタンスに適用するタグを指定します。
  • UserData:EC2インスタンスの起動時に実行するコマンドを指定します。この例では、シェルスクリプトがBase64エンコードされて指定されています。このシェルスクリプトは、必要なパッケージのインストール、Apache HTTPサーバーの起動、WordPressの設定ファイル(wp-config.php)の作成と更新などを行います。
Resources:
  # ------------------------------ #
  # LaunchTemplate
  # ------------------------------ #
  MyLaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: !Join ['-', [!Ref Env, !Ref ResourceName, 'launchtemplate']]
      LaunchTemplateData:
        KeyName: !Ref Keypair
        ImageId: ami-06fdbb60c8e83aa5e
        InstanceType: t2.micro
        IamInstanceProfile:
          Arn: !GetAtt Ec2InstanceProfile.Arn
        NetworkInterfaces: 
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          SubnetId: !Ref SubnetId
          Groups:
            - !ImportValue WpEC2SecurityGroup
        TagSpecifications:
        - ResourceType: instance
          Tags:
          - Key: Name
            Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'ec2-webap-server']]
        UserData: 
          Fn::Base64: |
            #!/bin/bash
            # Set variables
            aws configure set region ap-northeast-1
            DB_NAME_PARAM="/wordpress/WP_DB_NAME"
            DB_USER_PARAM="/wordpress/WP_DB_USER"
            DB_PASSWORD_PARAM="/wordpress/WP_DB_PASSWORD"
            DB_HOST_PARAM="/wordpress/WP_DB_HOST"
            EFS_ID_PARAM="/wordpress/EFS_ID"
            EFS_ID=$(aws ssm get-parameter --with-decryption --name $EFS_ID_PARAM --query "Parameter.Value" --output text)
            WEB_ROOT="/var/www/html/"
            WP_CONFIG_SAMPLE="$WEB_ROOTwp-config-sample.php"
            WP_CONFIG="$WEB_ROOTwp-config.php"

            yum -y update
            amazon-linux-extras install php7.2 -y
            yum -y install mysql httpd php-mbstring php-xml gd php-gd
            systemctl enable httpd.service
            systemctl start httpd.service
            systemctl status httpd.service
            wget http://ja.wordpress.org/latest-ja.tar.gz ~/
            tar zxvf /latest-ja.tar.gz
            yum -y install amazon-efs-utils
            # mount -t efs $EFS_ID $WEB_ROOT
            cp -r /wordpress/* $WEB_ROOT
            chown apache:apache -R /var/www/html
            cd /var/www/html

            # Get parameter values from SSM Parameter Store
            DB_NAME=$(aws ssm get-parameter --name $DB_NAME_PARAM --query "Parameter.Value" --output text)
            DB_USER=$(aws ssm get-parameter --with-decryption --name $DB_USER_PARAM --query "Parameter.Value" --output text)
            DB_PASSWORD=$(aws ssm get-parameter --with-decryption --name $DB_PASSWORD_PARAM --query "Parameter.Value" --output text)
            DB_HOST=$(aws ssm get-parameter --with-decryption --name $DB_HOST_PARAM --query "Parameter.Value" --output text)

            # Copy wp-config-sample.php to wp-config.php
            cp $WP_CONFIG_SAMPLE $WP_CONFIG

            # Update wp-config.php file
            sed -i -e "s/define( 'DB_NAME', '.*' );/define('DB_NAME', '$DB_NAME');/" $WP_CONFIG
            sed -i -e "s/define( 'DB_USER', '.*' );/define('DB_USER', '$DB_USER');/" $WP_CONFIG
            sed -i -e "s/define( 'DB_PASSWORD', '.*' );/define('DB_PASSWORD', '$DB_PASSWORD');/" $WP_CONFIG
            sed -i -e "s/define( 'DB_HOST', '.*' );/define('DB_HOST', '$DB_HOST');/" $WP_CONFIG

スタックの作成

早速、CloudFormationを使用してリソースを作成していきます。
手順は、以下の通りで、リンクにも詳細がございます。

  1. CloudFormation画面を開きスタックの作成>新しいソースを使用(標準)を選択
  2. テンプレートの準備完了>テンプレートファイルのアップロードを選択して、保存したymlを選択
  3. スタックに任意の名称を入力して、パラメータは環境に合わせて変更>次へを選択。※後述の手順に従う場合、デフォルト値でOK
  4. スタックオプションは特に変更せず、次へを選択
  5. レビュー画面を確認して送信を選択

スタックが以下の通り作成されました。
また、リソースタブから各リソースのコンソールにアクセスでき、実際に作成されていることが確認できました。

まとめ

今回は、起動テンプレートの構築を進めました。
次回から、実際にEC2にアクセスしたり、WordPressにログインしてみたいと思います!
最後までご覧いただきありがとうございました。

コメント

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