AWS Summit Online 2020 Tokyoメモ

# AWS-21：モダンアプリケーションのためのアーキテクチャデザインパターンと実装

https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand-aws-sessions-1-82341

## モダンアプリケーションをどう実装するか

* ゲートウェイパターン
    * バックエンドサービスへの呼び出しが多い場合
    * アプリケーションのエンドポイントはロールベースアクセス制御で保護
    * AWSではAPI GatewayとCognitoを使う
* バックエンドサービス
    * バックエンドサービスをアタッチされたリソースとして扱い、アプリケーションを再デプロイしなくても切り替えられるようにする
* ポリグロットパーシステンス
    * 用途に応じたデータストアや、開発者のスキルセットを考慮して選択する
* サービス間の安定性を高めるデザイン
    * カスケード障害防止する
        * タイムアウト
        * スロットリング
        * リトライ
        * サーキットブレーカー
            * サービス感の呼び出しを規制して段階的に機能低下させる
            * 発生した障害の回数をカウントし、上限を超えるとオープン状態に移行して切断
        * バルクヘッド
            * アプリケーションの要素を分離
            * 1つの要素で障害が発生しても他の要素に障害が波及しないようにする
        * サービスディスカバリ
* 伸縮性・弾力性を高めるデザイン
    *  アプリケーションを構成するサービスやコンポーネントがスケールできるように設計する
        *  コマンドクエリ責任分離（CQRS)
            *  更新と参照のクエリを分離することで、それぞれスケールすることが可能になる（結果整合性を許容する必要がある
            *  AWSでは更新がDynamoDB -> Lambda -> Aurora。参照はAurora
        *  イベントソーシング
            *  データストアを直接更新するのではなく、イベントを記録することで状態を再生する
            *  AWSではイベントログをKinesis, SQLを用いる。処理はLambda
* ログ集約とモニタリング
    * ログはイベントストリームとして集約して、パフォーマンス・ビジネス分析データ・ほかメトリクスをモニタリング
        * AWSではCloudWatchとX-Ray
* CI/CDモダンアプリケーションのデリバリー
    * 制作
        * Cloud9, IDE toolkits
    * ソース
        * CodeCommit
    * ビルド
        * CodeBuild
    * テスト
        * CodeBuild
    * デプロイ
        * CodeDeploy
    * モニタリング
        * X-Ray
        * CloudWatch
    * モデルとしてはCloudFormation, Cloud Development Kit, SAM

良いアーキテクチャを作るために、物事を観測する謙虚さとバランス感覚が必要。

# AWS-26：AWSの継続的インテグレーション／デリバリー総まとめ！モダンアプリケーション構築のための CI / CD ベストプラクティス！

https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand-aws-sessions-1-82341

## 継続的インテグレーションのゴール

1. コードがチェックインされた時に自動的にリリースを開始
2. 一貫性のある繰り返し可能な環境でコードのビルドとテストを実施
3. デプロイの準備ができているアーティファクトを常に保持
4. ビルドが失敗した時のフィードバックループが常に回せる

-> AWS CodeBuild

* AWS Lambdaをビルド
    * npm ci
    * npm test
    * aws cloudformation package --template-file template.yml --output-template template-output.yml --s3_bucket $BUCKET
* Dockerをビルド
    * $(aws ecr get-login --no-include-email)
    * docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
    * docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $ECR_REPO:$IMAGE_TAG
    * docker push $ECR_REPO:$IMAGE_TAG

1. 更新された変更をテスト用のステージ環境に自動的にデプロイ
2. 顧客に影響を与えることなく安全に本番環境にデプロイ
3. デプロイメントの頻度向上、変更によるリードタイムと失敗率の削減

-> AWS CodePipeline

* ソース
    * CodeCommit
    * GitHub
    * S3
    * ECR

* ターゲット
    * EC2
        * CodeDeploy
        * Elastic Beanstalk
        * OpsWorks stacks(Chef)
    * コンテナ
        * CodeDeploy
        * ECS/Fargate
        * ECS/Fargate (blue/green)
    * サーバーレス
        * CloudFormation (SAM)
        * Lambda (CodeDeploy)
        * S3
        * Service Catalog
        * Alexa Skills Kit

* サポートトリガー
    * CloudWatch Events
        * スケジュール
        * AWSサービスのイベント
    * Webhooks
        * GitHub
        * Quay
        * Artifactory

-> CodeDeploy

* 設定ファイルに基づく複雑なアップデート
* ダウンタイム削減
    * 一括、カナリア、blue/green
* エラー検知時に自動的にロールバックを実行
* EC2, Lambda, オンプレミス、コンテナへデプロイ

CodeDeploy Lambdaデプロイメント

* 関数重み付けエイリアスを利用したトラフィックのシフト
* カナリアデプロイ(10分間10%のトラフィックをシフト)、リニアデプロイ（毎10分毎に10%ずつ）
* Validation Hook
* 迅速なロールバック

SAMを使っても良い

CodeDeploy ECS blue/greenデプロイメント

* greenタスクをプロビジョニングし、ロードバランサーのトラフィックを切り替え
* 検証Hookによって各ステージのデプロイメントでテストを有効化
* Hookが失敗した場合はCloudWatchアラームを検死した場合は数秒でblueタスクに迅速にロールバック

## Infrastructure as Codeのゴール

1. インフラストラクチャの変更を繰り返し予測可能にする
2. インフラストラクチャの変更のリリースにコードの変更と同じツールを利用する
3. 本番環境をステージング環境に複製し継続的テストを有効化する

継続的テスト

成果物の検証と環境の検証

* LambdaのデプロイにはAWS SAMが利用可能
    * AWS上のサーバーレスアプリケーションを構築するためのオープンソースフレームワーク
    * 関数、API、データベース、イベントソースマッピングを表現する簡易な文法
    * デプロイ時にCloudFormationに変換、展開
    * 同一テンプレート内にSAM以外のCloudFormationテンプレートの混在が可能
* FargateのデプロイはCDKが利用可能
    * インフラをTypeScriptで定義
    * ハイレベルリソースタイプ
    * AWS CloudFormationでプロビジョニングされる