AWSの料金をLINEで毎日通知するようにする。

# LINEで通知したい
[LambdaでAWSの料金を毎日Slackに通知する（Python3）](https://qiita.com/isobecky74/items/88e8e0dcb0ee224a31e4)

個人で利用しているAWSがあるので、
Slackとか使わずにLINEで通知するようにしたいと思ったので、上の記事を参考に試してみる。


# 流れ
請求アラートの有効化とか、IAMについては上のリンク記事を見てください。
違う箇所だけを書いていきます。


## LINE側準備（Line Notify）

### １．以下のURLへアクセスして自分のアカウントでログイン
https://notify-bot.line.me/ja/


### ２．ログインした後マイページへ
![linenotify1.png](https://qiita-image-store.s3.amazonaws.com/0/160548/26e39950-993b-43f4-e103-186f4b03621c.png)


### ３．パーソナルアクセストークンの発行
自分自身にのみ使う場合OAuth認証は必要ないので、パーソナルアクセストークンを使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/160548/54c2e7bf-fd2d-6057-fc66-431781d21a9a.png)

[1:1でLINE Notifyから通知を受け取る] を選択、トークン名は通知の際に表示されるので各々考えてください。※私は「AWS請求情報」としました。
発行を押したらトークンが表示されるのでメモしておきます。
![linenotify2.png](https://qiita-image-store.s3.amazonaws.com/0/160548/a3e014b9-1ea5-4b70-bc88-bb7ca0341990.png)

### 通知テスト
curlコマンドで通知のテストをしてみます

```
curl -X POST -H 'Authorization: Bearer <access_token>' -F 'message=foobar' https://notify-api.line.me/api/notify
※<access_token>は発行されたトークンに置き換えてください。
```
結果
<img width="375" alt="image1.png" src="https://qiita-image-store.s3.amazonaws.com/0/160548/7e336393-002b-adc8-c76e-cb28bcd31ea3.png">


## LINE Notify API仕様
詳細は以下を参照
https://notify-bot.line.me/doc/ja/



## AWS側準備

先ほども言いましたが以下の流れです。
[LambdaでAWSの料金を毎日Slackに通知する（Python3）](https://qiita.com/isobecky74/items/88e8e0dcb0ee224a31e4)

違う箇所のみ記載します。

### lambda.json
```json
{
  "name": "XXXXXXXXXXXXX",
  "description": "",
  "region": "ap-northeast-1",
  "handler": "lambda_function.lambda_handler",
  "role": "arn:aws:iam::XXXXXXXXXX:role/XXXXXXXXX",
  "timeout": 300,
  "memory": 128,
  "variables":
    {
      "LINEPostURL":"https://notify-api.line.me/api/notify",
      "LINEtoken":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
}

```
XXXXってなっているのは各々変えてください。

name = 予め作成した関数名
role = その関数で使うIAMロールの情報
LINEtoken = 取得したパーソナルアクセストークン


### lambda_function.py

```python
#!/usr/bin/env python
# encoding: utf-8

import datetime
import requests
import boto3
import os
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

# LINE の設定
LINEPOSTURL = os.environ['LINEPostURL']
LINETOKEN = os.environ['LINEtoken']
headers = {"Authorization" : "Bearer "+ LINETOKEN}

response = boto3.client('cloudwatch', region_name='us-east-1')

get_metric_statistics = response.get_metric_statistics(
    Namespace='AWS/Billing',
    MetricName='EstimatedCharges',
    Dimensions=[
        {
            'Name': 'Currency',
            'Value': 'USD'
        }
    ],
    StartTime=datetime.datetime.today() - datetime.timedelta(days=1),
    EndTime=datetime.datetime.today(),
    Period=86400,
    Statistics=['Maximum'])

cost = get_metric_statistics['Datapoints'][0]['Maximum']
date = get_metric_statistics['Datapoints'][0]['Timestamp'].strftime('%Y年%m月%d日')

def build_message(cost):
    text = "%sまでのAWSの料金は、$%sです。" % (date, cost)
    return text

def lambda_handler(event, context):
    message = build_message(cost)
    payload = {"message" : message}
    try:
        req = requests.post(LINEPOSTURL,headers = headers, params=payload)
    except requests.exceptions.RequestException as e:
        logger.error("Request failed: %s", e)

```