AMIMOTO AMIのSSLドメインとかWordPress情報を収集するEC2 Systems Manger Documentを作ってみた

AMIMOTO AMIって、wp-setupでインスタンス内にvhostとしてWordPress追加できて便利ですよね。

アクセス数の少ないサイトとかであれば、5〜10サイトくらいを1つのインスタンスにまとめて詰め込んじゃうという横着もできないことはないですし。(*なお、PV数とインスタンスタイプの目安に書かれてる数を超えたらサーバー落ちやすくなるかもなんで要注意です)

ただいろいろ詰め込んでると、どのサーバーにどのWordPressが入っていて、それぞれのバージョンが今何になってるかとか確認するのがだんだん面倒になってくるんですよね。

EC2 Systems Manager使ったら、この辺りの情報収集をよしなにできそうだったので、ドキュメントを作ってみました。

ソースコード

AMIMOTO Systems Management documents
EC2 Systems Managerで使用するためのドキュメントを作るCloudFormationと、作成したドキュメントの中で実行するシェルスクリプトが用意されています。

事前準備:EC2 Systems Managerエージェントのインストール

EC2 Systems Managerはインスタンス内にエージェントを置いて、そこと通信しながらコマンドを実行します。なので先にエージェントをインストールする必要があります。

このあたりは公式にドキュメント載ってるので、このあたり見ながらやってください。
Amazon EC2 Systems Manager » ユーザーガイド » Systems Manager のセットアップ » SSM エージェントのインストール

セットアップ

CloudFormationでドキュメントを一気に作れます。

$ CURRENT=$(pwd)
$ aws cloudformation create-stack --stack-name YOUR_STACK_NAME --template-body file:///${CURRENT}/ssm_documents.yml

作成に成功すると、以下の3ドキュメントが利用できるようになります。

$ aws ssm list-documents --document-filter-list key=Name,value=YOUR_STACK_NAME
{
    "DocumentIdentifiers": [
        {
            "Name": "YOUR_STACK_NAME-CustomApplications-XXXXXXXXXXXX",
            "PlatformTypes": [
                "Linux"
            ],
            "DocumentVersion": "1",
            "DocumentType": "Command",
            "Owner": "999999999999",
            "SchemaVersion": "1.2"
        },
        {
            "Name": "YOUR_STACK_NAME-GetAllWpVersion-XXXXXXXXXXXX",
            "PlatformTypes": [
                "Linux"
            ],
            "DocumentVersion": "1",
            "DocumentType": "Command",
            "Owner": "999999999999",
            "SchemaVersion": "1.2"
        },
        {
            "Name": "YOUR_STACK_NAME-ListNginxDomains-XXXXXXXXXXXX",
            "PlatformTypes": [
                "Linux"
            ],
            "DocumentVersion": "1",
            "DocumentType": "Command",
            "Owner": "999999999999",
            "SchemaVersion": "1.2"
        }
    ]
}

それぞれ以下のような動きをします。

Name できること
YOUR_STACK_NAME-CustomApplications-XXXXXXXXXXXX yumのセキュリティーアップデート数やWP-CLIのバージョンを収集する
YOUR_STACK_NAME-GetAllWpVersion-XXXXXXXXXXXX /var/www/配下にインストールされている全WordPressの情報を収集する
YOUR_STACK_NAME-ListNginxDomains-XXXXXXXXXXXX SSL設定済みのドメインを/etc/nginx/conf.d/配下から収集する

コマンドの実行

以下のようにAWS-CLIから実行することができます。

$ aws ssm send-command --instance-ids  YOUR_INSTANCE_ID --document-name YOUR_STACK_NAME-CustomApplications-XXXXXXXXXXXX
{
    "Command": {
        "Comment": "", 
        "Status": "Pending", 
        "MaxErrors": "0", 
        "Parameters": {}, 
        "ExpiresAfter": 1492063647.592, 
        "ServiceRole": "", 
        "DocumentName": "YOUR_STACK_NAME-CustomApplications-XXXXXXXXXXXX", 
        "TargetCount": 1, 
        "OutputS3BucketName": "", 
        "NotificationConfig": {
            "NotificationArn": "", 
            "NotificationEvents": [], 
            "NotificationType": ""
        }, 
        "CompletedCount": 0, 
        "Targets": [], 
        "StatusDetails": "Pending", 
        "ErrorCount": 0, 
        "OutputS3KeyPrefix": "", 
        "RequestedDateTime": 1492056447.592, 
        "CommandId": "8027150d-7d0c-4dc5-8140-232e2baeb0e7", 
        "InstanceIds": [
            "YOUR_INSTANCE_ID"
        ], 
        "MaxConcurrency": "50"
    }
}

実行した結果は、EC2 Systems ManagerのInventoryとして保存されます。
AWS-CLIであれば、以下のようにするとインベントリ結果が確認できます。

$ aws ssm list-inventory-entries --instance-id {YOUR_INSTANCE_ID} --type-name "Custom:Application"
{
    "InstanceId": "{YOUR_INSTANCE_ID}", 
    "TypeName": "Custom:Application", 
    "Entries": [
        {
            "yum_security_update_num": "21", 
            "wp_cli_version": "1.1.0", 
            "yum_update_num": "23"
        }
    ], 
    "SchemaVersion": "1.0", 
    "CaptureTime": "2017-04-13T13:07:29Z"
}

[GetAllWpVersion]WordPressの情報を収集する

$ aws ssm send-command --instance-ids  {YOUR_INSTANCE_ID} --document-name YOUR_STACK_NAME-GetAllWpVersion-XXXXXXXXXXXX

上記コマンドを実行すると、その時点でインストール済みのWordPressに関する情報を収集してくれます。

wp-setup実行だけでインストールが完了していないWordPressは省略されますのでご注意ください。

ちなみに実行結果は以下のように確認することができます。

$ aws ssm list-inventory-entries --instance-id {YOUR_INSTANCE_ID} --type-name "Custom:WordPressInformations"
{
    "InstanceId": "{YOUR_INSTANCE_ID}", 
    "TypeName": "Custom:WordPressInformations", 
    "Entries": [
        {
            "home": "http://XX.XX.XX.XXX", 
            "siteurl": "http://XX.XX.XX.XXX", 
            "version": "4.7.3", 
            "wp_directory": "/var/www/vhosts/{YOUR_INSTANCE_ID}/"
        },{
            "home": "http://example.com", 
            "siteurl": "http://example.com", 
            "version": "4.7.3", 
            "wp_directory": "/var/www/vhosts/example.com/"
        }
    ], 
    "SchemaVersion": "1.0", 
    "CaptureTime": "2017-04-13T13:27:59Z"
}

「毎回コマンド実行しなあかんのなら、sshしたらええんちゃうの?」

今回はサンプルとして単発実行させただけで、EC2 Systems ManagerのState Managerを使えば30分間隔とか半日に一回とかのペースで自動的に情報を取得するようにできます。

設定方法はAmazon EC2 Systems ManagerのState Managerをやってみた #reinventとかを見てください。

おわりに

EC2 Systems Managerに情報を突っ込んでおくことで、AWS-CLIやAWS-SDKからインスタンス内の情報を引っ張ってくることができます。
デフォルトで用意されているドキュメントと組み合わせてインスタンス情報を収集させておくと、いちいちSSH接続しなくても情報を見れて便利かなと思います。

あと、今回は情報を収集するコマンドを実行するドキュメントのみ作りましたが、アップデートを実行するコマンドやパッケージ追加のコマンドをまとめたドキュメントなども作れます。
このあたりうまくドキュメントを用意して、あと少しコード書けば自前のサーバー管理パネル的なものも作れそうですよね。

Follow me!