Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

LINEで通知したい

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

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

流れ

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

LINE側準備(Line Notify)

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

https://notify-bot.line.me/ja/

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)

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away