はじめに
S3へのアップロードって確か無料だよねぇ、EC2のデータを日時バックアップしちゃえ。
と思って構築してたらめっちゃ課金されてしまった話です。
まずはこちらを・・・
ザ・原因
すぐに原因調査です。こちらの記事を参考にさせていただきました。(感謝!)
EC2からS3へアクセスする4つのルートとコスト
ざっくりまとめるとこんな感じです↓↓
(1)Internet Gateway→無料
(2)NAT Gateway→有料
(3)VPC Endpoint(Gatewayタイプ)→無料
(4)PrivateLink(Interfaceタイプ)→有料
で、現状の環境は下記のような感じ↓↓
EC2からS3に通信するとき、一旦リージョンを抜けて(オンプレ側のカスタマーゲートウェイを経由して)いるので、この辺りで課金されているのかなと。
対策
先ほどの記事では、(1),(3)が無料なので、どちらかを採用します。
今回は、プライベートな環境なので(1)は採用できません。
よって(3)の構成にしていきます。
ということで早速構築してみました。
※VPCエンドポイントの作成手順は省略します。参考にした記事はこちらです↓↓(感謝!)
VPCエンドポイント経由で S3 にアクセスする
で、重要なのがここからです。
①の通信は止めつつ②の経路で通信するようにしなくてはいけません。
これをバケットポリシーで制御します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::[バケット名]",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "[IPアドレス]/32"
},
"StringNotEquals": {
"aws:sourceVpce": "[VPCエンドポイント名]"
}
}
}
]
}
↑↑VPCエンドポイントからの通信のみを許可するように設定しました。
ちなみに特定のIPアドレスからも通信を許可するようにしていますが、これはオンプレ側のグローバルIPです。
これを入れておかないと、マネジメントコンソールでバケットの操作ができなくなる可能性がありますので十分ご注意ください!
動作確認
許可されていないソースからAWS CLIで確認コマンドを実行してみると、
$ aws s3 ls s3://[バケット名]/
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
通信が拒否されていることがわかります。
以上!
おわりに
AWSの料金体系っていまだにちょっとわからない部分が多くて、いつも恐る恐るコストエクスプローラーでチェックしています^^;