先日、このようなツイートをしたところ想像以上の反響がありました。せいぜい10いいねつけばいいかなって思っていたのですが、1,000いいね以上もついてかなり吃驚しています。
twitter.comAWSのネットワーク・データ転送料金がひと目で分かる図を作った。Direct ConnectとGlobal Acceleratorは描ききれんかった・・・ pic.twitter.com/97RM8fxgbe
— shu1 (@ohsawa0515) 2020年1月30日
ありがたいことにフィードバックをいただきましたし、この図だけでは説明できないことも多くあったので、図の修整と補足についてブログ記事にしました。なお、この内容は2/29 技術書典8に頒布する「AWSコスト最適化入門」の一部を転載したものです。
おことわり
- 2020年1月現在、東京リージョンの料金を載せています。今後料金が変更になる可能性があります
- AWS料金表やドキュメント、Blackbeltシリーズの資料を読んで私なりに解釈した部分があります。そのため誤りが含まれるかもしれませんのでご容赦ください。
データ転送料金
AWSのデータ転送料金はEC2の料金ページに細かに書かれていますが、携帯料金プランのようにとても分かりづらいです。わかりやすく図にしたものが下図になります。Twitterに載せたものを改善しています。
「いっぱいあってわからん!」という人はAWSへの受信(イン)は料金が発生しない、AWSからの送信(アウト)は料金が発生する、なんらかのゲートウェイを経由するとデータ転送量に応じた料金が発生する の3つは最低限おさえてください。細かいことが分からなくても、これを知っておくだけでコストへの意識が変わります。知らないと請求書を見て吃驚することになります。
データ転送料金がかからないのは次の場合です。ただし、2はPrivatelinkエンドポイント経由で通信した場合はPrivatelinkの料金が別途発生します。
- 同じリージョン、AZにあるEC2、RDS、Redshift、ElastiCacheのインスタンス同士の通信(イン/アウト)
- 同じリージョンにある、S3、DynamoDB、SES、SQS、Kinesis、SNSとEC2との通信(イン/アウト)
- 同じリージョンにある、ロードバランサ(CLB/ALB)とプライベートIPアドレスを用いての通信(イン/アウト)
- EC2(オリジン)からCloudFrontへの送信(アウト)
料金が発生するケースで見落としがちなのは次の場合です。
- AZが異なるEC2、RDS、Redshift、ElastiCacheのインスタンス同士の通信(イン/アウト)
- パブリックIPアドレスを付与しているEC2/ELBへの通信(イン/アウト)
- リージョンが異なるEC2、S3などへの送信(アウト)
- S3からインターネットへの送信(アウト)
- CloudFrontからインターネットへの送信(アウト)
- CloudFrontからオリジンサーバへのデータ転送(イン)
可用性を向上させるために複数のAZにEC2を分散させるのがAWSのベストプラクティスですが、AZをまたぐ通信に対して1GBあたり$0.01かかります。
同じAZ同士であってもパブリックIPアドレスが付与されているEC2に通信すると受信(イン)でも料金が発生します。
4について画像やHTMLファイルなどをS3に配置して公開している場合は、ユーザーからアクセスされるたびにデータ転送料金が発生します。画像ファイルは圧縮や画質を落とすなどしてファイルサイズを減らすとよいです。また、GCS(GCPから提供されているストレージサービス)へデータ転送できるStorage Transfer Serviceを用いてS3からGCSにデータ転送するときも転送料金が発生するので注意が必要です。
6はCloudFrontがオリジンサーバへのデータ取得(オリジンフェッチ)は料金がかかりませんが、DELETE、OPTIONS、PATCH、POST、PUTリクエストまたはWeb Socketの場合は、CloudFrontからオリジンサーバへのデータ転送となり、1GBあたり$0.06かかります。
AWS(EC2)からAWS外(インターネット)への送信(アウト)の料金はデータ転送料金に応じて1GBあたりの料金がさがります。
データ量 | 料金 |
---|---|
1GB/月まで | $0.00/GB |
1GB〜9.9999TB/月 | $0.114/GB |
10〜40TB/月 | $0.089/GB |
40〜100TB/月 | $0.086/GB |
150TB/月〜 | $0.084/GB |
Amazon VPC
VPC自体の料金はかかりませんが、VPCに関連するサービスを利用することで料金が発生します。VPCピアリングはトラフィックを暗号化してプライベートIPアドレスでVPC同士を通信できる機能です。VPCピアリング接続によって1GBあたり$0.01かかります。
AWS VPN
本記事ではAWSサイト間VPN(Site-to-Site VPN)を「VPN」と表記しています。VPN接続ひとつにつき、1時間あたり$0.048の利用料金がかかります。さきほど説明したデータ転送料金がかかります。ちなみに利用料金が発生するのはVPN接続が「利用可能」状態になっている間で接続不可になっている間は料金が発生しません。
AWS Transit Gateway
AWS Transit Gateway(以下、Transit Gateway)はVPC、オンプレミスとの接続を簡単にできるサービスです。VPC、AWSアカウント、オンプレミスの接続をひとつのゲートウェイですべてまとめることができます。Transit GatewayはVPCピアリング、VPN、Direct Connect(専用線サービス)とアタッチすることができ、複数のAWSアカウント、VPCにまたがって通信することも可能です。
Transit Gatewayはアタッチメントに対する時間とTransit Gatewayを通過し処理されたデータ量によって料金が決定されます。
- アタッチメントひとつにつき$0.07/時間
- データ処理量1GBにつき$0.02
たとえば、さきほどの図のようにTransit GatewayにVPCとVPNがアタッチされていて、1GB/月データ処理されたとします。アタッチメントおよびデータ処理量にかかる1ヶ月分の料金は次のとおりです。
- アタッチメント:$0.07×2×24時間×31日=$104.16
- データ処理量:$0.02/GB×1GB=$0.02
さらにVPN接続ひとつにつき$0.048/時間がかかるため、総額$139.89かかります。
$104.16+$0.02+$0.048×1×24時間×31日=$139.89/月
AWS NAT Gateway
AWS NAT Gateway(以下、NAT Gateway)はフルマネージドのNATゲートウェイです。プライベートサブネットに配置されているEC2、AWS Lambdaがインターネットへデータ転送するときはNAT Gatewayが便利です。
NAT Gatewayの料金体系はゲートウェイ利用時間とデータ処理量の2つです。
- ゲートウェイ時間:ゲートウェイひとつにつき$0.062/時間
- データ処理量:$0.062/GB
たとえば、3つのAZそれぞれのパブリックサブネットにNAT Gatewayを配置し、それぞれ10GBのデータを処理したとします。1ヶ月にかかる料金は次のとおりです。
- ゲートウェイ時間:$0.062×3×24時間×31日=$138.38
- データ処理量:$0.062×10GB×3=$1.86
さらにインターネットへのデータ転送料金がかかります。
- $0.114/GB×(30GB-1GB)=$3.30
総額$143.54かかります。
$138.38+$1.86+$3.30=$143.54/月
このようにNAT Gateway経由でインターネットへの通信だとNAT Gateway料金に加えデータ転送料金が上乗せされます。ゲートウェイ時間料金も十分高いのですが、システム規模がある程度大きくなるとデータ処理料金の方が格段に大きくなっていきます。コストを最適化するには「NAT Gatewayをいかに経由させないか」を考える必要があります。
注意しなければならないのは、プライベートサブネットにあるEC2からS3やDynamoDBなどAWSリソースへの通信もNAT Gatewayを経由した場合はデータ処理料金が発生します。「うちはインターネットへの通信をあまりしないから大丈夫」と思っていてもS3やDynamoDBにアクセスしていたら場合によっては多額の請求が発生する可能性があります。これを防ぐにはゲートウェイタイプのVPCエンドポイントを設定すればよいです。NAT GatewayからVPCエンドポイント経由にすることで料金がかからなくなります。S3、DynamoDBはゲートウェイタイプのVPCエンドポイントなので設定してもデータ通過しても料金はかかりません。他のAWSサービスの場合はPrivatelinkによるインタフェースタイプのVPCエンドポイントを活用するとよいでしょう。PrivatelinkによるVPCエンドポイントを作成すると時間料金とデータ処理料金が発生しますが、NAT Gatewayより安いです。
トラフィック送信先がAWSネットワーク以外である場合は、インターネットゲートウェイ経由にできないかを検討してみてください。インターネットゲートウェイ経由だと料金はデータ転送料金のみです。
開発環境の場合は、複数のAZにNAT Gatewayを配置せずひとつにするか、EC2インスタンスをNATインスタンスとして置き換えができないか検討してください。
NAT Gatewayはネットワーク帯域や死活監視をほとんど考慮しなくても使えるとても便利なサービスですが、利便性に甘えて何でもかんでもNAT Gateway経由にしてしまうと痛い目にあうので、利便性とコストとのバランスをみて活用してください。
AWS Privatelink
AWS Privatelink(以下、Privatelink)はAWSリソースへのトラフィックをプライベートで通信できるサービスです。インターネットへの通信が禁じられているサービス要件であってもAWSリソースへの通信をしたいときに有効です。Privatelinkによって作成されるVPCエンドポイントをインタフェースタイプVPCエンドポイントと呼ばれます。インタフェースタイプVPCエンドポイントはプライベートIPアドレスが付与されたENIがサブネットに作成され、ENI経由で通信します。もうひとつのRoute Tableで送信先を指定するゲートウェイタイプとは同じVPCエンドポイントでもタイプが異なります。
ゲートウェイタイプVPCエンドポイントは作成・利用は無料ですが、インタフェースタイプは時間料金と処理データ量による料金が発生します。
- VPCエンドポイントひとつにつき$0.014/時間
- 処理データ量:$0.01/GB
Privatelinkのメリットはセキュアに通信できるメリットに加えて、NAT Gatewayを経由する必要がないため大量のAWS APIを叩くケースではPrivatelinkした方がコストをおさえることができます。
まとめ
本章はAWSでもっとも分かりづらいと思われるネットワーク・データ転送の料金についてまとめました。図にするだけでも相当に複雑でAWS初心者は諦めてそのままにしてしまっている人もいるかもしれません。
2/29 技術書典8に頒布する「AWSコスト最適化入門」はネットワーク料金以外にEC2 RI、Savings Plans、S3などのAWSサービスのコスト最適化ポイントを解説します。さらにAWS Well-Architectedフレームワークに則ったコスト最適化についても書く予定です。ぜひチェックしてみてください!
twitter.com宣伝です。2/29 #技術書典 い13 で「AWSコスト最適化入門」という本を出します。
— shu1 (@ohsawa0515) 2020年1月31日
AWSのネットワーク、EC2 RI、Savings Plansや、AWS Well-Architectedフレームワークに則ったコスト最適化についても書く予定です。ぜひサークルチェックしてみてくださいね!https://t.co/sKPlKPgxFd