[レポート] DEV309: サーバレスとコンテナ化されたアプリケーションのためのCI/CD #reinvent

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

はじめに

本記事はAWS re:Invent 2018 「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
  • CI
  • CD
  • Infrastructure as code
  • デモ

スピーカー

Clare Liguori - Principal Engineer

レポート

現代的なアプリケーションって何?

現代的なアプリケーション開発のアプローチ

  • シンプルな環境管理
    • サーバーレス
  • コードの変更に対するインパクトを減らす
    • マイクロサービス
  • オペレーション自動化
    • モデル化されたアプリケーションとコード化されたインフラ
  • 新しく高品質なサービスの提供を高速化
    • CI/CD
  • リソースとアプリケーション間の見識を増やす
    • Observability
  • 顧客とビジネスを保護
    • End to Endのセキュリティとコンプライアンス

サーバーレス/マイクロサービス

  • AWS Lambda
    • イベントドリブン
    • 多くの言語のランタイム
    • データソースとの統合
    • サーバ管理不要
  • AWS Fargate
    • 長時間の実行が可能
    • OSを抽象化
    • フルマネジメントなオーケストレーション
    • フルマネジメントなクラスタのスケール

CI/CD

リリースの各ステージには、ソースコード、ビルド、テスト、プロダクションがある。 ソースコード、ビルドがCIの領域、CDはソースコードからプロダクションまで。

  • ソースコード
    • コードそのもののチェックイン
    • レビュー
  • ビルド
    • コンパイル
    • ユニットテスト
    • コードスタイルのチェック
    • コンテナイメージ/関数用のデプロイパッケージの作成
  • テスト
    • 他のシステムとの統合テスト
    • 負荷テスト
    • UIのテスト
    • セキュリティのテスト
  • プロダクション
    • 本番環境へのデプロイ
    • モニタリングと素早いエラー検知

CI/CDの効果は、頻繁なデプロイ、リードタイムの短縮、失敗率の低下にある。

CIのゴール

  • コードのチェックインに伴う新しいリリースのキックオフを自動化
  • 再現性のある環境でのビルドおよびテスト
  • 継続的なデプロイのための成果物一式作成
  • ビルドが失敗した場合の継続的なフィードバックループ

AWS CodePipeline

  • 素早く信頼できるアプリケーションのアップデートのためのCDサービス
  • リリースプロセスの可視化とモデル化
  • コードの変更ごとにビルド、テスト、デプロイ
  • サードパーティツールやAWSとの統合

最新のコードの取得とリリースのキックオフのために以下のソースをサポートします。

  • ブランチ
    • AWS CodeCommit
    • GitHub
  • オブジェクト/フォルダ
    • Amazon S3
  • コンテナ
    • Amazon ECR(NEW!)

サポートしているトリガーは以下。

  • Amazon CloudWatch Events
    • 定期実行
    • AWS Health Event
  • Webhooks
    • DockerHub
    • Quay
    • Artifactory

AWS CodeBuild

  • フルマネジメントなビルドサービス
    • コンパイル、テスト、パッケージの提供
  • 継続的なスケールと同時に複数のビルドを実行
  • ビルド用サーバの管理不要
  • 従量課金
  • CloudWatch Eventsによるビルドのモニタリング
  • 再現性のあるイミュータブルな環境のために、ビルドごとに新しいDockerコンテナを利用
  • オフィシャルなCodeBuildのイメージではDockerとAWS CLIがインストール済み
  • 必要に応じてCustom Build Environmentを提供

CDのゴール

  • テストのために自動的なステージング環境へのデプロイ
  • 顧客への影響を与えず安全に本番環境へデプロイ
  • 頻繁にデプロイを行いアップデートを素早く顧客へ提供

AWS CodeDeploy

  • インスタンスやLambdaへ自動でコードをデプロイ
  • アプリケーションのアップデートの複雑さをハンドリング
  • 開発中のダウンタイムを避ける
  • 失敗を検知した際に自動でロールバック
  • EC2、Lambda、オンプレへのデプロイ
Lambdaへのデプロイ
  • エイリアスを利用したトラフィックの移行
  • カナリアリリース(10分間トラフィックの10パーセントを移行など)もしくはリニアリリース(10分ごとに10パーセントずつトラフィックを移行)の選択
  • バリデーションのフックによりデプロイの各ステージでテストが可能
  • フックもしくはCloudWatch alermsによる素早いロールバック
  • コンソール、API、SNS、CloudWatch Eventsによるデプロイのステータスとヒストリのモニタリング
FargateとECSへのbrue-greenデプロイ(NEW!)
  • greenのプロビションに伴い、ロードバランサーでトラフィックを移行
  • バリデーションのフックによりデプロイの各ステージでテストが可能
  • フックもしくはCloudWatch alermsによるblueへの素早いロールバック
  • CodePipelineやJenkinsでのCodeDeploy-ECSデプロイアクションの利用

greenを配備して

greenにテスト用のトラフィックを流して

トラフィックをgreenに移行もしくはロールバック

blueを切り離す

Infrastructure as codeのゴール

  • 再現性のあり、予期しないイベントの起きないインフラ
  • ツールを使ったインフラのリリース
  • 継続的なテストのため本番と同様の環境をステージング環境にコピー

Infrastructure as codeで継続的なテスト

成果物へのテスト(ビルドステージ)

  • ユニットテスト
  • 静的解析
  • 依存関係と環境のモック化
  • イメージの脆弱性スキャン

環境のテスト(テストステージ)

  • 本物の依存関係と環境での統合テスト
  • 負荷テスト
  • ペネトレーションテスト
  • 環境へのデプロイの影響をテストするためのモニタリング

AWS SAMによるファンクション環境のモデル化

  • AWSに構築されたサーバレスアプリケーション構築のためのOSSフレームワーク
  • ファンクション、API、データベース、イベントソースのマッピングを表現するための簡潔なシンタックス
  • デプロイ時にSAMのシンタックスをCloudFormationのシンタックスに展開
  • 全てのCloudFormationリソース型をサポート

AWS CDKによるコンテナ環境のモデル化(NEW!)

  • Typescriptでクラウドのインフラを定義できるOSSフレームワーク
  • デフォルトでAWSのベストプラクティスが組み込まれたハイレベルなリソース型のライブラリをnpm modulesとして提供

CDKを使ったパイプラインのモデル化

  • オブジェクト指向言語によるコピペ最小化
  • 一つのクラスでマイクロサービスのパイプラインを定義し、複数のパイプラインで再利用
  • CodePipelineのパイプラインのモデル化や、IAM roleポリシーの設定自動化のためのハイレベルなコンストラクタを含む