このブログは、t2.microを利用しているのですが、t2.nanoでもいいんじゃないかと思っています。しかしながら、リソースの使用率などをモニタリングしているワケではなかったので判断材料のために、Cloudwatchでモニタリングを追加しました。

Cloudwatchで出来るEC2モニタリング

Cloudwatchは、メトリクスと呼ばれる単位でモニタリングすることができますが、Cloudwatchでそのままモニタリング出来るもの、EC2インスタンスから値をputしないと出来ないものがあります。詳細はマニュアルをご覧いただきたいと思いますが、ざっくりは下記のとおりです。

そのまま利用可 EC2からputが必要
CPU使用率
メモリ使用率
使用中のメモリ
利用可能なメモリ
ネットワーク使用率
ディスクパフォーマンス
ディスクスワップ使用率
ページファイル使用率
ディスク読み書き
ディスクスペースの使用率
使用ディスクスペース
利用可能なディスクスペース

メモリモニタリングの追加

前述のとおり、CPU使用率はCloudwatchの標準メトリクスに含まれているので、すぐに利用可能です。今回は、EC2側での作業が必要となるメモリモニタリングについて記載しています。流れは、こちらのマニュアルを参考にしました。

前提条件の準備

私の環境はubuntuでしたので、apt-getコマンドでインストールしています。

$ sudo apt-get update
$ sudo apt-get install unzip
$ sudo apt-get install libwww-perl libdatetime-perl

スクリプトのダウンロード、設定

以下の手順で、EC2 Linuxインスタンスで CloudWatch Monitoring Scripts のダウンロード、設定を行います。

1.展開するフォルダへ移動し、curlコマンドでダウンロードする。

$ cd /usr/local/bin
$ sudo curl http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip -O

2.圧縮ファイルを展開する

$ sudo unzip CloudWatchMonitoringScripts-1.2.1.zip
$ rm CloudWatchMonitoringScripts-1.2.1.zip

3.IAMロールもしくは、通知用アカウントのIAMポリシーに以下を追加します。私の環境では、EC2インスタンスにIAMロールを割り当てていなかったので、Cloudwatch通知用のIAMユーザー、ポリシーを作成しました。

  • cloudwatch:PutMetricData
  • cloudwatch:GetMetricStatistics
  • cloudwatch:ListMetrics
  • ec2:DescribeTags
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics",
                "cloudwatch:PutMetricData"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeTags"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

4.IAMロールを使用しない場合は、先程展開したディレクトリ以下に、awscreds.templateというファイルがありますので、こちらに通知用アカウントのアクセスキー、シークレットキーを記載します。(すでにAWSCLIなどによって、認証情報ファイルを持っている場合は、この手順は不要です)

$ cd aws-scripts-mon
$ vi awscreds.template
AWSAccessKeyId=<アクセスキーIDを記入>
AWSSecretKey=<シークレットキーを記入>

環境変数「AWS_CREDENTIAL_FILE」に認証情報ファイルのパスを定義します。(Cloudwatch通知のスクリプトに埋め込んでも構いません)

$ vi /etc/environment
AWS_CREDENTIAL_FILE=’/usr/local/bin/aws-scripts-mon/awscreds.template’
$ . /etc/environment

5.以下のコマンドでテストランします。(CloudwatchにはデータをPUTしません)

$ ./mon-put-instance-data.pl –mem-util –verify –verbose
MemoryUtilization: 42.2460208756435 (Percent)
Using AWS credentials file </usr/local/bin/aws-scripts-mon/awscreds.template>
Endpoint: https://monitoring.ap-northeast-1.amazonaws.com
Payload: {“MetricData”:[{“Value”:42.2460208756435,”Unit”:”Percent”,”Dimensions”:[{“Name”:”InstanceId”,”Value”:”i-03233e9c”}],”MetricName”:”MemoryUtilization”,”Timestamp”:1483670489}],”Namespace”:”System/Linux”,”__type”:”com.amazonaws.cloudwatch.v2010_08_01#PutMetricDataInput”}

Verification completed successfully. No actual metrics sent to CloudWatch.

6.cronに登録し、定期的にCloudwatchへ通知を行います。以下の例では5分毎に、ディスクスペース、メモリ使用率、メモリ使用量、メモリ使用可能量を通知しています。

crontab -e
*/5 * * * * /usr/local/bin/aws-scripts-mon/mon-put-instance-data.pl –mem-util –mem-used –mem-avail –disk-space-util –disk-path=/ –from-cron

以下のメッセージが表示される場合は、エディターを選択して進めてください。以下の例ではviエディターを使うため、「3」を選択しました。

no crontab for bitnami – using an empty one

Select an editor. To change later, run ‘select-editor’.
1. /bin/ed
2. /bin/nano <—- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny

Choose 1-4 2: 3

CloudWatchで確認

正常に通知が行えておれば、メトリクス内の「Linuxシステム」以下に、ディスク、メモリそれぞれのメトリクスが追加されています。

これでLinuxシステムのメモリ監視もバッチリですね。しばらく様子を見て、負荷が低いことが確認できれば、t2.nanoインスタンスに変更したいと思います。