AWSの課金情報をSlackへ送るまでにとても苦労した話

# はじめに

- 毎月のAWSの課金情報をちゃんと把握したい
- いちいちAWSにログインして確認したしたくない
- そろそろLambda使ってみたい
- 自分が把握するものをSlackに集約している

こんな理由から、やってみようと考えた。


# Slack

まずは課金情報を受け取るChannelを作成する。
名前や目的は後で修正できるけれど、ちゃんと決めておくことをオススメします。
![Slackのチャンネル作成](https://lh3.googleusercontent.com/3z-WIWP88NWhYC8f0Ww_bgvwrjjtH9AjgA2ryV53xzsYSyq8jm1isxsIpMZWYdffk012JUX3TYv3yNgeAStpeB5U4fUhFKxJ6WVhBczSIrKU3WS0kMU5UVjvkEl6py5dOe3H6SCzXbX9C2VY8eYmkYCOYvUgooFRBI8g14JxrCg8R_qN3D1rS5dLoIrPa3duW3j0JhdG-XfVPeSHHresLpxzrl6Uv8IePzmdVFG2xW5oIf5QeS-xR1Ty0qE03qm3NZw_22YbM5oBKT_FnWDuKjbCiLreylzJ6XZw-PK9GQ7guRRcG2DSlE1dqEoRsGz7VVJ9w8cS6bewRAl9b9Dh8z2QZBCnEctOn5dBBAHBgvpRi85j0VcYOSv_FaTFjCL-8ImTldpSOH81yvjty69o2AFx1Wzsui9bM9qEphSPU4kgOoKIGcEH7W0biVyJvt_95Ug8_8lSi9CVBLi7ZVBwpb5VgPIrY0LqIHMm6kdeDLIpBe2NkqTEtdZuHj7szQEF6O3y7QK6xxdDKgw6yYTrOxC2EnQ1Gxr0AUVR7NQD4gjLHXwJ8uruu7PapmwpYqXXzfGe3MZPcwT5Tq_L0XMJZFVS0LEilFObkne2UxoY0vFkWzgw5haqB4sHqo8fLFiaOpIIowWYECm8Xw2V-JHPpdnejqWUc4R4=w981-h597-no "Slackのチャンネル作成")

続いて、Webhook URLの取得。
[https://slack.com/services/new/incoming-webhook](https://slack.com/services/new/incoming-webhook) から取得できる。
通知を受け取るチャンネル（さっき作ったやつ）を指定する。
Webhook URLが出来上がるので、忘れずにコピーしておく。

![チャンネルを指定しよう](https://lh3.googleusercontent.com/2gZ0ybJJPkhQuXXQ9TV0ohfAjYnRHsi8mFqgJVVcP76AhIZ8ON8t8nPPVamFFeTNlcm3gqEFTBO9_5CJaC49r-xk0A5i0qVP2cCRvjAdTu5sNpIL_qdSr8MEH8fuVkEClaZgV30ynKt_gCrlF6WxwvelKfUOs_xwKF1caupscO2dS1df1Ft3d6tCVt9YGy2xaI2rnoR9mSrQsYbeAKUZCwieLROqv_aLj7n9ijpTYocbnGLLkaXdoo76Xjdts3p38qN6rtIXQRGijiQZetgXVilQ4OAWUHVfHAhNS9mKpd7YjBkfhSzM2rHCx5p0rYdncOjAdRNjU8lr-UoS_JUBdTHZG6pa8rQBAB-rjLn4Wq6sLkMUE48QiGGCspeMGYqLNkHe4OH2ObmInRIwZDg-beX0PtEa5aYkc_YkMIvZ_MWEeOp2Gnhs_cixHxWyu5nkCG5ZKOcnX8WRPRq8Obyb4nqsJklZ1DCNhGQq4LndpZ6yi0OjdlOkOIIVz5zPVMf3i7CIImlZxbHQ93qElZr0xyjLUFDtXbStgmQIDJW98UhroZmCFtpqizJ7gqNzHWPqkv90FN23snL1PXnBZg1Qpkv5A9FOI7-OJ7PI8O1UVJlMgaWiFU1cFThWviWvhyuOJVSTbcRMN9IyHM4j_bgMjfGZ4yvHE9nW=w1025-h597-no "チャンネルを指定しよう")

![Webhook URLができた](https://lh3.googleusercontent.com/A6qkcg0cnnpL083XhKRJbtqfhE3JkXtRL9ygdbUvvyOgI6j5HK9-EltGMdA6l-8tqN21_cBl_QxHRWixtJOwT1THqOcnZp3PLzACQ_2H-8qML4_RB6LXY4UVcuYUZ0MnaEckja--4i_he6rEz68w4ZPqlqDtaowDpmh7mQASXYsg2_7e-jTx-3HUpp_FXOFteNZ0XDL9o1swz6BR7DgWg44Dy3mW3YgoxdV0WP5zf1mk1AENkpptVhmNg_18OUIrx3O3cditT3iveTuKCL-HdgNrUqMoRB8XrkgVLNFAzKhbF3R1NFvpWfELP9a1OPmYiWnlLkw9RWL4GGG4CgiXCPz1joN9yURJg897-_btkTb8fOu0a1bFh3gMBC_GPtSs8sBpfLY5QGfgAJc_zCdJ9QYSTf67aXBp7V8DVMaX6fTV9tHc7V1OQ64bH5GvD_wOt1UoTIzRfndUdXmtfoIp_0Kv2dgZLZlLjmS1uRQfw4-I3AD-v5CjsCWMxZgu8CXczDSo4OMlC2PKZi1of_WkvdKMbAsjlAkkp0TuFYupaV57BfONpQkGEEa7bLtKTO5oIuPpSXhOtsyj6lLWuifp9QaxiEClOJv--J9MSlruWoTQ-IKwlc4RSSf_n6UyXPHsGJ0ktkGauVfB3qcgCIaBkYMp6-5LLwkp=w1024-h597-no "Webhook URLができた")


# ローカル（Mac）

## いきなり壁にぶつかる

Terminalで以下コマンドを叩いてlambda-uploaderをインストール。
・・・とはうまくいかなかった。

```
$ pip install lambda-uploader 
```

なんでだろ？と考えた結果、以下のメッセージが出ているからでは？と考えた。

```
You are using pip version 10.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```

よしわかった、アップグレードしてやろうじゃないか。

```
$ pip install --upgrade pip
```

途中でエラー発生。

```
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/pip-10.0.1-py2.7.egg/EGG-INFO/PKG-INFO'
Consider using the `--user` option or check the permissions.
```

仕方ない、やり直し。

```
$ pip install --upgrade pip --user
```

Successfullyは出ているけれど、ちゃんとできているか不安。
ここでPythonのバージョンを確かめてみようと思った。

```
$ python --version
Python 2.7.10
```

Python 3.5.0とか入れてなかったっけ？何インストールできるんだっけと思って、pyenvを実行。

```
$ pyenv install --list
-bash: pyenv: command not found
```

pyenvが使えない・・・仕方がないので、gitから持ってくることにする。

```
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

ちょっと前のコマンドを実行。

```
$ pyenv install --list
```

インストールできるバージョンのリストが表示されたので、その中から3.5.0をインストールすることに。

```
$ pyenv install 3.5.0
```

インストールがエラーなくうまくいったので、2.7.10から3.5.0にバージョンを変えてみる。

```
$ pyenv global 3.5.0
$ python --version
Python 2.7.10
```

あれ？
Pythonはどこを見ている？

```
$ which python
/Users/xxxxxx/.pyenv/shims/python
```

色々調べて、以下の通り~/.bash_profileに追記をすることに。

```
$ export PATH="'$HOME/.pyenv/shims:$PATH"
$ source ~/.bash_profile
```

さて、これでどうだ。

```
$ python --version
Python 3.5.0
```

あぁ、ようやくうまくいった。


## 各種インストール

lambda-uploaderをインストール。

```
$ pip install lambda-uploader
```

OK、次にaws cliをインストール。

```
$ pip install awscli
```

続いてaws configureで設定をするのだが、Access KeyとSecret Access Keyが必要になる。
作成していない場合は、[セキュリティ認証情報](https://console.aws.amazon.com/iam/home?#/security_credential)のページから作成する。

```
$ aws configure
AWS Access Key ID [None]: *****************
AWS Secret Access Key [None]: *****************
Default region name [None]: ap-northeast-1
Default output format [None]: text
```

東京リージョンを指定する場合は、``ap-northeast-1``を指定するようだ。



# AWS

## CloudWatch

AWSの管理コンソール、請求ダッシュボード->設定に移動して、**請求アラートを受け取る** にチェックが付いていることを確認する。
付いていない場合はチェックを入れておく。

![CloudWatchのアラート設定](https://lh3.googleusercontent.com/CijwYqb000sniblrO89GqNCBpOTK6i227BcrkJ-XGR_LouZiThMHD6u1BOaP-hz_Uk4NYFUokrcQiWHhRiL1Y0zSs5wsJzw-Pfo2Z4Myr28xT_pnAlt9qv0MP6MgQzOVwToTgSHaBnKjXcc4kCflTQz6wruze9qBeiQElKW-D3HMcH8DPVG2T08tAXfnAlLhbgDXynnD2F9OPi5Rmw_IPCshe3EjiQRmf9klBbFkHUBGGnT-mFTa0jLL4NCNY19YPvqAT7lEdYVfILPsg4Oprm34o9Kr8DES5qHO19yjlmYClnhYoyM7bVmQDH6dSC0MjIgqAKo-JB9mqjsGBqC8-dFyJAKelQlM08VgTtE20FIzwm2yyF2gD7qE5JUCIZIjmtskHLlBhBe51IkV6C5P4Hzl2aEcLPg7Qr9YcTnC8yA7FOM0H4UeV1Xh_n11Vw6o0q_TAONqHtwxHOfKWjGBGVjXxXikTb1p8cM674kU7JfJSJwJcz0H6DCoY4yVCgy-OYk285-M6zEy3gL9YGZoeu4Ni5whYnmaL2k8jZ4V3QrWQaXUdopLtPVJaxRoGxJLXBVzYMd43HcGv-Zb7uGhlSDPdn3e2WvLAuWhbMzzq7TWvLp__uBKdk4UFLUsBNydbHcB2BEs1hsyvppL2TdokqAQwld__CsV=w1213-h530-no "CloudWatchのアラート設定")


## Lambda関数を作成

コードを``lambda-uploader``でデプロイするためには、あらかじめ空の関数を用意する必要があるらしい。

Lambdaで **一から作成** を選択。
名前とロール名はわかりやすいものを指定、ランタイムは **Python3.6** にした。
ロールは **テンプレートから新しいロールを作成** を選択し、ポリシーテンプレートは **基本的な Lambda@Edge のアクセス権限 (CloudFront トリガーの場合)** を選択。
これで大丈夫なはず。多分・・・。
**関数の作成** ボタンを押して、空の関数の作成は完了。

![関数の作成を選択](https://lh3.googleusercontent.com/iDC6alr8oJhFWjEAyzlgyBnyJiG2A1qDmANvMtlqV4n5XZWQ9JfaXExhLKrs1r2UDqSJit6oGxFpFM_fLaK5cmQuW_qqKXc8zrt3Qe1LxNurZEZGF4RJIrWXpb1Cfd_V_2fG1deXeFV9PqMwVrAI330Aso7bvz6kdDSwLvmLKFPTVvlFHJy7l0T446AxmoTgAT_yoGxR6iGRh4821pfDhkBTxTVDNASUqVAzO2htdjvIKFQgNFd19it-0pqjJlRrlx03hJxSk-smhlo3iYkTW0f48Kuzx-pxlwPD5LwAJr2dKMlRybBzpsQqQxCrhfCE5Cd1fUsIow9hCv2itux3hYFaMqvejUd1lkSR6grFlGNcdbE4EtbjEOeiAIpDPDULeem0umG_sTdraSqychxCwYDXdNWRzYVFCY0syYCFeoOhplvk7hcwhSV5fXYa_lk0LKru5xFr723MnxQVF5q5r2QfXoqcI2Q4gV2oASfjWkkHgCcvf33-7nuhTYHYAwGmMo7avlw5Q8oYVDe0eenSrGwUa-Ah4cH_IuVR4MDNpRMS1_Q6heP1eUUU7h4ijHg0s1W0JdyDhiGcPrqYkOK5Jr3ZQxca-pCKtGnkl8ovr401mqGYjkRFPZndLgp_mJrKJVF8c0gTncl9jIL_r3peYYuxKtYe9xNS=w1213-h370-no "関数の作成を選択")

![一から作成を選択](https://lh3.googleusercontent.com/NWUfIPTvakODu9J_2pYmUK8D1nDooLxqdDBh3n0XlxT6QlQLyDi4VlMYW8sSJo-A6QgsdmjQVdAiwRq_QLlya2Fi8sMFhlDZK84cH8C92-IyftN5VrXj32Rh2ns4CztiJ1uU-9fMLu5XcmYHgdv4m3IdAqSEfQBP_mBzwQ_E5qmq3WVr8L6lzV0BvJSeJYNWeCQyxtK-OVEO8GGyJLIgmEoS-YnQfyL7DypGdrVbmRG0vzk9jtFhwhkB-ptwlcsomebN1o8tpJebT2wE4uqGQrsdNeO26u2OsoPxlm1sMTtjamTLxnt9OYxDPJClKYQZ2GZJtCB3eAtYLII9zirw-QxCk2rKqBOnNVP9mwOFPZOqrEoYcCVCOLT7SDCFPidDlh8G_pDM96CjOT0qcy5B7XqmLp6swsQKZUo4-knUHvyAPukNMJ1RNPEiM5mSbNrhHfWuchIiJOkamYHhzpNNBSWfG5Tm5qMU_eCh_c4HMG_IazmbCug6yK4ctV8_fmcRqOig603zxBvyjJAvnLGiknIysu_ECZyaombk2kiRvox3XQrxrTz6dWi6CUPiqlGskwxEiFkOhqQo_qK8bMN35YdOgJM3KxUWB0WT4FdiNJEo_thjTtyyvAliIBupwMxijXxwYeD2pUFBxymSUFFbYQ7YrCkpSrO0=w1213-h340-no "一から作成を選択")

![設定値を入力](https://lh3.googleusercontent.com/XkHqtTeTxXpBwiKNyIlyyJ8tqqDWDgcloWMAGiX49B0Xu0RM1CX-APsfXejC4s67HtHVfq9FouSPt1dn0OnfBfFELyiTlXLAnUDzeMo3GETx5caRyKjGG5XYQnP0Px71aqtvIfZha7QY_amti78tK-MvOsrdgzOglJb28wlkTKRSwLs-I0K3s_AqcQ3adLeS3Y3WvrSzTotXzwrymQ7PY4HOOeLUqPTvJKEbS3hp_yuRWXp_Zx9hfIt-AtifnV4jDpA8obY_MLNVT5XW3chdya-s93h3-fYgEo0pv-VPs62s7BNchyadAKBkArxyc5DD-5jnk-HKe3j3tWnvbxF4PI02c5wHJheqCtL1FJ7sbK0by7tpv1uIvFJ0XkA5v2BfYPlTptxRivHsHdqHObyepxmqwiqaz8SfAlEGsJgEFT0OBAW02VPeU7fwHJeWlbZFlo_jPCwFzNxIg2uvY447WTLm52TneNcFin5vBCyTo-O-2n5cBitvXyENO4GjUS7xyiGdfHLDcuUou2KXnha6l7iFeEW6ofuRQFBMXu000FMUae4UHCyTT7N6U2hYJxyav-p4ZafiEwxbFfIauXUIWzXQ4Izd8IprslDo8AJBEELGA5ZevMZJ5dpUFL2Coy7k6VVA3iIV977UB3qMAH4OO5BPhX9nJav9=w1173-h597-no "設定値を入力")

![空の関数が完成](https://lh3.googleusercontent.com/XjhjB6GZwJq_BTmF2ZDUMrzEyaXcu7CZsFX285qut1qrOsKx6P2egctDu01HL4UmtH01f2GGSwGDPrPCcHNCEbukD9rysL17OIDTJwRAxtKULuHPKuw0r5vBbhDoKvfnJrG0oH_-8GMi2q-JYtf265lerD2Gfuxx8H7R-nlSVyKYUsAEUa4rCa89sbkl5eHroXm2qcfxAXG_p1brXzDXP967QYFVYR6fNvt0Mq_pqWydpCXRJMmbC_cg4hF7OPk4TjK1G-eNZyrYb4JrFpxjdvBkRxpKhCKKcnHIJdfM-98HFMj1WzGGp-Fhov5l6hpc2lQ7h7ngWDqXkQDxq8KdYugedN7M8SjqeC5FpiXPm86kCZ9uZl5HNcU_atd96SXx7pzOZs8aThVGe_8hV7qhcV_pxBuTAwL8SrKGCVqMj9IkS-fDRnQWUo9x4NEQKnxhVlgReCogv4R8K-g_YWd1VlT5PAfoyNprFsyCazKX6ZlJhYsQx68f1nDphlEVNAFwq8mRktrpllh0SxU3EN_oGB11v3hZQCUyrpAExQK0G_etqqr_pGjXI1DYvP1lUEscBKGIPkQzQKWCwvFhgdjLIWOvg1Xu-6dVVvgtX0TjTxNPyfE-fam0qrdxKtHnpvMAiQ5TvGuSAUfW5qVRxuTtLP2Ooz4lcvLy=w1165-h597-no "空の関数が完成")


## IAMロール

Lambda関数を作成した時に、IAMロールを作成した。（テンプレートから新しいロールを作成を選んだから）
そのIAMロールに``CloudWatchReadOnlyAccess``ポリシーをアタッチする。
コスト情報をLambdaから読みだすのに必要とのこと。
アタッチ後に、ロールARNをコピーしておく。

![作成したロールを選択](https://lh3.googleusercontent.com/pH_eysPUJeD0fvOzPaMi9PXBrwn_ZjEU4Y0wTKoPFF_bibgm6Y6MevSA0btP4d4BNFx1kExgWTkmjXJ8Cab3NDN8jlnmR9i0vJYnJZ0g8MJaY3IwdzTvpPFex74Igi-dpUFt2spsf4KTt-MeDtfcKIB33uHXPmQ_EodA8Vw-9Ed4vdRR4PLX6hMhpd-rzrlP8P6muonlKMG03lkqVXaeafHouK95-GhFGYXzd4nB_f_oBzTSxr6ii_mJ3kCwIED3OM9oJ-2YwT_BxB-uID0CiarNyxhNTRiN91t1_Ucxbrw9E4-zHuEAIUdekBlEfv7GMcZz81SHCNzEJ-YJMdhajqfX-4WB2NmyhO_KUCXrmOCUcNKV8P3t-BCl02ZvauWg-kNY4xvbfFP_2xqyk-Q_QQqoerZ73rS31NOC2_VFcICB5j288I_qkh3HhaPdP04oFAWfLxOTk2DhN_HfD7uy_SYUf6NBOPupVmGtSODImLhXM0vcrHw_jutDgY6-IHYJ5D39UGAPot1wufBS9j3567iCgNJZGqEODvQR3mBTKLjH8R5hltISmokQJvXlqp53NbXqG1Zu-XsUuK99L7P6LlVVponRRzbdi5H94xSLkB5l4rj1piz4kE4FaUqhytrpQDpp-4AQbPOhDyDqiT7erna9yi-rk-OF=w1213-h313-no "作成したロールを選択")

![ポリシーをアタッチするよ](https://lh3.googleusercontent.com/W9W446ZLcsUS_9kLIvuSssaxMVYTta-z2n24u-F_q4Zg5oS9jVgnctfdnCI-HRl5DF78tVnDj84VVUMo4TH1dQMxoHMKj8scMXzMsTi759P0j0QGJiQsPzv8YS24nKT9xnZFaLIwlh1kUbInBRbWHBHxULu8ZZp_KYEzJol2fUOM5sAXdHWGyFMd9553f9CK2WVD4NhXYPNFEZNafDBG4WYeVY1rFDJMqxYRIIr987oUiSpEVdhT0aaUpPQ-GD0i0nuTNQOPb7fFbJU-w6OuU510czj4qoo-3x4VWFfFZrW1YTDQ9gioBbkdDdCRMWfcb7U7XlSMTCFC3OwHJQzQu1hrmVQNwiRNWD6_yTPNsvmOKQBlNjf2QwKcjjegP63eVxrjojE5RIHI794EcK81yJlvYF4z_dIyGfImru0GqPVwhQ4-NFz6z9agWm77M0l7DlIp5hIRDrVNxSTyfX1qhD4KOLZfsK1KYnXA9cdG5cpEw2H4wITXn14YqwYWk5FmYyy-7gABoWUOnfjWk-VpktnU8e9j-Bhrdm3mpcjZpG_YbMlW8f2PDBipsXqYw7rxfUrTFyWpDTZIwtE5nof0dVbd5vTaRGpNT3Ip6Owf_BUJA0YfNv-494DcN7BIxNCRPUDAPXTQCcCun2zCVFZ6TopF5A1fL7rh=w1213-h579-no "ポリシーをアタッチするよ")

![CloudWatchReadOnlyAccessをチェック](https://lh3.googleusercontent.com/75_69cT4y8eOcVCWnauBT2MYiwE37GCMXLPz4UzaKYbGhKSgPAjhIoUDGBN_HqwFZ6cjPPeLOQV6vChSShf6WDNiHYk_nQc4vimNFMNhnK1slZCiNU8C_YRAawO3a3uQ7XA7owc5IZGtSaH62cxOO0M4kWXmEHRnKCDJZJ_x8_R-Y3R4Me2OxVefiV7suCwG2Ov5X2mfZij4aK7dsSDXzqIb9IHY26E284o_gh_C2fKDtrT0_9xAgn7Ului8_Cov5C8cM4FsHnvTll2OGWyr5sp6UsiQ7Yem5d34XYyM5kJD_ZmGXNeqKSXc6vP63yD8r88HQJdRF3R7LUzRpfyR5wAcFZJGEvNat8YtQGx7UMzUPG9jtr9Di1Zzl-DaKRVkF19Q9Y9BC5Iln_s9RrVokfk-g5i1tEyRgXIGkTVAbq5RFr6mGsQSqjuDoJ31uCyOM88IC8EhM6obZk8unKxULYP5UpyudKoPgeqbR2Fsnf9o338_k_wqVvCXKFE7hhZZ4M9vr6-s-vtNW0FuN7c-e5H-teSxJnMQimLiJurX4tn1E7tN_IwKCWEtJQZzjMgId9AggNiDmwTbYdNFBWU3Ou01jkp7YBEUfts8U87yxipiO9cfUxWmYRZZTY5EWRaIxL-lfBTJlmH5WDgGnrZTRQoGS_p3ucLc=w1134-h597-no "CloudWatchReadOnlyAccessをチェック")

![アタッチを確認](https://lh3.googleusercontent.com/f7pSSgWtRJMqtYYCaLJjUrySYQtx_YQO-2qsHeq0XCiKxXobptUbJBq-2wDaEPQSnNFYECZbPXhjEE92VZmf1T_VecqBXYjPzoWf9NDk8mHkoPQOLqkkeTjLdqnxhY13nDJ1I8NbyHPrY4PaopxgRv0O3Mz_Z5Zz9eCeqsq53suFdO6GK0inn5e2B5mbYd9j8LW5LIZfRYoUnUWTlJ3JJHQwvWlqUAzhu-tSFuWNPcXn1MUjkjOicLj88UpSYq4aaIF-GWuCZqtRjyI1MtICBNrA4RegUsAahtd6pdFZHbWBdjQTp-m4FhkoQWimjIdxa2S13CpC8r0QNloAq7uWWyC3M_4bX7qJ6m6sZ4z_v2uGsvTiHgtFt2Vp56cK6vVAh2I9ZMwYgv7srQ7bQF4fSjvlYii7d4RRyPdlXnutzMkcGkfLqOZGqvY1Gbg3svQqpXWQosWQObFAIfubGqoiZ4_2JKXij0EjA9R7GbmIHWKYA5Zc7vb0OriIsAO7J3X-EAzmC-ydUJBfibFv319JbXlZPPy0Tlk5B-thO_B9yODHmFbursrAgrdab1o0ckA54wZNRX1W3ui5_yPPamHcr05HdjqJ9ltcbA1RncEsJPszrNO6yYEw6TbGzX9sgLEyPNWPlui8yenMFHdZHHZxI6JKaLEJYM4_=w1213-h593-no "アタッチを確認")


# コード（ローカル）

ローカルでコードを編集する。
個人的に好きなATOMを利用して編集する。

ディレクトリとファイルは以下のようにする。

![ファイルの構成](https://lh3.googleusercontent.com/cDMaZuFsA0iaaGWdoI8a5vSu1Brca26-J6tTKsnS-D7TPjhXX1lWoe3o0k7GtkZCWKLoiAATQ6FndP39h6CJhlQjhfgbV5lD58HkigpdjQjuTJk1b6aYuGKkDQxIqaaV9GLwU22OPgxmx-xRp5s0lPW4PEC8c0DWpSlJ6AotOcLXdcNB3c4-GLm3phwdHV3xXyv21Vsv9kzKZ15N4OeEZzM4AV_qIjUO4iJQXLsP3HcGEr_vCW8ds695sdAHBTwf8y5d-a4EFM-yBf8yBR9AV8ZNwgI73QwfBCGLQOJPYTsR1xVLfuRB-dAI-rHolAEbSMjNeUxALqJ-X6ojI_lSMOL0Lk8zvRZo40JGp2lPZLueDcDOhKdrf65cV4SwYES1a1uiKRrh7adHvdYjNXk5shR-dFA1_7pejJIjjXzhoajBHQfXWTO2KWy0VRJr05La8vX6QB_9y6MwYGEuIZ0YtzWcXyqZiarLBRhZ4FBUjjspPfFvr9NIoImjK85QIy72suKcDoa1PF5wQqad_N4W1JKxRf6ETwBTXpv8gLkEtnfL8tN3V1Yl5lwdnEWRhGfpE3nAjZ935INsVKt4u9Z8KJuc2pn8U9OwuzqDk8mmQGZkip1EfMwrKe_xRdtkAxjSPcyv13jFgs52vM6CaomlJa3xBg3wOze1=w648-h259-no "ファイルの構成")

## lambda_function.py

- [Logging](https://docs.python.jp/3/library/logging.html)
- [OS](https://docs.python.jp/3/library/os.html)
- [boto3.client](https://dev.classmethod.jp/cloud/aws/get_value_of_cloudwatch_using_boto3/)

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

import json
import datetime
import requests
import boto3
import os
import logging

# Logger の設定
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# Slack の設定
SLACK_POST_URL = os.environ['slackPostURL']
SLACK_CHANNEL = os.environ['slackChannel']

# CloudWatch
# region_nameはus-east-1にしておくこと
response = boto3.client('cloudwatch', region_name='us-east-1')

# ValueはUSDじゃないとダメ
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)

    color = "#ffffff" # black

    atachements = {"text":text,"color":color}

    return atachements

def lambda_handler(event, context):
    content = build_message(cost)

    # Slack に POST する内容を設定
    slack_message = {
        'channel': SLACK_CHANNEL,
        "attachments": [content],
    }

    # Slack に POST
    try:
        req = requests.post(SLACK_POST_URL, data=json.dumps(slack_message))
        logger.info("Message posted to %s", slack_message['channel'])

    except requests.exceptions.RequestException as e:
        logger.error("Request failed: %s", e)
```

## lambda.json

- name: Lambda関数の名前を入れる
- description: Lambda関数の説明を入れる
- region: リージョンを入れる、東京ならこのまま。
- handler: ハンドラーの名前を入れる
- role: IAMロールのARNを入れる
- slackPostURL: SlackのWebhookURLを入れる
- slackChannel: Slackで投稿するチャネルを入れる ex.#aws

```lambda.json
{
  "name": "Lambda関数の名前",
  "description": "Lambda関数の説明",
  "region": "ap-northeast-1",
  "handler": "lambda_function.lambda_handler",
  "role": "IAMロールのARN",
  "timeout": 300,
  "memory": 128,
  "variables":
    {
      "slackPostURL":"Slack WebhookのURL",
      "slackChannel":"Slackの投稿チャネル"
    }
}
```

## requirements.txt

```requirements.txt
requests
```

## デプロイする

デプロイするときは、上記ファイルを置いたディレクトリに移動してから行うこと。

```
$ lambda-uploader
Î» Building Package
Î» Uploading Package
Î» Fin
```


# AWS-CloudWatch

CloudWatchのイベントを作成する。
CloudWatchに移動して、イベント->ルールの作成 を選択する。
![20201107_IMG_1238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/e27d98f7-39cd-3282-b0d4-81cff80e838c.png)


「スケジュール」にチェックを入れる。
「Cron式」に値を入れる。Cron式の書き方は参考にリンクを付けた。
ターゲットは「Lambda関数」で、機能で作成した関数を選択する。
![20201107_IMG_1241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/b546c66c-ae39-148b-755a-62df9490319a.png)


ルールの名前と説明はお好きなように。
![20201107_IMG_1242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/c0ffd970-f615-c7b1-e6bf-2bbbb7c4d916.png)


これでCloudWatchのルールが完成。
![20201107_IMG_1243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244560/15bab112-5731-8053-6cb0-2fe41a277e02.png)


# 結果

綺麗にうまくいった！と言いたいところだが、実際はうまく飛んでこなくて試行錯誤。
その結果が、上のコードです。
`lambda_function.py` の `region_name` と Dimensionsの `Value` かな、引っ掛かったのは。
それ以外はうまくいった。


# 参考

- [LambdaでAWSの料金を毎日Slackに通知する（Python3）](https://qiita.com/isobecky74/items/88e8e0dcb0ee224a31e4)
- [pyenv, python3, lambda-uploader で AWS Lambda にアップロードする。](https://runble1.com/python3-aws-lambda-uploder/)
- [pyenvを使って、pythonバージョンの変更](https://qiita.com/twipg/items/75fc9428e4c33ed429c0)
- [pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法](https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)
- [pythonのバージョンが切り替わらない](https://qiita.com/mckyhrs/items/94a2db3506287df0420e)
- [AWS CLI のインストールと設定（AWS公式）](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html)
- [AWS Command Line Interface のインストール（AWS公式）](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/installing.html)
- [AWS CLIのインストールから初期設定メモ](https://qiita.com/n0bisuke/items/1ea245318283fa118f4a)
- [ルールのスケジュール式(AWS公式)](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions)

# 修正

- **AWS-CloudWatch**の画像リンクが切れていたので、新しいものに差し替え（2020/11/7）