サーバーレスアプリケーションの ための CI/CD パイプライン構築 Solution Architect Takashi Koyanagawa 2017/6/2 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
T H A N K S T O O U R F R I E N D S A T :
本セッションの Feedback をお願いします 受付でお配りしたアンケートに本セッションの満足度やご感想などをご記入くださいアンケートをご提出いただきました方には もれなく素敵な AWS オリジナルグッズをプレゼントさせていただきます アンケートは各会場出口 パミール 3F の EXPO 展示会場内にて回収させて頂きます
自己紹介 小梁川貴史 ( こやながわたかし ) パートナーソリューションアーキテクト 経歴 APNさまへの技術支援とくにIoT 向け アーキテクチャの検討支援やレビューなど 電機メーカーにて 自社 Webサービスの設計から運用まで経験 AWSのユーザとして4 年半 開発 運用を経験 好きなサービス AWS IoT Amazon Kinesis AWS Lambda
本セッションの対象 CI/CD など基本的の用語はご理解頂けている方 サーバレス環境の構築に興味がある方
本セッションでご理解いただきたい点 サーバレス環境でのデプロイ手法 SAM を使ったデプロイ方法 SAM と AWS Code 系サービスの連携方法
継続的なインテグレーション / デプロイの必要性
リリースプロセスの 4 つの主なフェーズ ソースビルドテスト運用.java ファイルなどのソースコードをチェックイン 新しいコードのピアレビュー コードのコンパイル ユニットテスト スタイルチェッカー コードメトリック コンテナイメージの作成 他のシステムとの統合テスト ロードテスト UI テスト 侵入テスト 本番環境にデプロイ
CI / CD とは CI (Continuous Integration) コード変更を定期的に master へマージし ビルド / テストを自動で実行する手法 CD(Continuous Delivery/Continuous Deployment) Continuous Delivery: 自動化されたテストを通過した後に Production へのリリース判断をした後にリリースする手法 Continuous Deployment: 自動化されたテストを通過した後 自動でプロダクションへリリースを実施する手法 CI CD (Delivery) CD (Deployment) ソース ビルド テスト 運用 リリース チェック
継続的デリバリのメリット ソフトウェアの 開発者の バグをすばやく アップデートの リリースプロセスを 生産性を改善 検出して対処 配信を高速化 自動化
サーバレス環境構築のフレームワークの紹介
サーバレス環境構築エコシステム SAM (Serverless Application Model) Chalice Framework 本日のお話
Serverless Application Model サーバレスアプリに最適化された AWS CloudFormation の拡張 CloudFormtion でサポートされているものは利用可能 既存のファンクションを SAM テンプレートとしてエクスポート可能 apache 2.0 ライセンス ユーザが SAM を利用して エコシステムを作成することも可能 サーバレス用のリソースタイプ
SAM で指定できるサーバレスのリソース AWS Lambda AWS::Serverless::Function AWS Lambdaファンクション メモリ設定など ファンクション自体の設定が可能 イベントソースの設定が可能 Amazon API Gateway AWS::Serverless::Api Amazon API GatewayのAPI 作成 エンドポイント経由で呼び出されるリソースとメソッドの定義 Swaggerを利用して管理す場合は必須定義 Amazon DynamoDB AWS::Serverless::SimpleTable DynamoDB のシンプルなテーブルを作成 詳細な設定が必要な場合は 通常の AWS::DyanmoDB::Table を使用する
SAM のリリースに伴い以下のコマンドが追加 $ aws cloudformation pakage zip fileとして デプロイパッケージを作成 Amazon S3バケットへのパッケージアップロード S3 URIによるCodeUriプロパティの追加 $ aws cloudformation deploy CloudFormation の CreateChangeSet API をコール CloudFormation の ExecuteChangeset API をコール
Severless 用の Tempalete の説明 SAM templete の yaml Serverless 用の template である宣言 Cloudformation 用のファイルへ変換された yaml xxx 引数で指定した S3 バケットへの upload 情報が作成される package コマンド実行
このテンプレートのアーキテクチャ put Key: test(string) AWS Lambda Amazon DynamoDB role
DynamoDB のテーブル名を指定しないで作成 自動で作成されたテーブル名を template から Ref で参照しているので Lambda の環境変数にも適用されている
SAM が提供するサンプル https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31
SAM と AWS Code 関係サービスとの連携
AWS CodePipeline アプリケーションのすばやく信頼できるアップデートを可能にする継続的デリバリサービス ソフトウェアリリースプロセスのモデル化と見える化 コードが変更されるたびにコードをビルド テスト デプロイ サードパーティツールや AWS との統合
CodePipeline MyApplication Source Source GitHub Build JenkinsOnEC2 Jenkins Deploy JavaApp Elastic Beanstalk ステージ アクション トランジション パイプライン
CodePipeline MyApplication Source Source GitHub Build JenkinsOnEC2 Jenkins NotifyDevelopers Lambda 並列アクション Deploy JavaApp Elastic Beanstalk
CodePipeline MyApplication Source Source GitHub Build JenkinsOnEC2 Jenkins TestAPI Runscope NotifyDevelopers Lambda 逐次アクション Deploy JavaApp Elastic Beanstalk
AWS CodeCommit Secure, scalable, managed Git source control スターンダードな Git tool が利用可能 Amazon S3 の Scalability, availability, durability なストレージを利用 Encryption at rest with customer-specific keys レポジトリサイズの上限なし 5/27 Tokyo region launch! Post commit hooks で SNS/Lambda を呼び出せる
AWS CodeBuild 完全なマネージドのビルドサービスでソースコードのコンパイル 実行 テスト ソフトウェアパッケージの生成をサポート 継続的なスケールと同時複数ビルドの実行 Docker イメージによってニーズにマッチするカスタムなビルド環境を構築可能 利用したコンピュータリソース / 分のみの支払い CodePipeline や Jenkins との統合が可能
AWS CodePipeLine との連携 AWS CodePipeline 6)Deploy 指示 1)code push 2) 変更検知 4)build 指示 3) ソースを S3 へ AWS CodeCommit 4)build 実行 bulidspec.yml で定義 AWS CodeBuild 4)build 必要ファイルの保管 AWS CloudFormation 5)CloudFormation へ展開 bucket bucket template-output.yaml AWS Lamba の zip 化
AWS CodePipeline でデプロイフローを作る Source AWS CodeCommit Build AWS CodeBuild Stage AWS CloudFormation Deploy AWS CloudFormation レポジトリからソース取得 buildspec.yml の実行 CFn template の作成 CFn スタックの変更 CFn スタックの実行 http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/automating-deployment.html
Source の設定 Github/S3 の登録も可能 repository/branch の指定
build の設定 Jenkins/SolanoCI の指定可能
CloudFormation 更新
CloudFormation 実行設定
本例のソースのスタック SAMText DynamoPut.py template.yaml buildspec.yml SAM 用 ファイル名固定 buildspec は Codebuild の制約でファイル名固定かつ repostory-root ディレクトリに配置が必須 (codebuild の制約 ) http://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html
bulidspec.yml Cloudformation コマンドを書くのみ 入力 template 出力 template バケット名 出力 template
CodePipeline の実行確認
外部ライブラリを利用したいケース 入力 template 出力 template バケット名 出力 template
Cloudwachlogs で確認 zip ファイル作成前に外部ファイルが取得されているのも分かる
初回構築後に AWS Lambda を修正して push 差分は Lambda のみなので Lambda の deploy のみ
承認フローを追加 AWS CodePipeline 7)Deploy 指示 1) code push 2) 変更検知 4)build 指示 6)Approve チェック 3) ソースを S3 へ AWS CodeCommit 4)build 実行 bulidspec.yml で定義 AWS CodeBuild Amazon SNS AWS CloudFormation 4)build 必要ファイルの保管 5)CloudFormation へ展開 bucket bucket template-output.yaml AWS Lamba の zip 化
承認フローを追加 SNS を作成し 新しいアクション =>Action category=> approval で SNS を関連付けるのみで承認フローが作成できる
AWS CodeStar
幾つかのガイドに従うだけ https://aws.amazon.com/jp/blogs/news/new-aws-codestar/
CI/CD のためのプログラミング
AWS Lambda の設計 テストし易い / 管理しやすい単位で設計をする 例えば upload された photo の解析のユースケース Rekognition scene_detect() 人がいるか? Rekognitionf search_face () 1 つの Lambda の中でも表現可能だが 変更するとテスト対象の範囲は全体になるモノリシックなロジック Polly synthesize_speech()
AWS Step Functions 視覚的なワークフローの提供 分散アプリケーション / マイクロサービスの設定が可能 JSON でのワークフロー定義 ( プログラム開発不要 ) Amazon EC2 / Amazon ECS とのコラボレーション設定も可能
AWS Step Functions
テスト / 運用しやすいようなプログラミングへ AWS Lambda 環境変数の利用 例えば DB 接続し パスワード URL のような環境情報をハードコーディングをせずに 環境変数から取得する 環境変数で log の出力レベルを変更できるようにするなど
まとめ サーバレス環境でのデプロイ手法 SAM を利用した継続的なデプロイワークフロー手法 CI/CD を支える AWS サービス SAM を使うことで従来の知識との組み合わせのレバレッジが生まれる ログの一元管理も一つのメリット サーバレスだからといって特別なことはない 通常のアプリケーションと同じように開発 / 運用が出来る一方でテストの品質は人依存 浮いた工数をテストレビューやテスト開発にあてることで品質を向上させることが可能
AWS Lambda の本が出ます AWS Lambda を網羅した本を出します 2017 年 6 月 9 日マイナビ出版より出版予定 3,240 円 ( 税込 ) Amazon で予約受け付け中 http://amzn.asia/ew2wwpm
Thank You!
Don t Forget Evaluations!