[レポート] DEV309 :サーバレスアプリ、コンテナ化されたアプリ向けのCI/CD #reinvent

re:Invent2018のDEV309「CI/CD for Serverless and Containerized Applications #reinvent」のレポートです
2018.11.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

サーバーレス開発部@大阪の岩田です。 この記事はDEV309 CI/CD for Serverless and Containerized Applicationsのレポートになります。

概要

以下が公式の概要となります。

To get the most out of the agility afforded by serverless and containers, it is essential to build CI/CD pipelines that help teams iterate on code and quickly release features. In this talk, we demonstrate how developers can build effective CI/CD release workflows to manage their serverless or containerized deployments on AWS. We cover infrastructure-as-code (IaC) application models, such as AWS Serverless Application Model (AWS SAM) and new imperative IaC tools. We also demonstrate how to set up CI/CD release pipelines with AWS CodePipeline and AWS CodeBuild, and we show you how to automate safer deployments with AWS CodeDeploy.

サーバーレスアプリ、コンテナ化されたアプリにおけるCI/CDワークフローの構築手法についての紹介がありました。 ちょうどこの日には発表されたECSのBlue/Greenデプロイのデモを見ることができたのが大きな収穫でした。

AWS CodeDeploy/AWS CodePipelineでAWS Fargate/Amazon ECSのCI/CDがサポートされました! #reinvent

スピーカー

  • Clare Liguori - Principal Engineer

レポート

モダンなアプリケーションのデプロイへのアプローチ

  • サーバーレスによるシンプルな環境管理
  • マイクロサービスアーキテクチャによるコード変更のインパクトの最小化
  • オペレーションの自動化とIaC(Infrastructure as code)
  • CI/CDを活用して新しいリリースを早くDeliveryする
  • リソース・アプリケーションを横断的に可視化する
  • 顧客とビジネスをエンドToエンドのセキュリティ・コンプライアンスで保護する

モダンなアプリとは

  • コンテナ
  • サーバーレス

AWSでのサーバーレス

  • 2つのアプローチ
  • LambdaとFargate

CI/CDのステージ

  • Source
  • Build
  • Test
  • Production

Sourceフェーズ

  • .javaファイルの様なソースコードをチェックインする
  • コードレビュー

Buildフェーズ

  • コードのコンパイル
  • Unitテスト
  • コーディング規約のチェック
  • コンテナイメージやFunctionのデプロイパッケージ作成

Testフェーズ

  • 別システムとの結合テスト
  • 負荷テスト
  • UIテスト
  • セキュリティテスト

CI/CDの効果

  • 頻繁なデプロイ Agilityの向上
  • アプリの変更に必要な時間の短縮
  • 障害の発生率を抑制

モダンアプリを支える3つの柱

  • CI(Continuous integration)
  • CD(Continuous deployment)
  • IaC(Infrastructure as code)

CIのゴール

  • 新しいコードがチェックインされる度に自動的に新しいリリースが開始される
  • ビルドとテストを繰り返し、環境の再現が可能な状態を保ち続ける
  • 継続的にデプロイ用のアーティファクトを準備する
  • 継続的にフィードバックとCloseのサイクルを回す

AWS CodePipline

  • Pipelineは本当に早い
  • ソフトウェアのリリースプロセスを可視化
  • コードが変更される度にビルド、テスト、デプロイを実行
  • サードパーティ製のツールとの統合

AWS CodePiplineがサポートするソース

  • AWS CodeCommit
  • GitHub
  • S3
  • ECR

ECRのサポートが追加された!

サポートするトリガー

  • CloudWatch Events
    • スケジュール
    • AWS Health events ※Fargateが必要
  • WebHook
    • DockerHub
    • Quay
    • Artifactory

AWS CodeBuild

  • フルマネージドなソフトウェアビルド用サービス
  • スケールし、並列にビルドプロセスを実行可能
  • ビルド用のサーバーを管理する必要がない
  • 分単位でコンピューティングリソースの使用量に応じて支払い
  • CloudWatchEventでビルドをモニタリングできる

AWS CodeDeploy

  • EC2インスタンスやLambdaにコードを自動でデプロイするためのサービス
  • 複雑なアプリケーションの更新をハンドリング
  • デプロイ中のアプリのダウンタイムを回避
  • 以上を検知したら自動でロールバック
  • オンプレのサーバーにもデプロイ可能

CodeDeployによるLambdaのデプロイ

  • エイリアスを活用して徐々にトラフィックを分散
  • カナリアデプロイ
  • 10分ごとに10%づつトラフィックを移行するなど
  • マネジメントコンソールからデプロイをモニタリング

カナリアデプロイ

  • v1に100%のトラフィックv2に0%のトラフィック→v1に90%のトラフィックv2に10%のトラフィック→v1に0%のトラフィックv2に100%のトラフィックの様に徐々に切り替えていく
  • Lambdaのカナリアデプロイは分かったけど、コンテナは??

CodeDeployによるECSのBlue/Greenデプロイ

  • ECSのBlue-Greenデプロイがサポートされました!

Blue/Greenデプロイのフロー

  • ヘルスチェックに合格したらGreen環境にトラフィックを流し出す
  • 問題あれば勝手Blue環境にロールバック
  • 問題なければBlue環境は削除 Green環境が本番環境へ昇格 -

デプロイのためのコンテナイメージへのタグ付け

  • ビルドIDでタグ付けしよう

CDのゴール

  • ステージ環境への自動デプロイ
  • 本番への安全なデプロイ
  • 顧客への提供を素早く

Infrastructure as code

  • Infrastructure as codeもCI/CDと言える
  • インフラの変更を再現可能に保つ
  • 本番環境と同等のテスト環境で継続的にテストできる様に

SAM

  • Infrastructure as codeの実現を容易にするフレームワーク
  • CloudFormatioのテンプレートに変換される

SAMの例

  • 生のCloudFormationより簡潔に書ける
  • 必要なリソースの作成を一部自動化してくれる

AWS Cloud Development Kit

  • TypeScriptでクラウドインフラを定義するフレームワーク!!
  • NPMのモジュール
  • CloudFormationでリソースをプロビジョニング
  • CloudFormationの全てのリソースタイプをサポート

デモ

コンテナ

  • Fargateベースのアプリ
  • Blue/Greenデプロイ

サーバーレス

  • Lambdaベースのアプリ
  • カナリアデプロイ

まとめ

発表直後だったECSのBlue/Greenデプロイのデモを見ることができ、有意義な時間になりました。 サーバーレス開発部はこのセッションの定義でいう「モダンなアプリ」を開発している部署になります。 セッションで紹介されていたデプロイ戦略を有効活用して品質向上や生産性向上につなげていきたいと思います!