スポンサーリンク

AWSのCloudFormationでWordPressを構築するテンプレートを修正する2

前回に引き続きCloudFormationのWordPressを構築するテンプレートのカスタマイズを行っています。
前回の記事のまとめに記載したボリュームサイズ、インストールディレクトリ名の設定とHTTPSの対応を行いました。

EC2のボリュームサイズ、ボリュームタイプを設定するパラメータを追加

WebServerのルートボリュームについてボリュームサイズとボリュームタイプ(gp2:SSD、standard:HDD)を設定できるようパラメータを追加してみました。
以下は変更箇所だけ抜粋したソースになります。

{
    "Parameters": {
+        "WebServerVolumeSize": {
+            "Description": "input EC2 volume size(min:8GB, max:1024GB)",
+            "Type": "Number",
+            "MinValue": "8",
+            "MaxValue": "1024",
+            "Default": "8"
+        },
+        "WebServerVolumeType": {
+            "Description": "select EC2 volume type (gp2:SSD, standard:HDD)",
+            "Type": "String",
+            "Default": "standard",
+            "AllowedValues": [
+                "gp2",
+                "standard"
+            ]
+        },
    },
    "Resources": {
        "WebServer": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
+                "BlockDeviceMappings": [
+                    {
+                        "DeviceName": "/dev/xvda",
+                        "Ebs": {
+                            "DeleteOnTermination": "true",
+                            "VolumeSize": {
+                                "Ref": "WebServerVolumeSize"
+                            },
+                            "VolumeType": {
+                                "Ref": "WebServerVolumeType"
+                            }
+                        }
+                    }
+                ],
+            },
        }
    },
    "Metadata": {
        "AWS::CloudFormation::Interface": {
            "ParameterGroups": [
                {
                    "Label": {
                        "default": "Instance Setting"
                    },
                    "Parameters": [
                        "InstanceType",
-                        "AccessAllowIP",
-                        "KeyName"
+                        "WebServerVolumeType",
+                        "WebServerVolumeSize"
                    ]
                },
                {
                    "Label": {
                        "default": "Database Setting"
                    },
                    "Parameters": [
                        "DBName",
                        "DBUser",
                        "DBPassword",
                        "DBRootPassword"
                    ]
                },
+                {
+                    "Label": {
+                        "default": "Other Setting"
+                    },
+                    "Parameters": [
+                        "AccessAllowIP",
+                        "KeyName"
+                    ]
+                }
            ]
        }
    }
}
  • ParametersセクションにWebServerVolumeSize、WebServerVolumeTypeというパラメータを追加
    • 指定可能なボリュームサイズは最小8GB、最大1024GBにしました
    • 指定可能なボリュームタイプはgp2とstandardのみとしました
      • 他にio1、st1、sc1が設定可能な模様(io1はIopsっていうパラメータが必要)
  • ResourcesセクションのWebServerリソースのプロパティでルートボリューム(/dev/xvda)のボリュームサイズとボリュームタイプを設定しました
  • Metadataセクションでパラメータの並び順を変更
    • アクセス元を制限するパラメータとアクセス可能なキーを指定するパラメータは新たに「Other Setting」というグループを作成してそちらに移動しました

インストールディレクトリ名を設定するパラメータを追加

WordPressはデフォルトでは/var/www/html/wordpressにインストールされアクセスする際も
http://[EC2PublicDNS]/wordpress
のようなURLとなっていましたが、実際に運用する際はwordpressっていうディレクトリ名は入ってないことが望ましいことが多いかと思います。サブディレクトリにインストールするにしてもblogだとかcompanyだとか自由に命名できた方が良いかと思うので今回はパラメータで自由に設定できるようにしてみました。

  • 入力が空の場合は/var/www/html直下にインストールする
    • ブラウザによるWordPressへのアクセスURL
      http://[EC2PublicDNS]/
  • 入力がある場合は/var/www/html/wordpressをリネームする
    • ブラウザによるWordPressへのアクセスURL
      http://[EC2PublicDNS]/[インストールディレクトリ名]

以下変更点を抜粋したものです。

{
    "Parameters": {
+        "WordPressInstallDirectoryName": {
+            "Description": "enter WordPress install directory name. If not entered, it will be installed directly under /var/www/html",
+            "Type": "String",
+            "Default": "wordpress"
+        },
    },
+    "Conditions": {
+        "WordPressInstallDirectoryNameIsEmpty": {
+            "Fn::Equals": [
+                {
+                    "Ref": "WordPressInstallDirectoryName"
+                },
+                ""
+            ]
+        },
+        "WordPressInstallDirectoryNameIsDefault": {
+            "Fn::Equals": [
+                {
+                    "Ref": "WordPressInstallDirectoryName"
+                },
+                "wordpress"
+            ]
+        }
+    },
    "Resources": {
        "WebServer": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "install_wordpress": {
                        "files": {
                            "/tmp/create-wp-config": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "#!/bin/bash -xe\n",
-                                            "cp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php\n",
+                                            "cd /var/www/html\n",
+                                            "\n",
+                                            "# wordpress move\n",
+                                            {
+                                                "Fn::If": [
+                                                    "WordPressInstallDirectoryNameIsEmpty",
+                                                    {
+                                                        "Fn::Join": [
+                                                            "",
+                                                            [
+                                                                "mv wordpress/* ./\n",
+                                                                "rm -fR wordpress/\n"
+                                                            ]
+                                                        ]
+                                                    },
+                                                    {
+                                                        "Fn::Join": [
+                                                            "",
+                                                            [
+                                                                {
+                                                                    "Fn::If": [
+                                                                        "WordPressInstallDirectoryNameIsDefault",
+                                                                        "",
+                                                                        {
+                                                                            "Fn::Join": [
+                                                                                "",
+                                                                                [
+                                                                                    "mv wordpress ",
+                                                                                    {
+                                                                                        "Ref": "WordPressInstallDirectoryName"
+                                                                                    },
+                                                                                    "\n"
+                                                                                ]
+                                                                            ]
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                "cd ",
+                                                                {
+                                                                    "Ref": "WordPressInstallDirectoryName"
+                                                                },
+                                                                "\n"
+                                                            ]
+                                                        ]
+                                                    }
+                                                ]
+                                            },
+                                            "\n",
+                                            "# create wp-config.php\n",
                                            "cp wp-config-sample.php wp-config.php\n",
                                            "sed -i \"s/'database_name_here'/'",
                                            {
                                                "Ref": "DBName"
                                            },
                                            "'/g\" wp-config.php\n",
                                            "sed -i \"s/'username_here'/'",
                                            {
                                                "Ref": "DBUser"
                                            },
                                            "'/g\" wp-config.php\n",
                                            "sed -i \"s/'password_here'/'",
                                            {
                                                "Ref": "DBPassword"
                                            },
                                            "'/g\" wp-config.php\n",
                                            "\n",
                                            "# salt change\n",
                                            "SALTS=$(curl -s https://api.wordpress.org/secret-key/1.1/salt/)\n",
                                            "while read -r SALT; do\n",
                                            "SEARCH=\"define('$(echo \"$SALT\" | cut -d \"'\" -f 2)\"\n",
                                            "REPLACE=$(echo \"$SALT\" | cut -d \"'\" -f 4)\n",
                                            "sed -i \"/^$SEARCH/s/put your unique phrase here/$(echo $REPLACE | sed -e 's/\\\\/\\\\\\\\/g' -e 's/\\//\\\\\\//g' -e 's/&/\\\\\\&/g')/\" wp-config.php\n",
                                            "done <<< \"$SALTS\"\n",
                                            "\n",
                                            "# apache setting\n",
-                                            "chown -R apache: /var/www/html/wordpress\n"
+                                            "chown -R apache: .\n"
                                        ]
                                    ]
                                },
                                "mode": "000500",
                                "owner": "root",
                                "group": "root"
                            }
                        },
                    },
                    "configure_wordpress": {
                        "commands": {
                            "03_configure_wordpress": {
                                "command": "/tmp/create-wp-config",
-                                "cwd": "/var/www/html/wordpress"
+                                "cwd": "~"
                            }
                        }
                    }
                }
            },
        }
    },
    "Outputs": {
        "WebsiteURL": {
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        "http://",
                        {
                            "Fn::GetAtt": [
                                "WebServer",
                                "PublicDnsName"
                            ]
                        },
-                        "/wordpress"
+                        "/",
+                        {
+                            "Ref": "WordPressInstallDirectoryName"
+                        }
                    ]
                ]
            },
            "Description": "WordPress Website"
        },
    },
    "Metadata": {
        "AWS::CloudFormation::Interface": {
            "ParameterGroups": [
                {
                    "Label": {
                        "default": "Instance Setting"
                    },
                    "Parameters": [
                        "InstanceType",
                        "WebServerVolumeType",
                        "WebServerVolumeSize",
+                        "WordPressInstallDirectoryName"
                    ]
                },
            ]
        }
    }
}

ネストが深すぎてわかりづらくなってしまったので以下のGitHubの差分を見ていただく方がわかりやすいと思います。

WordPressのインストールディレクトリを設定可能なパラメータを追加(未入力のとき/var/www/html直下にインストールするよう条件分岐)
imo-tikuwa/aws-cloudformation-templates@861a82c · GitHub
インストールディレクトリ名がデフォルト値(wordpress)のままだとmvコマンドでエラー起こしてたのを修正
imo-tikuwa/aws-cloudformation-templates@c0e375e · GitHub

やっていることは大体以下のような感じ。wordpressと明示的に指定していた箇所はすべて修正する必要があります。

  • Parametersセクションにインストールディレクトリ名を指定するパラメータを追加
  • Conditionsセクションを新規作成、インストールディレクトリ名が空かどうかの条件式と入力値が初期値と一致しているかどうかの条件式を追加
  • Resourcesセクションでwp-config.phpを作成するbashスクリプト内に追記
    • インストールディレクトリ名が空の場合とそうでない場合で必要なコマンドが変わるのでFn::Ifで分岐する
    • 分岐に新規作成したインストールディレクトリ名が空かどうかの条件式を使用する
    • インストールディレクトリ名が空でないとき、かつ初期値の「wordpress」が入力されている場合、mvコマンドでエラーが起きてしまうのでさらに分岐させる
  • Outputsセクションで出力するURLについてもインストールディレクトリ名を参照するよう修正
  • MetadataセクションでInstance Settingグループの末尾に新規作成したパラメータを追加

HTTPS対応

AmazonLinuxなのでインストールされてるhttpd2.4に対応するSSL関連のプログラムをインストールするだけ。
ブラウザでアクセスするにはセキュリティグループの追加が必要です。sshやhttpと同様にアクセス制限用のIPアドレスのパラメータを使用しました。
OutputsセクションのWebsiteURLもhttpsに変更しました。

{
    "Resources": {
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "SecurityGroup created by CloudFormation",
                "SecurityGroupIngress": [
+                    {
+                        "IpProtocol": "tcp",
+                        "FromPort": "443",
+                        "ToPort": "443",
+                        "CidrIp": {
+                            "Ref": "AccessAllowIP"
+                        }
+                    },
                ]
            }
        },
        "WebServer": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "install_wordpress": {
                        "packages": {
                            "yum": {
                                "php73": [],
                                "php73-mbstring": [],
                                "php73-mysqlnd": [],
                                "php73-gd": [],
                                "mysql57": [],
                                "mysql57-server": [],
                                "mysql57-devel": [],
                                "mysql57-libs": [],
-                                "httpd24": []
+                                "httpd24": [],
+                                "mod24_ssl": []
                            }
                        },
                    },
                }
            },
        }
    },
    "Outputs": {
        "WebsiteURL": {
            "Value": {
                "Fn::Join": [
                    "",
                    [
-                        "http://",
+                        "https://",
                        {
                            "Fn::GetAtt": [
                                "WebServer",
                                "PublicDnsName"
                            ]
                        },
                        "/",
                        {
                            "Ref": "WordPressInstallDirectoryName"
                        }
                    ]
                ]
            },
        },
    },
}

動作確認1 – インストールディレクトリ名が空のパターン

4分くらいで構築が完了することを確認しました。

パラメータタブに新規追加した3つのパラメータ(WebServerVolumeSize、WebServerVolumeType、WordPressInstallDirectoryName)が表示されてることを確認しました。
今回、インストールディレクトリ名のパラメータは空としました。

インストールディレクトリ名が空のとき、出力タブのWebsiteURLが意図した形式となっていることを確認しました。

EC2のボリュームについて確認しました。
スタック作成時の入力内容でボリュームサイズとボリュームタイプが設定されていることを確認しました。

SSHクライアントで接続して/var/www/html以下を確認しました。
/var/www/html以下に展開されていること、インストールディレクトリ名が未入力のためFn::Ifの分岐で真の方の値が出力されてることを確認しました(赤枠部分)。

管理画面から記事を更新し動作確認しました。

動作確認2 – インストールディレクトリ名が空でないパターン

こちらも構築は4分くらいでした。
インストールディレクトリ名には例として「tikuwa-blog」と入力しました。
また、ルートボリュームのサイズをデフォルトの8GBから12GBにしてみました。

インストールディレクトリ名が空でないとき、出力タブのWebsiteURLが意図した通りの形式で出力されてることを確認しました。

EC2のボリューム一覧画面より対象のインスタンスに紐づくボリュームのサイズが12GB、タイプがgp2になっていることを確認しました。

動作確認1と同様にSSHクライアントで接続して/var/www/html以下を確認しました。
/var/www/html以下にはtikuwa-blogディレクトリしか存在しないこと、インストールディレクトリ名が「tikuwa-blog」のためFn::Ifの分岐で偽の方の値が出力されてることを確認しました(赤枠部分)。
インストールディレクトリ名の入力値がデフォルトの「wordpress」ではないためmvによるリネームコマンドも含まれていることを確認しました(赤枠部分)。

管理画面から記事を更新し動作確認しました。

その他

おそらくyum updateを入れてしまったことが原因で動作検証の時間が微妙に長くなってしまったものと思われる。
入れるにしても最後でよかったかも…(^^;

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