Open1

AWSクラウドネイティブデザインパターン学習記録

NaoNao

8/20札幌もくもく会中メモ
気になったところをメモしていく

運用を効率化する

責任共有モデルを意識したアーキテクチャの選択

  • 利用者の責任範囲を最適化する
    →EC2構成:OS,パッチをクラウド利用者の責任範囲に含む
    →Fargate基盤構成:ではOS、パッチがクラウド提供者の責任範囲となる
    →Lambdaを利用:OS,パッチ、言語ランタイム、スケーリングがクラウド提供者の責任範囲
    →AppRunnnerを利用:アプリケーションコード以外はクラウド提供者の責任範囲。内部でFargateが利用されておりデプロイフローの実装や監視、スケーリングの仕組みが組み込まれている。

テストの容易性を高める

  • テスト容易性のためにはアプリケーションのアーキテクチャを疎結合にする必要がある
  • 開発者が主体的に自動テストを作成、管理することでアーキテクチャの改善とデリバリのパフォーマンスを向上できる
  • 開発者にすばやくフィードバックを返す環境が重要:テストピラミッド
  • CI/CDの原則では、各ステージで失敗したときにはすぐに開発を止めて原因を突き止め、修正すべき
  • テスト容易性を高めるためのアーキテクチャパターン
    • 依存関係逆転の原則
      • 上位レイヤが海嶺屋に対して「仕様」を公開し、海嶺屋はこの仕様を満たす実装を提供する

小規模かつ可逆的な変更を頻繁に行う

  • 継続的インテグレーションや継続的デリバリー。CI/CD
  • 単なるCIツールによる自動化では実現できない。「正しく動く」とは何を指すか
  • 継続的にインテグレーションされた状態を維持するには長命なブランチを最小限に抑える必要がある
    • リリースの安全性が損なわれる
    • リファクタリングが難しくなり、技術的負債が積みあがる。フィーチャーブランチが多くなると不整合が発生する可能性が高まる。
  • トランクベース開発。長命なブランチをトランク(Gitではmain)1つに限定する開発手法
  • 日常の開発はすべてトランク上で行いブランチの利用は短命なものに限定する
  • 頻繁にコードをマージし、自動テストにより正しく動いていることを検証し続けるトランクベース開発と継続的インテグレーションにより不整合の発生を防ぐ
  • 継続的インテグレーションに必要なプラクティス
    • 信頼できる高速な自動テスト
    • 小さいチャンクでの機能開発
    • デプロイとリリースの分離
  • 進化的なアーキテクチャ
    • 漸進的で誘導的な変更を支援する
  • 小規模勝可逆的な変更を頻繁に行うためのアーキテクチャパターン
    • ContinuousConfigurationによるリリース管理:アプリケーションの挙動を動的に変更する戦略
      • AppConfigでは機能フラグの動的な設定を実現できる
      • コードの中で機能フラグにより分岐させる。AppConfigの画面やAPIで機能を任意のタイミングでリリースする
      • コード中の分岐は可読性を落とすリスクがあるためクリーンアップ(フラグ削除)のバックログ追加が必要
      • AppConfigでは機能フラグの廃止日を設定してコンソール上で確認することもできる

セキュリティを作りこむ

  • AmazonInspectorを使ってLambdaで実行されるコードに脆弱性がないかスキャン
  • コードに署名することで改ざんされていないことを保証したりできる
  • アプリケーション全体を俯瞰しながらセキュリティ対策がどこに必要なのかを把握する「脅威モデリング(Threat Modeling)」
  • 脅威モデリングは、新しいアプリケーションを設計した際や既存のアプリケーションを変更した際などに継続的に実施する
  • 早い段階でセキュリティについて考慮する考え方は「セキュリティ・バイ・デザイン」や「セキュリティのシフトレフト」と呼ぶ
  • 運用時のセキュリティ対策コストは設計時のそれと比べて100倍になる
  • 脅威モデリングの手法「Shostackの4つの質問」
    • 何に取り組んでいるか、どんな問題が起こりうるか、問題に対してどう対処するか、対処が適切だったか
    • 何に取り組んでいるかには「DFD」が使える
    • どんな問題が起こりうるかにはフレームワーク「STRIDE」が使える
    • どう対処するかは「リスクを減らす」「リスクを避ける」「リスクをどこかに移す」「リスクを受け入れ何もしないことを明示的に決定する」がある
    • STRIDE
      • Spoofing(なりすまし):Authenticity(真正性)の侵害
      • Tampering(改ざん):Integrity(完全性)の侵害
      • Repudiation(否認):Non-repudiation(否認されないこと)の侵害
      • InformationDisclosure(情報漏洩):Confidentiality(秘匿性)の侵害
      • Denial of Service(サービス拒否):Availavility(可用性)の侵害
      • Elevation of Privilage(権限昇格):Authorization(認可)の侵害

回復力を高める

可観測性を高める