5 ポイント 投稿者 GN⁺ 2024-01-16 | 1件のコメント | WhatsAppで共有
  • AWSの同一リージョン内におけるアベイラビリティゾーン間転送は、送信・受信の双方にGBあたり$0.01ずつ課金されるため、1TBの直接転送には約$20かかるが、S3を一時的な経由地として使えばコストをセント単位まで下げられる
  • 標準S3バケットはリージョン単位で動作し、AWSがリージョン内の少なくとも3つのアベイラビリティゾーンに複製するため、同一リージョンの複数AZから同じようにアクセスできる
  • EC2が同一リージョンのS3にアップロードし、別のAZからダウンロードするとデータ転送料金は無料で、実際のコストは短時間のS3ストレージ料金とAPIリクエスト料金に絞られる
  • us-east-1で1TBを1時間未満保存する場合、S3 Standardの$23/TB-monthの1/720である約$0.03だけで済み、1PBでも直接転送の$20,000ではなく約$32程度まで下がる
  • この方式はネットワーク転送コードのドロップイン代替ではなく、レイテンシが大きくなる可能性もあるが、コストが最優先の大容量cross-AZ転送では99%以上の削減効果を出せる

AWSのデータ転送コストが膨らむポイント

  • AWSでデータを不用意に移動すると、転送コストはすぐに積み上がる
  • 執筆時点での主なデータ転送料金は次のとおり
    • AWSからパブリックインターネットへ出る転送は、us-east-1でGBあたり**$0.09**、af-south-1でGBあたり**$0.154**までで、1TBの転送コストは$90〜$154になる
    • あるAWSリージョンから別のリージョンへ出る転送は、us-east-1でGBあたり**$0.02**、af-south-1でGBあたり**$0.147**までで、AWSネットワークの外に出なくても1TBで$20〜$147かかる場合がある
    • 同一リージョン内の異なるアベイラビリティゾーン間転送は、方向ごとにGBあたり**$0.01**で、1TBをus-east-1aからus-east-1bへ送ると送信$10と受信$10で合計$20になる
  • インターネット転送とリージョン間転送では、外に出るデータに対するegress料金だけを支払うが、同一リージョン内のAZ間転送では双方向にコストがかかる
  • 複数のアベイラビリティゾーンにリソースを配置する構成は信頼性と可用性を高めるが、異なるAZのリソースがデータをやり取りするとcross-AZコストが発生する

PrivateLinkとVPCエンドポイントの注意点

  • EC2インスタンスから別リージョンのパブリックS3バケットへ1TBを転送すると、期待していたリージョン間転送コスト$20ではなく、インターネットegressコスト$90が発生する可能性がある
  • AWS PrivateLinkとVPCエンドポイントは、リージョン間データがAWSネットワークの外に出ないことを保証するため、価格とセキュリティの面で有用
  • ただし、これらの機能は無料ではなく、固有の制限や料金の詳細がある
  • 関連資料

S3でcross-AZ転送コストを回避する

  • ほとんどのS3ストレージクラスは、バケットをアベイラビリティゾーンではなくリージョン単位で保存する
    • ユーザーはus-east-1aus-east-1bのバケットではなく、us-east-1のバケットにアップロードする
    • AWSは内部的にデータをリージョン内の少なくとも3つのアベイラビリティゾーンに複製する
  • 標準S3バケットのデータは、同一リージョン内のすべてのAWSアベイラビリティゾーンから同じようにアクセスでき、us-east-1aでダウンロードしてもus-east-1bでダウンロードしてもS3から見れば違いはない
  • S3 Standardでは同一リージョン内のダウンロードは無料で、別リージョンやパブリックインターネットへダウンロードする場合は通常のデータ転送料金がかかる
  • S3へのアップロードは、すべてのストレージクラスでデータ転送コストが無料
    • ただしS3 APIリクエスト料金は発生する
    • リクエスト料金は相対的に小さい

1TBと1PBのコスト計算

  • us-east-1aのEC2インスタンスからus-east-1bのEC2インスタンスへ1TBを直接送ると**$20**かかる
  • 同じデータをS3にアップロードした後、別AZのインスタンスがダウンロードすると、アップロードとダウンロードのデータ転送コストは無料
  • 残るコストはS3ストレージ料金
    • us-east-1のS3 StandardストレージはGBあたり月額**$0.023**、つまりTBあたり月額$23
    • 課金は時間単位で計算される
    • データがS3に1時間未満だけ残るように設計すれば、720時間基準で$23の1/720である約**$0.03**になる
    • 転送後はS3オブジェクトを削除する必要がある
  • この計算では、転送コストはGBあたり$0.02から**$0.000032/GB**まで下がり、元の料金の0.15%程度になる
  • 極端な例として、1PB転送は標準的な方式の$20,000ではなく、この方式なら約**$32**で済む

スケーラビリティと制約

  • S3はスケーラビリティが高く、あるAZでアップロードしたオブジェクトを別AZの多数のインスタンスが同時にダウンロードする形にも適している
    • 2つ目のAZにある数千台のインスタンスが同じS3オブジェクトをダウンロードできる
    • S3ストレージ料金は同じまま
    • ダウンロード料金も無料のまま
  • S3オブジェクトサイズには制限がある
    • 単一オブジェクトは5TBを超えられない
    • 5TBより大きいファイルは分割する必要がある
    • 単一アップロードは5GBを超えられないため、より大きいファイルにはマルチパートアップロードが必要
    • aws s3 cpはマルチパートアップロードを内部的に処理する
  • S3 One Zone-Infrequent AccessとS3 Express One Zoneは、データを単一のアベイラビリティゾーンにのみ保存する
    • 保存コストは低いが、可用性面の代償がある
    • us-east-1ではS3 One Zone-Infrequent AccessはGBあたり$0.01、S3 Infrequent AccessはGBあたり$0.0125
    • S3 One Zone-Infrequent Accessは99.5%の可用性、S3 Infrequent Accessは99.99%の可用性を目標に設計されている

実験構成と確認されたコスト

  • 実験ではコストのノイズを減らすため、各パートごとに新しいAWSアカウントを2つ使用した
  • 各アカウントにはus-east-1aus-east-1bにEC2インスタンスを2台置き、us-east-1aのインスタンスで任意の1TBファイルを生成した
  • 2つの方式を比較した
    • 1つ目は、2つのAZのプライベートサブネットを持つVPCでus-east-1bインスタンス上にnetcatサーバーを立て、us-east-1aインスタンスが1TBファイルを直接転送する方式
    • 2つ目は、S3 Gateway endpointを持つVPCでS3バケットを作成し、us-east-1aインスタンスが1TBファイルをアップロードした後、us-east-1bインスタンスがダウンロードして削除する方式
  • AWS無料利用枠が実験結果にわずかに影響する可能性がある
    • S3無料利用枠は12か月間で5GB-months
    • 5GB-monthsは1TB-hoursより小さいが、大きな差ではない
  • Cost Explorerの更新後、直接転送の実験は予想の$20に近い**$21.49**になった
    • 転送を一度中断して再開した点が追加コストの一部を説明する
    • 生成されたファイルは技術的には1024GBなので、基本コストは$20.48
  • S3ベースの転送実験は当初**$0.08**と確認され、データ転送コストは表示されなかった
  • その後、S3ストレージ料金はバケット別に日単位で報告され、Cost Explorerへの反映が他のコストより遅いことが確認された
    • 予想どおり、報告されたストレージ料金は数セント程度
    • S3ストレージ無料利用枠は完全に使い切られた
    • この可能性はFinOpsコミュニティのDieter Matzionが教えてくれた

いつ使う価値があるか

  • AWSはS3データを内部的にアベイラビリティゾーン間で複製しており、そのコストはユーザーが支払うS3ストレージ料金に含まれている
  • S3を経由する方式は、アップロード時点でcross-AZコストを間接的に支払った状態を活用するもの
  • データをS3に長く保存すると、cross-AZの直接転送よりはるかに高くなる可能性がある
  • 転送直後にオブジェクトを削除すれば、目標とする99%のコスト削減が可能
  • 欠点も明確
    • 既存のデータ転送コードのドロップイン代替ではない
    • 直接のネットワーク接続よりレイテンシがはるかに高くなる可能性がある
  • コストが最優先の場合、AWSでcross-AZデータ転送コストを99%以上削減する実用的な方法になり得る

1件のコメント

 
GN⁺ 2024-01-16
Hacker News の意見
  • 私のトリックを共有すると、Lightsail インスタンスを、EC2 インスタンスや S3 バケットなど他の AWS リソースのデータを「プロキシ」するために使える
    各 Lightsail インスタンスには料金に含まれるデータ転送量があり、$3.5 のインスタンスは 1TB、$5 は 2TB、$10 は 3TB、$20 は 4TB、$40 は 5TB を提供する
    転送量あたりの価格では、$10 インスタンスの 3TBが最も良い
    記事のデータを基準にすると、EC2 で 3TB のトラフィックは us-east-1 で $276.48、S3 バケットでは $69 かかる
    欠点は、Lightsail ではインバウンドとアウトバウンドのトラフィックがどちらも「トラフィック」として計算されること

    • https://aws.amazon.com/service-terms/
      AWS の規約 51.3 によると、他サービスのデータ料金を回避する形で Amazon Lightsail を使ってはならないとされている
      例えば、他サービスからパブリックインターネットや他の送信先へネットワークトラフィックをプロキシしたり、ロードバランシング/CDN サービスを通じて過度にデータを処理したりする場合が該当し、違反時にはデータサービスの制限やアカウント停止の可能性がある
    • もう一つの方法として、CloudFront 無料利用枠を使えば AWS から毎月 1TB を無料でダウンロードできる
      S3 や任意の HTTP サーバーをオリジンに指定すればよい
      以前は最初の 12か月間だけ月 50GB だったが、Cloudflare が https://blog.cloudflare.com/aws-egregious-egress を公開した直後に、永続的な無料 1TB に変更された
    • 細かく見ると、$5 で 2TBのほうが $10 で 3TB よりさらに良い
    • 良いトリックではあるが、AWS 規約のため火遊びに近い
  • GCP も 2023 年に似たような抜け穴を塞いでおり、おそらく一部の顧客が悪用したためだと思われる
    この方法が十分に広まれば、AWS も同じことをするだろう
    https://cloud.google.com/storage/pricing-announce#network

    • 可能性は低そう
      GCP が塞いだ「抜け穴」は、GCS で同じ大陸内のリージョン間データ転送を無料でできたことだが、AWS ではすでに有料
      元記事で言っているのは、同じリージョン内のアベイラビリティゾーン間転送にも GB あたり $0.02 がかかり、それを回避できるという内容
    • GCP からデータを無料で取り出す方法は知っているが、実際に試したことはない
      この情報を買ってくれる相手が見つかるのか気になる
    • これは抜け穴というより、AWS が S3 を最適化しており、EC2 インスタンスが S3 をストレージとして使うことを意図しているように感じる
      ただし転送の窓口として使うことは想定していないかもしれず、データをそこに入れて置き続けることを期待している側に近い
  • コストを減らしてリソースを無料で得るこうしたトリックは非常に多い
    賢いが、信頼はできない
    OSS リポジトリを通じて GitHub Actions で暗号資産マイニングをさせるようなハックと同じ種類のもの
    面白いハッキング練習程度に扱うべきで、こうした解決策を本番環境にデプロイしないほうがよい
    少なくともアカウント担当者の承認を得るべきで、そうでなければある日 AWS アカウントが終了された状態で目覚めるリスクがある

    • この方法や他の手法を何年も使ってきたが、一度もブロックされたことはない
      S3 を経由する方式は、複数の送信先にデータを配布する際に同期プロセスを回すよりも一般に効率的でもある
  • S3 ストレージ費用は GB-月単位で請求されるので、1TB × GB あたり $0.023 ÷ 月 730 時間なら、バケットに 1 時間置いた場合は約 3 セントになるはず
    ただしほぼすぐに削除されたようなので、データが 1 分ほど存在したなら 0.03 ÷ 60 程度かもしれない
    通常は AWS がこれを $0.01 に切り上げると予想する
    コストと使用状況レポートの TimedByteStorage の値が最終判断基準になる
    https://handbook.vantage.sh/aws/services/s3-pricing/

  • S3 も良いトリックだが、さらに他にもある
    大口の AWS 顧客、例えば年 $100 万以上使う顧客なら割引を求めることができる
    かつてはアベイラビリティゾーン間転送の割引が非常に大きかった
    可能な限り 1 つのアベイラビリティゾーンに集約するのも方法
    DB は「b」ゾーンにあり、唯一のサーバーは「a」ゾーンにある構成は、単に 1 つのゾーンに標準化するよりも悪い
    複数のアベイラビリティゾーンを使う場合は、負荷を認識したアベイラビリティゾーン・バランシングを行う必要がある

    • 「DB は b ゾーン、唯一のサーバーは a ゾーン」のような構成が使われるケースはあるだろうが、想像しにくい
      コストのためか? しかしコスト削減にもなっていないように見える
    • 4つ目として、S3 Intelligent-Tiering ストレージクラスを有効にすることもできる
  • これは技術版の租税回避のように感じる
    あまりに多くの人がこうすると、AWS は「単に抜け穴を閉じる」だろう
    AWS は一つではなく、それぞれ KPI を持つ数十、あるいは数百の AWS に近い
    あるチームは支出を減らしてほしいと思っているが、実際に支出を減らす方法までは教えてくれない
    AWS のように十分複雑なものを作ると、すべてが相互に絡み合っているため、顧客が特定の一要素だけを最適化するのは不可能になる

    • これは抜け穴ではなく意図された設計
      AWS は特定のサービスを特定の方法で使ってほしいと考えており、だからそのように使うと非常に安くなるようにしている
      S3 エンドポイントを使うことも、AWS が S3 サービスを使ってほしいと考える方法の一つ
      CloudFront も別の例
      AWS は CloudFront を使ってほしいので、CloudFront を他のデータアウトバウンドより安くしている
  • 複雑なクラウドコスト最小化システムの代替案は、単にクラウドを使わないことだ。
    自前でホスティングするか、GBあたりのアウトバウンド料金が0セントのCloudflareを使えばいい。
    あるいは、ずっと安い複数のVPSホスティング事業者からクラウドサーバーを借りて、GBあたり9セント、12セント、17セントずつ金を吸い上げながらロックインを促す高価で複雑なクラウドサービスを使わなければいい。
    本気で言うが、クラウドコストを精密に分析しなければならない段階に来ているなら、クラウドを捨てることを検討すべきだ。

    • 精密なクラウドコスト分析をしているなら、むしろクラウドを正しく使えているということだ。
      ほかの場所では、そうした分析自体がまったく不可能だからだ。
      オンプレミスに行けと言う人たちは、データセンターをホームラボのように扱わない人の人件費がどれほどかかるのか分かっていないように思う。
      Apple iCloudですらAWSとGCPを使っているのは、経済的だからだ。
      クラウドを使いこなせないからオンプレミスに戻るべきだと思っているか、信頼性にあまり関心がないのだろう。
      10Gを超えるDDoS防御コストから計算してみて、それでもクラウドのほうが高いと言ってみてほしい。
      私たちはAWSの帯域幅に10万ドル以上使っているが、3つのアベイラビリティゾーンを管理するネットワークエンジニアの費用を払わずに済むので、専用インターネット回線よりも依然として安い。
    • 「クラウドコストを精密に分析する段階ならクラウドを捨てろ」というのは、そもそもクラウドを使う理由の一部を失うという意味になる。
      多くの組織がクラウドベースのホスティングへ移る理由は、数ある利点の中でもFinOpsとコスト統制をはるかに深く行えるからだ。
      インフラによっては、ストレージやコンピューティング需要が変動するなら、クラウドベースの解決策がうまく合うことがある。
      結局は道具にすぎない。
      本番のベアメタルサーバーにSSHで入り、ソフトウェアを更新し、ファイアウォールを管理し、ストレージを確認していた職場でも働いたし、ホスティングの大半をクラウドプロバイダーで処理していた職場でも働いた。片方からもう片方への移行も経験した。
      「クラウド」はベアメタルサーバーやVPSより良い/悪いものではなく、ユースケース次第だ。
      なぜ片方のほうが適しているのかデューデリジェンスを行い、環境が変わるたびに再評価すればいい。
      こういう「クラウドは悪」的な態度は幼稚だ。
    • 記事の解決策は比較的適用しやすい。
      すでにAWSにロックインされているなら抜け出すにはかなり費用がかかるし、場合によってはこの方法が良い中間地点になり得る。
    • 自前でホスティングするには、実際にクラウドの機能、つまりマネージドサービスを使っている場合、多くの会社にはない能力を持つIT部門を作らなければならない。
      そのコストは多くの場合、削減額を簡単に相殺したり上回ったりする。
      だからこそ、企業がクラウドを選ぶのがあまりに当然の判断になった大きな理由でもある。
    • このケースでは「自前ホスティング」は役に立たなかったように思う。
      AWSはこの事例では赤字で運用しているように見える。
      筆者はAWSの料金体系の抜け穴を見つけたので、これほど安いのだ。
      自前でやっていたら、もっと高くついた可能性が高い。
      AWSの料金がなぜこうなっているのかは推測するしかないが、あるサービスを別のサービスより多く使わせる目的である可能性が高い。
  • 帯域幅を多く使うユーザーなら、Leaseweb、PhoenixNAP、Hetzner、OVHのようなところを見てみる価値がある。
    帯域幅の価格がばかばかしいほど安い。
    以前、標準価格では会社として成り立たない状況なのに、AWSの営業担当者が帯域幅の価格をまったく下げてくれないという奇妙な状況があった。

    • それはかなり例外的な気がする。
      転送料金はたいてい交渉可能な項目に見える。
  • もう一つのトリックはECRを使うことだ。
    毎月インターネットへ5TBを無料転送できる。
    コンテナイメージは公開でなければならないが、内容は暗号化できる。
    Glacierにメディアアーカイブを保存するときに便利だ。

  • AWSがこんな途方もないデータ転送料金で人々から搾り取り続けられるのが理解できない。
    すぐ横にCloudflare R2が100倍は良い条件を提供しているのに。

    • データには「重力」がある。
      データがある場所に縛り付け、重力から抜け出すにはお金がかかるように、データを移すにはお金を払わなければならない。
    • すべてのVMとコンテナがAWS上にあり、S3がどんな言語・フレームワーク・構成でも非常に堅牢にサポートされていると、チームに別のオブジェクトストレージ業者を使おうと求めるのは本当に難しい。
      R2でデータ損失や転送の遅さのような問題が起きれば、私が非難されるか、少なくとも助けを求められることになる。
      一方でS3がデータを失ったり、特定のケースで遅かったりすると、人々は私たちの使い方が何か間違っているのだと考え、改善方法を見つけ出す。
      誰も非難されない。
      正直、事業が何らかの価値を生んでいるなら、データ転送料金は無視できる程度で、わざわざ最適化する必要はない。
    • 帯域幅をかなり使うSaaSの新機能をR2で作ったが、とてもよく動いている。
      削減額も本当に大きい。
      AWS-SDK(Node.js)をそのまま使い、R2のエンドポイントだけを使っている。
    • CloudflareはAWSよりずっと信頼していない。
      データがAWSに入れば、同じリージョンにあるすべてのアプリケーションが転送料金なしでデータを使える。
      また、記事で引用されている価格は表示価格であり、顧客が契約で帯域幅を前払い購入すれば、はるかに安くなる。
    • R2はまだかなり新しい。
      実運用で性能と可用性がどれほど良いのか、よく分からない。
      特に耐久性は判断が難しい、あるいはほぼ不可能だ。
      S3にははるかに長い歴史と実績があり、その点で利点がある。
      すでにすべてがAWS内にあるなら、データを近くに置いておける利点もある。
      データの使い方によっては、アウトバウンドコストが常にそれほど大きな費用とは限らない。
      ただし、実際に相当なアウトバウンドトラフィックを生み始めると、あり得ないほど高くなる。
      R2のような競合が、合理的に競争力のある信頼性と性能を提供できるなら、シェアを伸ばすと予想している。