【AWS】 PHPでCloudWatchにデータを流し、モニタリングしてSlackに通知

# はじめに
タイトルにもあるように、

PHPでAWS SDK for PHPを使って、CloudWatchにデータを流し、その値をCloudWatchでモニタリングして、Amazon SNSとAWS Lambdaを使ってSlackに通知するという流れです。

![CloudWatch_Alerm03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179812/acc164d3-7e8b-6ae6-2a24-8fab57b9573f.png)

# 内容
## 概要

大枠の流れは以下のようになります。

**2 ~ 4については、以下の記事が参考になるので、ここでは省きます。**


https://qiita.com/kooohei/items/848eeb4cbb19c83b0b6d

（ほぼPHPからCloudWatchメトリクスにデータputしてるだけだろって感じの記事になってしまっていますが、、お許しを・・・本当にやったので、結論で確認していただければと思います・・・。）

#### 1. サーバの情報を「CloudWatch」に流す

※情報の例

```
・ページのリクエスト数
・メモリ数
・.forwardなどでスクリプト叩いている構造をとっている場合に、
どれだけメールが来ているのかの数
```

#### 2. 「CloudWatch」から「Simple Notification Service」に向けて通知

#### 3. 「Simple Notification Service」から「AWS Lambda」にエンドポイントを指定

#### 4. 「AWS Lambda」からスクリプトにより「Slack」に通知



## 詳細
### 目的

PHPで、AWS SDK for PHPを使って、CloudWatchでカスタムメトリクスを作って、そこに対してデータを流し込み、CloudWatchでモニタリングして、アラームが発生と同時にSlackに通知する。

※ただし今回は、概要にも書いた通り、PHPでCloudWatchからSlackに通知する部分は割愛しています。

### 1. AWS SDK for PHPインストール

Composerを使用して、AWS SDK for PHPをインストールします。

#### 【Composerのインストール】

```
$ curl -sS https://getcomposer.org/installer | php
```

#### 【ComposerでAWS SDK for PHPインストール】

```
$ php composer.phar require aws/aws-sdk-php
```

### 2. AWS SDK for PHP使用するための準備

今回は、AWS CLIを使ってAWS Access Key/AWS Secret Access Keyなどを設定して、AWS SDK for PHP使用するための準備をしていこうと思います。

#### 【AWS CLIのインストール】

以下を見て参考にしてAWS CLIのインストールをしてください。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html

#### 【AWS Access Key/AWS Secret Access Keyなどの設定】

aws configureコマンドを入力して、AWS Access Key/AWS Secret Access Keyなどの設定する。
今回は、Default region nameを「ap-northeast-1」、Default output formatを「json」としています。

```
$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

AWS Access Key/AWS Secret Access Keyについては、ググってください。。と言いたいですが、以下の記事とか見ればわかると思います。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html

また、AWS Access Keyを管理するためのベストプラクティスを把握することはとても大切だと思うので、以下を参考に目を通しておくべきです。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html


### 3. PHPで、AWS SDK for PHPを使ってCloudWatchにデータを流し込む

ひとまず、PHPのコード(put_metrics_data.php)を記述します。

```php:put_metrics_data.php

<?php

require 'vendor/autoload.php';

use Aws\CloudWatch\CloudWatchClient;
use Aws\Exception\AwsException;

$client = new CloudWatchClient([
    'profile' => 'default',
    'version' => 'latest',
    'region'  => 'ap-northeast-1'
]);

try {
    $result = $client->putMetricData(array(
        'Namespace' => 'TestMetrics',
        'MetricData' => array(
            array(
                'MetricName' => 'TestData',
                'Dimenstions' => [
                    'Name'  => 'WEB-server-1a',      // 監視したいEC2のインスタンスIDや名前など
                    'Value' => 'http://hogehoge.com' // 監視したいEC2のURL
                ],
                'Timestamp' => time(),
                'Unit'      => 'Count',
                'Value'     => 1000
            )
        )
    ));
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

今回、監視したいEC2を絞り、適当に1000の値をCloudWatchに流し込みます。
※ここでの設定情報が、CloudWatchからAmazon SNSに通知するための大事な閾値になりますので、繰り返しになりますが、以下の記事を参考にしてください。

https://qiita.com/kooohei/items/848eeb4cbb19c83b0b6d


また、

putMetricDataファンクション部分のオプション情報については以下の記事が参考になりますので、目を通すことをお勧めします。

- https://dev.classmethod.jp/cloud/amazon-cloudwatch-keywords/
- https://dev.classmethod.jp/cloud/amazon-cloudwatch-keyword2/


### 4. CloudWatch -> Amazon SNS -> AWS Lambda -> Slackで通知

概要でもお話しましたが、以下の記事を参考にして設定していただければと思います。

https://qiita.com/kooohei/items/848eeb4cbb19c83b0b6d

### 5. 結果

PHPスクリプトの実行

```
$ php put_metrics_data.php
```

以下より、しっかり通知来ている事を確認できました。
※通知内容をtestとしているのは、pythonからslackwebを使って通知する時のtextで決まるので、それぞれ設定してください。

CloudWatchでアラームを出していることを確認

![CloudWatch_Alerm02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179812/7279cbef-cc90-6f64-56a5-493b1bdab507.png)

最終的にSlackに来ていることを確認

![CloudWatch_Alerm01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179812/1d0b8d3b-bdcb-4779-7d79-f41b9605e5c9.png)


時間かなり遅いことばれますねこれ笑
皆さんは健康的な時間にやりましょう・・・。

# まとめ

```
PHP -> CloudWatch -> Amazon SNS -> AWS Lambda -> Slack
```

の流れで、通知をしてみました。
今回は適当な値を閾値として、通知しましたが、サーバを監視するために様々な値に変更して使用していただければなと思います。

ありがとうございました。

# 参考
- https://www.php.net/download-logos.php
- https://qiita.com/kooohei/items/848eeb4cbb19c83b0b6d
- https://dev.classmethod.jp/cloud/amazon-cloudwatch-keyword2/
- https://dev.classmethod.jp/cloud/amazon-cloudwatch-keywords/
- https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html
- https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html
- https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html