AWSの料金を毎日Slackに通知する

クラウド破産が起きないようにAWSの料金を毎日通知するやつを作りたかったのですが忙しくて...
重い腰を上げてやっとです。LINEに通知してもでもいいのですが手軽なのでSlackで行きます。
Slackシリーズ結構やってきましたので他の記事も参考に

https://qiita.com/ymktmk_tt/items/ef90884d94190f7ae951

https://qiita.com/ymktmk_tt/items/54920620e1e99389f36c

https://qiita.com/ymktmk_tt/items/06824d7d325e102b0e2e


## 今回のアーキテクチャ

![aws-slack (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/c1d4ad46-28b1-702f-ee36-325b1f08b0ef.png)

## Lambdaを作成

今回動かすコードを貼り付けましょう

```python

import datetime
import json
import urllib.request
import boto3
import os
import logging

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

def lambda_handler(event, context):
    
    url = "https://slack.com/api/chat.postMessage"
    
    headers = {
        "Content-type" : "application/json",
        "Authorization" : "Bearer "+ "< Token >"
    }
    
    client = boto3.client('cloudwatch', region_name='us-east-1')
    
    get_metric_statistics = client.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日')

    
    text = "%sまでのAWSの料金は、$%sです。" % (date, cost)
    
    payload = {
        "channel": "< 通知したいチャンネルID>",
        "text" : text
    }
    
    req = urllib.request.Request(url=url, headers=headers, data=json.dumps(payload).encode('utf-8'))
    
    with urllib.request.urlopen(req) as res:
        
        logger.info(res.read().decode("utf-8"))

```

## LambdaにIAMロールをアタッチ

LambdaにCloudWatchの読み取り権限を付与します。IAMのページに遷移して先程作成したLambdaを選択します。

![スクリーンショット 2021-11-22 13.00.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/c6926288-1fa3-44fe-6039-d06584a64a6d.png)

「ポリシーをアタッチします」をクリック

![スクリーンショット 2021-11-22 13.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/74e0fcfe-00b0-7789-78cc-331c215ff827.png)

CloudWatchReadOnlyAccessを選択して「ポリシーのアタッチ」をクリックします。

![](https://storage.googleapis.com/zenn-user-upload/61d512323209-20211122.png)

## Eventbridgeの設定

１日１回定期実行を行うにはEventbridgeをLambdaと連携して使います。


![スクリーンショット 2021-11-22 12.57.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/631dbaf5-0abe-f53a-2358-ba0791c6956d.png)



![スクリーンショット 2021-11-22 12.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/72c9b6b4-cd8c-4466-cb2c-bd9298623163.png)

　cron(0 3 * * ? *)は毎日、日本時間の午前12時ということを表している。

![スクリーンショット 2021-11-22 12.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/7fced684-4292-b0a5-1071-133aca88ecb9.png)

##　参考文献

https://qiita.com/nekoneck/items/caa91c016adeb81036ca

https://qiita.com/ymd65536/items/f352632aad904bd02b1c

・Rate または Cron を使用したスケジュール式

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-cloudwatchevents-expressions.html