LoginSignup
9
14

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-30

LINEで通知したい

LambdaでAWSの料金を毎日Slackに通知する(Python3)

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

流れ

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

LINE側準備(Line Notify)

1.以下のURLへアクセスして自分のアカウントでログイン

2.ログインした後マイページへ

linenotify1.png

3.パーソナルアクセストークンの発行

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

image.png

[1:1でLINE Notifyから通知を受け取る] を選択、トークン名は通知の際に表示されるので各々考えてください。※私は「AWS請求情報」としました。
発行を押したらトークンが表示されるのでメモしておきます。
linenotify2.png

通知テスト

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

curl -X POST -H 'Authorization: Bearer <access_token>' -F 'message=foobar' https://notify-api.line.me/api/notify
※<access_token>は発行されたトークンに置き換えてください。

結果
image1.png

LINE Notify API仕様

詳細は以下を参照
https://notify-bot.line.me/doc/ja/

AWS側準備

先ほども言いましたが以下の流れです。
LambdaでAWSの料金を毎日Slackに通知する(Python3)

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

lambda.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

#!/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)

9
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
14