kakakakakku blog

Weekly Tech Blog: Keep on Learning!

「The Twelve-Factor App」を15項目に見直した「Beyond the Twelve-Factor App」を読んだ

2012年に Heroku のエンジニアによって提唱された「The Twelve-Factor App」は素晴らしく,アプリケーションをうまく開発し,うまく運用するための「ベストプラクティス」として知られている.2020年になった現在でもよく引用されていると思う.日本語訳もある.

12factor.net

Beyond the Twelve-Factor App とは?

クラウド化が進むなど,提唱された2012年と比較すると技術的な変化もあり,今までの「The Twelve-Factor App」で宣言されていた観点以外にも必要な観点やベストプラクティスがあるのでは?という意見もある.そこで,2016年に Pivotal のエンジニアが「Beyond the Twelve-Factor App」を提唱した.The Twelve-Factor App にあった「12項目をアップデート」し,新しく「3項目を追加」した.「計15項目」となる.

今回は Beyond the Twelve-Factor App を読んで,興味を持った箇所を中心にメモ程度に残しておく(正確に言うと,もっと前に読み終わっていたけど,記事を書いていなかった).オリジナルの The Twelve-Factor App よりは具体的に書かれているけど,それでもまだ抽象的なところもある.とは言え,議論の種になって良いと思う.以下のサイトにメールアドレスを登録すると,無料で PDF をダウンロードできる.

tanzu.vmware.com

The Twelve-Factor App と Beyond the Twelve-Factor App

まず,The Twelve-Factor AppBeyond the Twelve-Factor App に宣言されている項目を一覧しておく.Beyond the Twelve-Factor App には正式な日本語訳がなく,個人的に載せているため,参考程度にしてもらればと!Beyond the Twelve-Factor App で新しく追加された項目は「2. API first」「14. Telemetry」「15. Authentication and authorization」となる.

  • The Twelve-Factor App
    1. Codebase(コードベース)
    2. Dependencies(依存関係)
    3. Config(設定)
    4. Backing services(バックエンドサービス)
    5. Build, release, run(ビルド、リリース、実行)
    6. Processes(プロセス)
    7. Port binding(ポートバインディング)
    8. Concurrency(並行性)
    9. Disposability(廃棄容易性)
    10. Dev/prod parity(開発/本番一致)
    11. Logs(ログ)
    12. Admin processes(管理プロセス)
  • Beyond the Twelve-Factor App
    1. One codebase, one application(1 コードベース、1 アプリケーション)
    2. API first(API ファースト)
    3. Dependency management(依存関係管理)
    4. Design, build, release, and run(デザイン、ビルド、リリース、実行)
    5. Configuration, credentials, and code(設定、機密情報、コード)
    6. Logs(ログ)
    7. Disposability(廃棄容易性)
    8. Backing services(バックエンドサービス)
    9. Environment parity(環境一致)
    10. Administrative processes(管理プロセス)
    11. Port binding(ポートバインディング)
    12. Stateless processes(ステートレスプロセス)
    13. Concurrency(並行性)
    14. Telemetry(テレメトリ)
    15. Authentication and authorization(認証/認可)

1. One codebase, one application

The Twelve-Factor App では「Codebase」という項目だったけど,Beyond the Twelve-Factor App では「One codebase, one application」という項目になり,より具体的な名前に変わった.とは言え,内容は「コードベースとアプリケーションを 1対1 にすること」となり,大きく変わっていないと思う.なお,リポジトリ構成で議論になることもある「モノレポ」に関しては明確な言及はなかった.

ただし「キューを使った非同期アプリケーション」を題材とし,「メインアプリケーション」「密結合ワーカー」が同じリポジトリルートを共有する場合は項目に違反していると書いてあったり,1個の EAR ファイルを複数の起動スクリプトによって制御している場合も,複数のアプリケーションを管理していることになり項目に違反していると書いてある.さらに「コンウェイの法則」に対する言及もあり,より具体的に解説されている点は Beyond the Twelve-Factor App の素晴らしい点だと思う.

2. API first

次に Beyond the Twelve-Factor App で追加された項目「API first」は,今でこそ「言わずもがな」な印象を受けるけど,確かに The Twelve-Factor App には明確に言及されていなかった.具体的には,開発中にうまくサービス間を結合できなかったりすると悪夢だから,API を「ファーストクラス」と考えることにより,干渉せず「公開されたインタフェース」を中心に開発を進められるようになると書いてある.

また,サービスの例としては API Blueprint と Apiary(前職で使ってた)を使ってモックサーバを立てるプラクティスも載っていた.最近だと Swagger や OpenAPI って書いておくと良さそう.

swagger.io

4. Design, build, release, and run

The Twelve-Factor App では「Build, release, run」という項目だったけど,Beyond the Twelve-Factor App では「Design, build, release, and run」という項目になり,「Design」が追加された.

意味としては「設計」だけど,本書を読むと「リリースする小さな機能の設計」と書いてあったり「アプリケーションの依存関係」と書いてあったり「うまく作られた CI/CD パイプラインを使えば Design から Run まで数分で終わる」と書いてあったりする.正直言って「要件を整理する話」なのか「Design Doc のように技術仕様を整理する話」なのか「ライブラリ依存を整理する話」なのか,ハッキリと理解できなかった.ライブラリ依存だとすると「Dependency management」と重複する.もう少し具体例を解説している情報などを探しておく必要がありそう.

5. Configuration, credentials, and code

The Twelve-Factor App では「Config」という項目だったけど,Beyond the Twelve-Factor App では「Configuration, credentials, and code」という項目になり,より具体的な名前に変わった.

例えば「接続する API のエンドポイント情報」だったり「データベースの接続情報」だったり,環境依存な設定を環境変数に入れておくというプラクティスはもともと言及されていた.ただし,言い換えると今までは「環境変数に入れておく」以外に言及されていなかった.

Beyond the Twelve-Factor App では,環境変数を外部化 (Externalizing Configuration) する必要性と,可能なら外部サービスに入れると書いてあった.サービスの例としては Spring Cloud Config Server が載ってて,Git と連携できる Config Server は良さそう.最近だと AWS Systems Manager Parameter Store だったり,HashiCorp Vault だったり,選択肢は多いと思う.

cloud.spring.io

8. Backing services

「Backing services」The Twelve-Factor App から変わってないけど,内容はとても充実していた.「バックエンドサービス」とは何か?を定義しつつ,例えば「クラウドだとファイルシステムを一時的なリソースとして考える」など,クラウド化により活発に議論されるようになった観点も言及されていた.さらに「サーキットブレーカー」に対する言及もあり,誤ったバックエンドサービスに対するアクセスを遮断する必要性も書かれていて良かった.

martinfowler.com

14. Telemetry

Beyond the Twelve-Factor App で追加された項目「Telemetry」は,意味としては「モニタリング全般」と言える.クラウド時代に必要なテレメトリとして「3種類」紹介されていた.

  • APM (Application Performance Monitoring)
  • ドメイン情報
  • 稼働状況/ログ

「ドメイン情報」の具体的な例が載っていて,例えば「秒間 HTTP リクエスト平均数」よりも「直近 20min に iPad 経由で販売された件数」の方がビジネスインパクトがあるよね?という内容だった.稼働状況に関しては,例えば「外形監視」など,ユーザー目線でモニタリングをする重要性が書かれている.また,クラウド時代の「監視戦略」として,例えば「インスタンスが 100台 までスケールしたら,単純計算でログも 100倍 になる可能性がある」など,ログの保存量まで考えることもテレメトリを正しく行うために重要であると書かれていた.

kakakakakku.hatenablog.com

15. Authentication and authorization

最後も Beyond the Twelve-Factor App で追加された項目で,認証と認可など,セキュリティ面にフォーカスした「Authentication and authorization」となる.内容としては,全てのエンドポイントを RBAC (Role-Based Access Control) のような仕組みで保護すると書いてある.ようするに,クライアント側が必要な認可を持っているか確認できるようにすることを意味している.

実現する技術の例としては OAuth2OpenID ConnectSSO (Single Sign-On) が載っていた.最近だと Amazon Cognito だったり,認証認可 SaaS の Auth0 だったり,選択肢は多いと思う.

auth0.com

まとめ

2012年に提唱された「The Twelve-Factor App」と,2016年に提唱された「Beyond the Twelve-Factor App」を読んで,興味を持った箇所を整理した.多分意図的に抽象的に書かれているところもあり,そのあたりは議論をして実践的な解釈を深めていければと思う.興味があったら読んでみると良いのではないでしょうか!

tanzu.vmware.com