1 ポイント 投稿者 GN⁺ 2024-11-15 | 1件のコメント | WhatsAppで共有
  • AWS AmplifyのOpenSearch連携公式ガイドで試した後、利用量は多くなかったにもかかわらず、Amazon OpenSearch Serviceの費用が1か月で**$1,124.88**まで増加
  • 費用の原因は、npx ampx sandboxが作成したOpenSearchドメインがサンドボックス終了・削除後も残り、次回実行時に新しいドメインが追加されて累積したため
  • 公式構成ではデフォルトでr5.large.searchインスタンスが作成されるが、最低でも月額$134レベルのこのデフォルト値がボイラープレートコードやガイドで明示されていなかった
  • AWS SupportはOpenSearchとストレージについて一度限りのクレジットを提供し、再発防止のためAWS Budgetsの設定を求めた
  • AmplifyとOpenSearchを併用する際は、サンドボックス削除後に残ったリソースとデフォルトのインスタンスタイプを自分で確認しないと、予期しない課金を避けられない

予期しないOpenSearch課金

  • AWS AmplifyでOpenSearch連携公式ガイドに従って作業した後、数週間後にAWSの請求書が**$1,200超**になっていた
  • Supportへの問い合わせで特定されたサービスはAmazon OpenSearch Serviceで、1か月の合計額は**$1,124.88**だった
  • 2020年にもAmplifyとOpenSearchを使った経験があり、個人用途では通常月$50程度で高いとは感じていたが、$1,200レベルではなかったという
  • AWS Customer Supportは詳細な調査の後、予期しない費用についてone time courtesyとしてbilling adjustmentを処理した
  • Support対応の過程でOpenSearchとストレージサービスのクレジットが提供され、AWS Budgetsの設定も求められた
    • AWS Budgetsは特定サービスまたはAWS全体の今後の支出を予測し、予算超過が見込まれると通知を送れる

公式ガイドが生成するリソース

  • Amplifyのquickstartでは、AWS提供のコードでTODOノート用の簡単なアプリを作成し、AmplifyがDynamoDBデータベースと認証付きCRUDリクエストを生成する
  • ローカル実行も可能だが、Amplifyはアクセス可能なドメインもあわせて作成する
  • OpenSearch設定の段階では、Amplifyリソースを宣言するためのTypeScriptボイラープレートを記述する
    • DynamoDBテーブルを変数として保持し、pipelineで参照する
    • OpenSearchインスタンス、index、indexMappingを作成する
    • OpenSearch上のデータにアクセスするクエリを記述する
    • DynamoDBからOpenSearchへコピーするOpenSearchIngestionService pipelineを作成する
  • 関連構成はフロントエンドコードと一緒に、リポジトリ内のTypeScript/JavaScriptとして管理される
  • npx ampx sandboxはAWSサービスを起動し、構成変更を検知して既存のAWSサービスを自動的に修正する

サンドボックス削除後も残るドメイン

  • この構成にはDynamoDBデータベース、OpenSearchサービス1つ、OSIS pipeline1つ、IAMロールなど複数のリソースが含まれる
  • 公式ボイラープレートはデフォルトでr5.large.search OpenSearchインスタンスを作成する
    • このデフォルト値はボイラープレートコードやガイド内で明示的に示されていなかった
    • r5.large.searchは最低でも月額$134かかる
  • 1日の作業を終えてCTRL-Cでsandboxを停止すると、完全に削除するかを尋ねるプロンプトが表示され、ユーザーはYを選べる
  • このときDynamoDBは削除されるが、AWSコンソールで見るとOpenSearchドメインはそのまま残っている
  • 翌日にnpx ampx sandboxを再実行すると新しいOpenSearchインスタンスが作成され、npx ampx sandbox deleteでも元のインスタンスは削除されない
  • 同じ手順を繰り返すと、同一プロジェクトに複数のOpenSearchドメインがバックグラウンドに残り、費用が積み上がる

バグの可能性とデフォルトのインスタンスタイプ

  • この挙動は大きなfootgunに見え、AWS Supportチケットの後も当時は解決されていなかった
  • 関連する古いバグ報告はあったが、1年以内の項目は見つけられなかった
  • OpenSearchドメインがv1では正しく削除され、v2ではそうでない可能性はあるが、確定した原因ではない
  • 現在のフローはAmplify CLIではなく、npx経由で実行される
  • r5.large.searchがデフォルトのマシンタイプである点も危険要因として残る
    • デフォルト値を持たせず必須フィールドにしたほうがよいと考えられる
    • ガイドがr5.large.searchをデフォルト値として表示していれば、ユーザーはより認識しやすい
    • このデフォルト値はAmplify専用ではなくAWS CDKの一部であるため、Amplifyチームだけの責任とは見ていない

AmplifyとOpenSearchを使う際の注意点

  • 新しい技術の開発速度を高めるツールがbare metalより高価になり得ることは予想していたが、今回の費用はその範囲を超えていたという
  • AWSのbudgetコンソールを使えば、予想支出が予算を超える際に警告を受け取れる
  • OpenSearchセクションだけを進めても、IAMアカウント、OpenSearchドメイン、OSIS pipeline、log group、S3 storageが作成され、隠れたリソースが多い
  • OpenSearchは企業顧客がよく使うサービスであるため、「高度な」サービスと見なされ、ユーザーがAWSエコシステムをより深く理解している前提があるのかもしれない
  • geo_point bounding-boxクエリ対応のためOpenSearchを使ったが、もっと単純な製品で代用できたかは確信が持てない
  • 更新によるとAWSガイドはその後修正され、最初に問題提起した3か月前には更新されていなかったが、記事公開前にはドキュメントPR作業が始まっていたようだ

1件のコメント

 
GN⁺ 2024-11-15
Hacker Newsのコメント
  • 課金アラートは冗談みたいなもので、実際に必要なのはハードな支出上限
    オンボーディング中にその上限を設定する方法も提供すべきだ
    白紙委任と偶発的な課金の上にビジネスを築くのは胡散臭く、導入障壁も高い
    開発者が「20分のチュートリアルに従ったら一生かけて貯めた金額並みを請求され、今回はカスタマーサポートが免除してくれたけど次は家まで持っていかれそうだった」みたいな事例を見るほど、AWS製品を試したいと思えなくなる

    • これはAWSだけの問題ではなく、クラウド事業者は大きく二種類しかないように思える
      AWSやDigitalOceanのようなリスクを顧客に押しつけるところと、怪しげな「無制限」「メータリングなし」料金プランを売るところだ
      どちらも望んでいる形ではない
      明確で文書化された上限のもとで適切に容量計画ができ、可用性リスクは顧客が負うとしても金銭的リスクは提供側が負う事業者があってほしい
      法外でなければ、より高い固定料金を払ってもよい
    • ハードな支出上限は、AWSの中核顧客であるエンタープライズ顧客にとっては逆効果に近い
      重要なアプリケーションでダウンタイムやデータ損失を発生させるより安い偶発課金など、ほとんど存在しない
      たとえオプションであっても経理部門が利用を強いる可能性があり、問題が起きた際にデータ損失事故につながる危険がある
      インディー開発者や中小企業中心のクラウド事業者には理にかなうかもしれない
    • AWSの課金コードは巨大なスパゲッティコードなので、大きな変更に手を入れることを社内で非常に恐れている、という話がHNコメントで何度も出ていた
      ここで知った内部事情の中でもかなり興味深い部類だ
    • AWSには関心があったが、こうした理由で一度も本格的に足を踏み入れられなかった
      後悔するより、安くて定額のVPSを使うほうが安全だ
    • 規制すべきだ
      Amazonに何かしてくれと頼んでも大して意味はない
      Amazonや他社がユーザーの金を尊重するよう、法律で強制すべきだ
      企業は基本的に倫理的によいことや経済にとってよいことではなく、金になることをする
  • 比べれば些細な話だが、ECSにアプリをデプロイしようとして100ドルの請求を受け、AWSは二度と使わないと決めた
    サービスが立ち上がらないエラーは自分のアプリ側の問題だったが、CloudWatchのログが2割程度しか出なかったため、ログを得るために5回再デプロイして修正し、その後さらに5回再デプロイする必要があった
    失敗したデプロイのたびに課金され、2日ほど苦労した末にアカウントを削除してDigitalOcean App Platformへデプロイした
    そこでもアプリのエラーでデプロイは失敗したが、ログは毎回出力され、10分以内に修正して動かせたし、請求総額は数セントだった
    あの日以来、選択肢があるならAWSは絶対に使わないし、勧めもしないと心に決めている

    • Azureしか使ったことはないが、ECSはAzure Container Appsに相当するようだ
      開発・テスト用途では従量課金モデルが非常に安かった
      大規模ワークロードではどうか分からないが、デプロイのたびに課金されるというのは妙だ
    • GCPのようにコンテナを直接EC2にデプロイできないと知ってAWSを諦めた
      大きなプロジェクトならサポートはよりよいのかもしれないが、小規模から中規模ならGCPのほうがずっとよい
      今どきのコンテナ利用に合った基本コンポーネントがあり、BigQueryもある
  • そのnpxコマンドが実行するスクリプトには明らかなバグがあるように見える
    投稿者の言う通り、チュートリアルであるなら100%最も安いリソースを選ぶべきだし、deleteサブスクリプトを実行したならリソースを片づけるべきだ
    こういうものを実行したあとで、開発者がAWSアカウント全体を被害妄想的にくまなく調べ回り、取り残されたリソースを探すことを期待するのは不公平だ
    スタートアップがこんな動きをしていたら、「こういうことは起こり得るから気をつけるべきだ」で済ませていただろうか
    なぜAWSには別の基準が適用されるのか分からない

    • AWSで最も腹立たしい点がまさにそこだ
      現在自分が料金を払っているすべてのリソースを簡単に確認する方法がない
      仮にあるとしても見つけられていない
      分かりやすい概要がなければ、自分のアカウントを完全に統制できていないように感じる
    • 新しいものを使う必要があるとき、最初に確認するのは毎月固定請求額にできるかどうかだ
      それ以上使ったらどうなるのか、予期しない課金を制限できるかも見る
      できないなら別のものを探す
      数年前のGoogle Mapsの課金変更以降、「無料」のGoogleサービスに深く依存させられることにも非常に慎重になっていて、結局かなりの費用がかかった
    • AWSアカウント内に存在するすべてのリソースを簡単に列挙する方法は本当にあるのだろうか?
      いつもサービスごと、リージョンごとに確認しなければならず、退屈でミスも起きやすかった
    • Amazonの立場からすれば、簡単に1000ドル稼げるのだからバグではなく機能だ
      たとえバグだと考えていたとしても、自社の損益に直接打撃を与えるほかの案件よりはるかに優先度が低いだろう
    • 開発者に被害妄想的な点検を期待するのは不公平だという点には同意する
      ただ、現実的には合理的でもある
      AWSで何かを作るときは、AWSを暴走した敵対的な金融機関のように扱っている
  • こうした事例のせいで、何年も AWS を掘り下げて学ぶのを先延ばしにしている
    クレジットカード情報を要求せず、人々が無料で試せる標準的な教育コースが必要だ
    その代わりに、「ユーザーのミス」であちこちから数千ドルを引き出せると計算している事務方がいるように見える
    こうした課金は争うのも難しく、場合によってはまったく不可能だ
    巨額の請求書が来るかもしれないというもっともな恐怖のせいで AWS 環境を避けた人は、私だけではないはずだ

    • こういう状況で AWS が返金しないのはかなり異例なので、ユーザーのミスから数千ドルを搾り取る戦略だと見るのは難しい
      正確で安価なチュートリアルを提供するより、返金対応のほうが負担が小さいと判断している可能性が高い
      それで行動が正当化されるわけではないが、AWS Textract を使って正当に発生した 600 ドルの請求さえ取り消してもらえたことがある
      当時私は数十億ドル規模の企業で働いていた
    • 人々がこうした請求トラブルにはまるのは、実際には AWS を深く掘り下げていないからだと思う
      料金表は簡単にアクセスできるし、いつも分かりやすいわけではないが、ほとんどのコストはほぼ線形に増えるのでテストは比較的しやすい
      AWS Amplify、CloudFormation、各種 Stack 系のようなラッパーサービスは避けたほうがいい
      コアサービスを直接使えばいい
      すべてのサービスには API があり、IAM ユーザーに紐づく API キーを受け取るのはボタンをクリックするくらい簡単だ
      あとは適切なキャッシュと、コストモデルを売上モデルに合わせることで管理できる
      自動スケールするサービスのコストが、現在の需要に関係なく売上のほぼ固定比率になるようにすればいい
      帯域幅は AWS では本当に悪夢だが、コンソールで自動の長期割引が提供されるし、営業担当を通せば少し良い契約割引も得られる
      このため EC2 は避けており、EC2 の内部帯域もより高いので、Lambda + S3 + CloudFront を直接使うほうがよいと思っている
      3 か月ほど経つと、新しいユーザー向け機能を実装するときにどのサービスの組み合わせが最も費用対効果が高いか、かなり簡単に予測できるようになった
    • A Cloud Guru / Pluralsight には「Cloud Playground」や「sandboxes」と呼ばれる機能がある
      そういう用途向けのものかもしれないが、自分では使ったことがないので確実ではない
    • この種のユーザーミスで生じる収益は、AWS 全体から見れば雀の涙だろう
      私の経験では AWS は、評判の悪化でもっと大きなコストが発生する問題を避けようとする側に近かった
      AWS は安くはないし、場合によっては特にデータ転送コストのようにとてつもなく高いが、顧客をだまして数百ドル余計に偶発的支出をさせるのが彼らのやり方だとは思わない
  • いかにも AWS らしい
    数か月前に Llama 2 を動かそうとして公式のSageMaker クイックスタートガイドに従ったら、本当にすぐ起動したが、翌日見たら 1 日400 ドルかかっていた
    請求は取り消してもらえたが、公式ガイドを信用してはいけないとはっきり学んだ

    • SageMaker は製品として最も失望させられる分野で、エンシティフィケーションの明確な例だ
      製品初期の 2017〜2018 年ごろは、設定がかなり直感的だった
      ノートブックインスタンス、推論、サービング用 REST API、少しの EFS、そしてサービスの中心が S3 であることが明確だった
      価格も閉じた形で、驚かされることはなかった
      全体として DigitalOcean のような感触で、インフラの基礎知識と好奇心があるデータサイエンティストでも、安価で予測可能かつシンプルな構成を作れた
      今では Wrangler、Feature Store、RStudio があり、ノートブックのコンソール UX はひどく、内部では複数のサービスがデータを移動させてそのたびに課金している
  • AWS の肥大化した SDK の代わりに事情があって生の HTTP リクエストを送る必要があったのだが、content-type: application/json ヘッダーでは失敗し、content-type: application/x-amz-json-1.0 では成功した
    こういう nonsense は本当にやめてほしい

    • キャリアの中で触ってきた AWS のほぼすべての部分で同じように感じた
      明確な利点もなく、過剰に肥大化していたり、複雑すぎたり、奇妙な独自実装が多すぎる
    • 正直なところ、内部の詳細が漏れ出ているだけだ
      内部的にはたいていのアプリが古いCoral フレームワークを使っており、入出力やエラー形式がよく定義されたこの JSON 形式を使っているからだ
  • すべての公式 AWS ガイドは、できるだけ多くの AWS サービスを使わせるよう設計されており、そのぶん支出リスクも増す
    AWS が勧めるもの、つまり GUI のデフォルト、CLI ツール、ガイド、推奨アーキテクチャなどは、極めて批判的に見るべきだ
    企業で AWS をコスト効率よく低リスクで使えるよう同僚を導く高給の職種が存在するのには理由がある

    • その通り
      小規模デプロイやテストでは、最も高くつく部分はほぼ常に周辺的なものか、よりシンプルな代替手段ではなく推奨される最新サービスだったりする
  • geo_point 境界ボックスクエリのために OpenSearch を使っているなら、PostgreSQL + PostGISはどうだろう?
    https://postgis.net/docs/using_postgis_query.html

  • こうした摩擦のないセットアップ、直感性の低い UX・インターフェース、クレジットカード登録への警戒心の低さ、AWS Batch + Lambda + EC2 のようなサービス間の抱き合わせ課金は、ビジネスモデルの一部だと思う
    どう表現すべきか分からないが、入場料を払って中に入ったあと、すべてのアトラクションどころかトイレまで別料金の現代的な遊園地に近い

    • 私もそう感じる
      クラウドの課金モデルは、「柔軟性」と「カスタマイズ」という名目で責任をユーザーに押しつけている
      レンタカー会社が、エンジンのカムシャフト回転、タイヤの回転、ワイパーの作動、シートヒーターの使用時間まで、あらゆる部品をミリ秒単位で課金しつつ、各項目ごとに通知を設定できるので顧客は使用量と予算を「制御」できると言っている状況を想像すればいい
      デフォルトの時点でユーザーに敵対的で危険なコストモデル