LINEで通知したい
LambdaでAWSの料金を毎日Slackに通知する(Python3)
個人で利用しているAWSがあるので、
Slackとか使わずにLINEで通知するようにしたいと思ったので、上の記事を参考に試してみる。
流れ
請求アラートの有効化とか、IAMについては上のリンク記事を見てください。
違う箇所だけを書いていきます。
LINE側準備(Line Notify)
1.以下のURLへアクセスして自分のアカウントでログイン
2.ログインした後マイページへ
3.パーソナルアクセストークンの発行
自分自身にのみ使う場合OAuth認証は必要ないので、パーソナルアクセストークンを使います。
[1:1でLINE Notifyから通知を受け取る] を選択、トークン名は通知の際に表示されるので各々考えてください。※私は「AWS請求情報」としました。
発行を押したらトークンが表示されるのでメモしておきます。
通知テスト
curlコマンドで通知のテストをしてみます
curl -X POST -H 'Authorization: Bearer <access_token>' -F 'message=foobar' https://notify-api.line.me/api/notify
※<access_token>は発行されたトークンに置き換えてください。
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)