Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The Twelve-Factor App とクラウドアプリケーションのコスト

The Twelve-Factor App とクラウドアプリケーションのコスト

『JAWS-UGコンテナ支部 #26 新春大LT祭り』のLT資料です

Naoki Yoshitake

March 07, 2024
Tweet

More Decks by Naoki Yoshitake

Other Decks in Technology

Transcript

  1. CONFIDENTIAL 1 © 2024 Japan Digital Design, Inc. The Twelve-Factor

    App と クラウドアプリケーションのコスト Japan Digital Design Technology & Development Div Naoki Yoshitake 2024.03.07
  2. 2 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 吉竹 直樹

    Technical Project Manager Japan Digital Design • 2022 APN AWS Top Engineer • 『AWS認定資格試験テキスト AWS認定SysOpsアドミニス トレーター – アソシエイト』の執筆に参加 プロフィール この写真は犬カフェのもので飼い犬ではありません。かわいいけど 資格等 • 2023/11〜 JDD • Tech PM としてプロジェクトマネジメントをしつつ、 技術検証やアーキテクチャ検討も担当 • クラウドで動くアプリケーションの最適化を考えるのが好き
  3. 3 CONFIDENTIAL © 2024 Japan Digital Design, Inc. Japan Digital

    Design株式会社 2017年10月2日 代表取締役 CEO 浜根 吉男 85名(2023年9月末時点) 株式会社三菱UFJフィナンシャル・グループ 株式会社三菱総合研究所 三菱UFJリサーチ&コンサルティング株式会社 社名 設立 代表者 従業員数 株主構成 会社概要
  4. 4 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 今回のテーマ re:Invent

    2023 Dr. Werner Vogels の “The Frugal Architect”を見て、 コストについて考える機会が増えた このテーマにしたきっかけ コンテナアプリケーション × コスト 出典:https://www.youtube.com/watch?v=UTRBVPvzt9w&t
  5. 5 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 今回のテーマ •

    コンテナアプリケーションの開発プラクティスと言えば、 “The Twelve-Factor App” が有名 • 自身が担当していた業務でもこのプラクティスに沿っていたが、 クラウドで思わぬコストが発生することがあった • コンテナアプリケーションのコストに関するLTをします アプリケーション観点でコストを考える コンテナアプリケーション × コスト
  6. 6 CONFIDENTIAL © 2024 Japan Digital Design, Inc. • “The

    Twelve-Factor App” はコンテナアプリケーションにとって有効な プラクティスだが、クラウドの使い方を誤ると思わぬコストが発生する • アプリケーション開発者を含む全員がクラウドのコストを意識するべき お伝えしたいこと 対象の方 • コンテナアプリケーション 開発に関わる人 • 特にアプリケーション開発者 発表の対象者とお伝えたいこと
  7. 8 CONFIDENTIAL © 2024 Japan Digital Design, Inc. • Heroku

    のエンジニアが提唱した ソフトウェア 開発のための方法論 • 2011年頃に提供されて10年以上経つが、現在でも広く知られている • クラウド/コンテナのメリットを最大限活かしたアプリケーションの開発に 有効なプラクティス • 「実行環境間での移植性を最大化」 • 「開発環境と本番環境の差異を最小限」 • 「アジリティを最大化する継続的デプロイ」 • AWS以外のクラウドでも同様に有効 The Twelve-Factor App (12FA) とは The Twelve-Factor App とは https://12factor.net/ja/
  8. 9 CONFIDENTIAL © 2024 Japan Digital Design, Inc. The Twelve-Factor

    App の一覧 I. コードベース バージョン管理されている1つのコードベースと複数のデプロイ II. 依存関係 依存関係を明示的に宣言し分離する III. 設定 設定を環境変数に格納する IV. バックエンドサービス バックエンドサービスをアタッチされたリソースとして扱う V. ビルド、リリース、実行 ビルド、リリース、実行の3つのステージを厳密に分離する VI. プロセス アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する VII. ポートバインディング ポートバインディングを通してサービスを公開する VIII. 並行性 プロセスモデルによってスケールアウトする IX. 廃棄容易性 高速な起動とグレースフルシャットダウンで堅牢性を最大化する X. 開発/本番一致 開発、ステージング、本番環境をできるだけ一致させた状態を保つ XI. ログ ログをイベントストリームとして扱う XII. 管理プロセス 管理タスクを1回限りのプロセスとして実行する 出典:https://12factor.net/ja/
  9. 10 CONFIDENTIAL © 2024 Japan Digital Design, Inc. The Twelve-Factor

    App × AWS I. コードベース II. 依存関係 III. 設定 IV. バックエンドサービス V. ビルド、リリース、実行 VI. プロセス VII. ポートバインディング VIII. 並行性 IX. 廃棄容易性 X. 開発/本番一致 XI. ログ XII. 管理プロセス 出典:https://12factor.net/ja/ CloudWatch Logs Auto Scaling Code Commit Code Artifact Parameter Store Secrets Manager Code Build / Deploy / Pipeline
  10. 11 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 12FA ×

    AWS の資料やブログはたくさんあります The Twelve-Factor App × AWS https://speakerdeck.com/keisuke69/the-twelve-factor-app-on-aws https://speakerdeck.com/toricls/you-build-it-you-run-it https://aws.amazon.com/jp/builders-flash/202208/introductions- twelve-factors-app/ https://aws.amazon.com/jp/blogs/news/developing-twelve-factor-apps- using-amazon-ecs-and-aws-fargate/ https://www.slideshare.net/AmazonWebServicesJapan/the- twelvefactor-appaws https://www.youtube.com/watch?v=hVJ-IGy1SRw
  11. 12 CONFIDENTIAL © 2024 Japan Digital Design, Inc. e.g. セッションデータがファイル保存(VI.プロセス)

    12FAが無いアプリケーションの例 e.g. 設定を環境変数にしていない(Ⅲ.設定) The Twelve-Factor App の例 • スケールアウトしたインスタンスにはデータが無く、 クライアントはログアウト状態やエラーに • スティッキーセッションに頼っている • 接続先が変わる度にコードの修正が必要 • 変更できるメンバーが属人化 • 開発スピードの低下 • APIキーはセキュリティリスクもあり “id”: “ID01”, “data”: {… } Session ID Session ID Session ID Client Instance A Instance B app file app file IdをKeyにデータ取得 IdをKeyにデータ取得 Scale out
  12. 13 CONFIDENTIAL © 2024 Japan Digital Design, Inc. e.g. セッションデータを外部データベースに保存

    12FAがあるアプリケーションの例 e.g. 設定を外部のパラメータ管理から環境変数で取得 The Twelve-Factor App の例 • スケールアウトしたインスタンスからもセッション データを取得可能。スケールアウトが容易に • スティッキーセッションが不要 • 接続先が変わってもアプリのコードは修正不要 • 環境の設定値を一カ所で管理 • シークレット値(APIキー等)もセキュアに保存可能 Session ID Session ID Session ID Client Instance A Instance B app app IdをKeyに データ取得 Secrets Manager Parameter Store *1 ElastiCache DynamoDB IdをKeyに データ取得 環境変数 (*1) 正式にはSystems Managerですが省略しています or or
  13. 14 CONFIDENTIAL © 2024 Japan Digital Design, Inc. • ポータビリティを高める

    • 開発も本番も同じコードベース • 環境変数を活用 • ステートレスな設計にする • 容易にスケールアウト/スケールインを実現 • プロセスの自動化 • パイプラインの構築 • アジリティとビルド/デプロイ作業の信頼性を高める 12FAの要点 The Twelve-Factor App の要点
  14. 16 CONFIDENTIAL © 2024 Japan Digital Design, Inc. • というわけではない

    • 使い方を誤ってコストが過大になったり、トレードオフが発生するケースもある • いくつかのケースを紹介します • 使い方等の問題であって、12FAが悪いという話ではないです 「12FAにすればクラウド/コンテナで最適なアプリケーション!」 コストを考える
  15. 17 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 今回紹介するケースと関連する要素 I.

    コードベース II. 依存関係 III. 設定 IV. バックエンドサービス V. ビルド、リリース、実行 VI. プロセス VII. ポートバインディング VIII. 並行性 IX. 廃棄容易性 X. 開発/本番一致 XI. ログ XII. 管理プロセス 出典:https://12factor.net/ja/ 1 2 3 CloudWatch Logs Auto Scaling Code Commit Code Artifact Parameter Store Secrets Manager Code Build / Deploy / Pipeline
  16. 18 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 『CloudWatch Logsが高い』

    Case1. XI. ログ • 標準出力したログをLoggingDriver, Fluentbitを使って CloudWatch Logsに転送 • CloudWatch Logsは取込(収集)が高コストであるため、 デバッグログ等を含めた大量のログを出力していると 思わぬ高コストに繋がる • 開発環境で負荷テストを行う場合は更に注意が必要 • 通常のAccessLogだけでも相当なログが出力される • 大規模システムなら、負荷テスト1回で万単位の課金が発生 する可能性あり Cluster ECS CloudWatch Logs e.g. ECSからログを標準出力 標準出力 負荷テスト AccessLog ErrorLog DebugLog 取込のコストに注意
  17. 19 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 『CloudWatch Logsが高い』への対処

    Case1. XI. ログ • 出力するログを環境の設定で切り替えられるようアプリを設計 • 設定の例 • Dev環境:DEBUG • Stg環境:INFO / WARNING / ERROR • 負荷テスト時には設定を変えてデバッグログは出さない Cluster ECS CloudWatch Logs e.g. ECSからログを標準出力 標準出力 ErrorLog S3 AccessLog DebugLog 適切なログレベルの設計 1 ログルーターの利用 2 適切なログレベルの設計 1 • Fluent Bitを使い、ログごとに出力先を切り替え • ログ量が多い場合、コストが低いサービスへルーティング • 設定の例:負荷テスト時 • Error Log:CloudWatch Logs • Debug Log / Access Log:S3 ログルーターの利用 2
  18. 20 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 『Secrets Manager/KMSが高い』

    Case2. III. 設定 • コンテナ起動時に環境変数を設定する場合は基本的に問題無し • 大量のシークレットがある場合は注意 • アプリケーション内で明示的にSecrets MangerのAPIを 利用することがあればコストに注意 • 実行ごとにAPI利用のコストが発生 • カスタマー管理キーを利用している場合、 KMSのコストも発生する Cluster ECS e.g. Secrets Managerからシークレットを取得 環境変数を設定 Secrets Manager KMS APIコールによる料金 API利用 キーによる暗号化 カスタマー管理キーに よる料金 ※Parameter Storeもアドバンスドパラメータを利用する場合は注意
  19. 21 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 『Secrets Manager/KMSが高い』への対処

    Case2. III. 設定 • タスク定義からSecrets Managerのシークレットを取得可能 • コンテナ起動時に環境変数として設定される • アプリケーションからAPI利用しない • タスクロールにSecrets Managerの許可を与えないのも手 e.g. Secrets Managerからシークレットを取得 起動時のみシークレット取得 1 • 「アプリケーション内部の設定は含まない」と12FAでは 明記されている(e.g. Railsのconfig/routes.rb) • これらは環境変数にせず、コードとして扱う • 環境変数が増えればSecrets Managerのコストも増える • 管理負荷も増加 むやみに環境変数にしない 2 Cluster ECS 環境変数を設定 Secrets Manager KMS キーによる暗号化 むやみに環境変数にしない 2 起動時のみシークレット取得 1
  20. 22 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 『データベースが高い』 Case3.

    VIII. 並行性 • 構成は12FAに則ったアプリケーション • 一見すると何も問題無い(むしろ良い)ように見えるが… • 例えば、内部ユーザー向けアプリケーションだったとしたら 少し違った見方ができる e.g. セッションデータを外部DBに保存 Session ID Session ID Session ID Client Instance A Instance B app app IdをKeyに データ取得 ElastiCache DynamoDB IdをKeyに データ取得 or
  21. 23 CONFIDENTIAL © 2024 Japan Digital Design, Inc. アプリケーションの比較 観点

    外部ユーザー向け 内部ユーザー向け 例 ECサイト, スマホアプリ, SaaS 管理コンソール, 業務アプリ 利用者数 多い 少ない 利用者の変動 大きい 小さい バックログ優先度 高い 低い 変更頻度 多い 少ない バグへの許容度 低い 高い(※影響度次第) リリース頻度 多い 少ない 停止の許容度 低い 高い 変更が少ないアプリケーションに、クラウド/コンテナが向いているとは言えない
  22. 24 CONFIDENTIAL © 2024 Japan Digital Design, Inc. 『データベースが高い』への示唆 Case3.

    VIII. 並行性 • DBのインスタンスを置くことはオーバースペックかもしれない • 利用ユーザー数が予測可能 • スケールイン/スケールアウトも無い • Blue/Greenデプロイも nice-to-have • アーキテクチャはトレードオフ。 コスト次第ではステートフルな設計も検討 • 他のデータベースに相乗り • ディスク(ファイル)の利用 • アーキテクチャ決定の経緯を文書化することが重要 • ADR(Architecture Decision Records) • 「このアーキテクチャになった理由は?」とならないために e.g. セッションデータを外部DBに保存 Session ID Session ID Session ID Client Instance A Instance B app app IdをKeyに データ取得 ElastiCache DynamoDB IdをKeyに データ取得 or 必要性を議論
  23. 25 CONFIDENTIAL © 2024 Japan Digital Design, Inc. コストはいずれ放置できない金額になることも クラウドのコストに対する考察

    • コストの大半をコンピューティング/DBが占めるケースは多い • ECS / EKS / AppRunner etc. • RDS / Aurora RDS / ElastiCache etc. • CloudWatch LogsやSecrets Manager含む他サービスは 相対的に金額も小さい。が、それゆえに • サービスのコストが高いことに気付きにくい • 気付いても対応が後回しにされやすい • リソース量(e.g.転送量, ログ量など)の見積りは難しい • アプリケーションによるコスト増に気付くのは 運用が始まってからのケースが多い 金額 その他サービス 見積 実績 コンピューティング /DB コンピューティング /DB その他サービス クラウドコストの内訳
  24. 27 CONFIDENTIAL © 2024 Japan Digital Design, Inc. アプリケーション開発者がコスト増加を防ぐ 無駄なコストを減らすには

    • 運用でのコスト増加を開発の段階で予防するには、 アプリケーション開発者もクラウドのコストを意識する 必要がある。開発者もオーナーシップを持つ • JAWSへの参加 / チーム内での勉強会 etc. 金額 オンプレ クラウド 固定費 ・ハードウェア ・ライセンス ・DC費用 ・電力/冷却 etc. 変動費 ・クラウド利用料 ・SaaS利用料 ・ライセンス etc. コストが上がるか 下がるかは利用者次第 オンプレとクラウドのコスト比較 オンプレ クラウド 特徴 • サイジング時にコストがほぼ決定 • 決められたマシンリソース内でアプ リケーションが稼働 • リソースを使った分だけ課金 • 柔軟なリソースの変更が可能 • リソースをどれだけ使うかは インフラ/アプリケーション次第
  25. 29 CONFIDENTIAL © 2024 Japan Digital Design, Inc. • クラウド/コンテナアプリケーションでの12FAの有効性

    • 思わぬコストに繋がるケースがあるが、アプリケーションの設計で回避できる • 標準出力での大量のログ出力 • パラメータを取得するAPIの大量利用 • 特性を考慮したアーキテクチャ • 開発時にコスト増加を予防できるのは、アプリケーション開発者 発表のサマリ サマリ
  26. 30 CONFIDENTIAL © 2024 Japan Digital Design, Inc. • “The

    Twelve-Factor App” はコンテナアプリケーションにとって有効な プラクティスだが、クラウドの使い方を誤ると思わぬコストが発生する • アプリケーション開発者を含む全員がクラウドのコストを意識するべき • 楽しいクラウド/コンテナ生活を送りましょう 改めて、お伝えしたいこと 対象の方 • コンテナアプリケーション 開発に関わる人 • 特にアプリケーション開発者 発表の対象者とお伝えたいこと
  27. 31 CONFIDENTIAL © 2024 Japan Digital Design, Inc. その他参考文献 •

    AWSで実現するモダンアプリケーション入門 • https://amzn.asia/d/3R5oa9D • クラウドアプリケーション 10の設計原則 • https://amzn.asia/d/fCM9dOk クラウドアプリケーション開発に関わる人はぜひ読んでほしい その他参考文献
  28. 32 CONFIDENTIAL © 2024 Japan Digital Design, Inc. • AWS

    re:Invent 2023参加報告(前編)ーAWS re:Invent 2023で 感じた生成系AIの盛り上がり • AWS re:Inforce現地参加で体感した金融×クラウドセキュリティ の新しい当たり前 公開記事のテーマ JDDについて JDDコーポレートサイト https://japan-d2.com/ 公式ブログ(note) https://note.com/japan_d2 Facebook https://www.facebook.com/japand2 クラウドのエンジニアを募集しています! JDDの最新情報はブログ、コーポレートサイト、 SNSにて 情報発信中です。 X(Twitter) https://twitter.com/Japan_D2