【AWS】初心者が気にするべき請求

# はじめに
AWSの請求って怖いですよね...

特にAWS始めたての頃なんか何にどれくらいの金額が発生するかわかりませんので頻繁にマイ請求ダッシュボードを見ていました。

今のところ、異常な額の請求は来ていませんが、今後何があるのかわかりませんからできる限りの対策を行いたいですよね。

「**じゃあ異常な額の請求が来ないために何を気にすればいいの？**」
「**何がどうなったら高額請求がくるの？**」

を自分なりにまとめたので参考にしていただけると幸いです。

# 高額請求について
AWSの不本意な請求は大きく分けて以下の3パターンに分けられると思います。

- AWSアカウントの重要な情報流出による不正利用
- リソースの削除し忘れ
- アーキテクチャの設計ミス

それぞれがなぜ起きるのかを見てみます。

# AWSアカウントの重要な情報流出による不正利用
**最も高額になりやすいのがこのパターンです**
ググったら約800万円の事例もありました。GCPですが。

Qiitaにもいくつか記事があります。こういう記事を読んでいると胃が痛くなります。

どの記事も根本的な原因が「**アクセスキーIDとシークレットアクセスキーの流出**」です。

IAMユーザを作成したときに出てくるこれのことです。

![former2_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/b782dd03-814c-0801-d3a1-c63d0b5dd43b.png)

こちらのキーを使うと、このキーを持っているIAMユーザの権限を使うことができます。

そのため、もし仮に「EC2インスタンスの立ち上げ」が行えるユーザであった場合、その権限を利用され、**高性能のインスタンスを立ち上げられ仮想通貨マイニングに利用されたり**します。

なので**絶対に流出しないように心がけてください**
(というか、CLI,SDK,CDKあたりを使う予定がない方は作成しないほうが良いです。)

より具体的な流出経路は以下の記事が参考になります。

- [GitHub に AWS キーペアを上げると抜かれるってほんと？？？試してみよー！][link-3]

[link-3]:https://qiita.com/saitotak/items/813ac6c2057ac64d5fef

怖すぎ!

幸い、FullAccess権限でもアクセスキーIDとシークレットアクセスキーだけではパスワードの変更は行えません。
マネジメントコンソールにログインはできるので慌てず適切に対処しましょう。


上記記事でも紹介されていますが、[git-secrets][link-4]を導入すると、アクセスキーID,シークレットアクセスキーがcommit,pushするデータに含まれていた場合は教えてくれるみたいです。積極的に導入していきましょう。

### 参考
 [AWSで不正利用され80000ドルの請求が来た話][link-1]
 [初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。][link-2]

[link-1]:https://qiita.com/koyama9876/items/add70cba3cccdb7fa995
[link-2]:https://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694

[link-4]:https://github.com/awslabs/git-secrets

# リソースの削除し忘れ
こちらが一番「あるある」だと思います。
勉強用にリソース立ち上げて削除し忘れ、放置していたら請求来てびっくりみたいな。

私自身もデモで作ったNat Gatewayを消し忘れ、千円くらいの請求が来たことがあります。

これの対策は**不要なリソースは削除**を徹底することです。
[CloudFormation][link-9]等を用いてStackで管理すると消し忘れを少なくすることができます。

ハンズオンなどをやる場合でも、どのリソースを作ったかなどは適宜メモを取りながら進めると消し忘れがなくていいと思います。


[link-9]:https://aws.amazon.com/jp/cloudformation/

**中でも注意すべき主要な時間課金リソースは以下です。**
(料金はすべて東京リージョン価格です。)

- **EC2インスタンス(オンデマンド)**
    - EC2をStop状態にしてもEBSには料金が発生するため注意
    - 試しに建てるなら絶対にt2.microを選択しましょう

- **ElasticIP**
    - ちょっと料金体系が複雑です。詳しくは[コチラ][link-10]。
- **NatGateway**
    - 1時間当たり0.062USD(+データ処理料金)
- **RDS**
    - 放置課金界の王。Auroraだとdb.t2.smallで1時間当たり0.063USD
- **ELB**
    - ALBは1時間当たり0.0243USD(+LCU料金)。詳しくは[コチラ][link-11]

[link-10]:https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-ip-charges/

[link-11]:https://aws.amazon.com/jp/elasticloadbalancing/pricing/

# アーキテクチャの設計ミス
最後なのですが、慣れてきたころにやりがちなのが「アーキテクチャの設計ミス」です。

代表的なのが「Lambdaの無限ループ」ですね。S3にアップロードされたファイルをトリガーにして実行すると起こりやすいみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/ce11e99b-eba1-17bf-2787-e60813765338.png)

lambdaの料金

||料金|
|----|----|
|リクエスト|リクエスト100万件あたり0.20USD|
|実行時間|GB-秒あたり0.0000166667USD|

公式も警告文を出していますね。

>Lambda 関数で使用するバケットが、その関数をトリガーするのと同じバケットである場合、関数はループで実行される可能性があります。たとえば、オブジェクトがアップロードされるたびにバケットで関数をトリガーし、その関数によってオブジェクトがバケットにアップロードされると、その関数によって間接的にその関数自体がトリガーされます。これを回避するには、2 つのバケットを使用するか、受信オブジェクトで使用されるプレフィックスにのみ適用されるようにトリガーを設定します。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3.html#services-s3-runaway

Lambda関数の実行ログはCloudWatchlogsに出力されるので、デプロイしてすぐは異常な量のログが吐かれていないかを確認すべきです。

# じゃあ結局初心者は何を気にすればいいの？？？

ここまで事例を交えて高額請求が来ないようにするには大雑把に以下の点に気を付ければ良いと思います。

- **リソース作成前にかかる料金を調べる**
    - 「AWS サービス名」で調べると公式のリソースページがヒットします。
   　<br>最低でも「概要欄・料金」は必ず見ましょう。
![ec2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/e0eb6ca1-3f37-c4b9-02c0-7dcc008487da.png)


- **不要になったリソースは即時削除する**
- **「何のリソースを使っているか」を意識する**
- 安易にキー等シークレットなものを上げない
- 定期的に[マイ請求ダッシュボード][link-12]を確認する
    - ルートに入らなくともIAMユーザから確認できるようにも設定できます。
    ![my請求.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/29615206-00d5-ec07-455b-b017549666e7.png)

[link-12]:https://console.aws.amazon.com/billing/home?region=ap-northeast-1#/

- CloudWatchで請求情報のアラートを設定する

# まとめ
AWSは従量課金制という特徴からコストが青天井なのが怖いところでもあり、便利なところでもあります。
設定や運用は注意して行いたいですね。

また、AWSには設定額以上の請求がある際にアラームが鳴る機能があったり、インスタンスタイプなどの設定自体を定期的にチェックするConfigのカスタムルールなどがありますので、対策を行い高額請求されないようにしましょう。