紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【レポート】A3-06 クラウドネイティブなモダンアプリケーション開発を始めよう!クラウドネイティブ設計とデプロイメントパターン #awssummit

f:id:yokoyantech:20190614165438p:plain

はじめに

AWS SUMMIT TOKYO 3日目の最終セッションのレポートです。

登壇者

AWS 福井厚氏

なぜモダンアプリケーションなのか

  • 急速なイノベーションはもはや必須
    • 利益を伸ばす
      • 今ある人材を活用
  • 急速なイノベーションがビジネスを進化させる
    • 新たなデジタル製品・サービス
  • 実験がイノベーションを加速する
    • Innovation Flywheel
      • 実験、傾聴、反復のサイクル
  • AWSのイノベーション数
    • 年々増えている
      • 数千のチーム
      • マイクロサービス
      • 継続的デリバリ

モダンアプリケーション開発とは

  • 既存のアプリをすべてマイクロサービス化しないといけない、というわけではない
    • 優先順位付け
    • モダン化のパスを決定

モダン化パターン

  • Re-host
    • ほとんど変更しない社内アプリ
  • Re-platform
  • Re-architecture
  • Re-invent
    • 設計し直し、再構築

モダンアプリ開発のベストプラクティス

  • 6つある
    • ライフサイクル全体に渡ってコンプライアンスとセキュリティを構築
    • マイクロサービスの集まりにする
    • サーバレスを使う
    • モデリングとインフラにコードを利用する
    • CI/CDで迅速にリリース
    • モニタリングする

ライフサイクル全体に渡ってコンプライアンスとセキュリティを構築

  • 認証
  • 認可
  • Audit
  • 検証
  • 自動化された継続的なセキュリティ評価が必要
    • AWSが提供するサービスを最大限利用

マイクロサービスの集まりにする

  • 変更の影響が少なくなる
    • モノリシック
      • すべてを実行
    • マイクロサービス
      • 一つのことを実行
      • 個々に独立
      • APIでのみ会話
      • 疎結合
        • イベント駆動による非同期transaction
      • ワークフローで複数のサービスを連携する
        • StepFunctionsなど
          • 冗長なコードを排除する

サーバレスを使う

  • メリット4つ
    • インフラ管理が不要
    • 利用単位ごとにオートスケール
    • 価値に対して支払う課金モデル
    • 高い可用性と耐久性
  • 最小の努力で最大のアジリティを提供
  • コンピュートの選択
    • Lambda
      • イベント駆動
    • Fargate
      • ロングランニング、バッチ処理に向いている
      • サーバレスコンテナ

モデリングとインフラにコードを利用する

  • 全てをソフトウェアとして扱う
  • インフラのスピードとアジリティを向上
  • AWS Cloud Development Kit(CDK)
    • ymlではなく、TypescriptやPythonで書けるツール
    • Githubで公開している

CI/CDで迅速にリリース

  • CI/CDを自動化しているチームは、コードを早く、自信を持って書いている
  • 新しい作業二時間を欠けられるようになっている
  • Code3兄弟を使う
    • CodePipelineを構築する
      • Source
      • build
      • Test
      • Deploy

モニタリングする

  • より早く問題を識別すると、より早く解決できる
  • 分散されたアプリをどう可視化するか?
    • CloudWatch
    • X-Ray
      • 分散アプリを分析とデバッグ

モダンアプリケーションの実装パターン

APIゲートウェイパターン

  • API Gatewayを中心としたパターン
    • 認証・認可

ディスカバリサービスレジストリパターン

  • AWS Cloud Map
    • ARNによる名前解決

サーキットブレーカーパターン

  • 5xx系のエラーが起きたときに呼び出し元がエラーになることを防ぐ
  • 相手側が停止しても処理を継続する
  • 呼び出し側がしきい値を超えてエラーをするとResponseを返す
  • コンテナでやる
    • ECS+Linkerd
    • EKS+Lstio +envoy

コマンドクエリ責務分離パターン

  • CQRSパターン
  • 参照系と更新系を分離する
    • それぞれのデータソースやクエリサービスを分離する
    • 結果整合性を許容しないと使えない
  • Aurora+Lambda+DynamoDB

イベントソーシングパターン

  • DB直接更新ではなく、ビジネス的なイベント
  • Kinesis+Lambdaで実現

コレオグラフィパターン

  • アカウント登録すると、Eメール送信、ポイント付与、など1アクションに対して様々なアクションを行うパターン
  • コレオグラフィは振り付け、という意味
  • SNS+SQS+Lambda

集約ログパターン

Polyglotパーシステンスパターン

AWSにおける継続的インテグレーション/デリバリーの実現

SAPアプリのDeploy

  • AWS Amplify Console

コンテナへのDeploy

  • CodePipeline
  • CodeDeployを使えば、ブルー・グリーンデプロイメントできる

LambdaへのカナリアDeploy

  • Lambdaのバージョンとエイリアスの機能+CodeDeploy
  • 段階的なDeploy
    • 10分かけて前のLambdaから新しいLambdaへ処理を切り替える、など

ホワイトペーパー出た

AWSモダンアプリケーション開発ホワイトペーパー

aws.amazon.com

まとめ

本セッションでは、6つのモダンアプリ開発のベストプラクティスと、モダンアプリケーションの実装パターンを学ぶことができました。「既存のアプリをすべてマイクロサービス化しないといけない、というわけではない」とお話されていましたが、私のプロダクトはモノリシックな構造であるため、部分的にマイクロサービス化できる箇所がないかを考える、良いきっかけをいただきました。