application lifecycle management in a serverless world

79
Application Lifecycle Management in a Serverless World Keisuke Nishitani (@Keisuke69) Amazon Web Services Japan K.K. Apr 25, 2017

Upload: keisuke-nishitani

Post on 22-Jan-2018

2.872 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Application Lifecycle Management in a Serverless World

Application Lifecycle Managementin a Serverless World

Keisuke Nishitani (@Keisuke69)Amazon Web Services Japan K.K.

Apr 25, 2017

Page 2: Application Lifecycle Management in a Serverless World

Who am IKeisuke NishitaniSpecialist Solutions Architect, ServerlessAmazon Web Service Japan K.K

@Keisuke69 Keisuke69

✤ スタートアップ担当 => Web系担当 =>サーバレスのスペシャリストSA✤ RESTおじさん✤ 餃⼦の王将エヴァンジェリスト(⾃称)✤ ⾳楽が好きです、フジロッカーです、今年も⾏きます✤ ブログ: http://keisuke69.hatenablog.jp/

Keisuke69 Keisuke69Keisuke69x

Page 3: Application Lifecycle Management in a Serverless World

What is Serverless?

Page 4: Application Lifecycle Management in a Serverless World

Serverless = No servers to manage and scale

Page 5: Application Lifecycle Management in a Serverless World

Noservers toprovisionormanage Scaleswithusage

Neverpayforidle Availabilityandfaulttolerancebuiltin

Serverlessとは

Page 6: Application Lifecycle Management in a Serverless World

サーバレスなアプリケーションモデルイベントソース ファンクション サービスなど

JavaC#Node.jsPython

λイベント

S3にオブジェクトが作られるKinesisにストリームデータが保存されるHTTPSによるリクエストetc...

Page 7: Application Lifecycle Management in a Serverless World

Amazon S3 Amazon DynamoDB

Amazon Kinesis

AWS CloudFormation

AWS CloudTrail

Amazon CloudWatch

Amazon SNSAmazonSES

AmazonAPI Gateway

Amazon Cognito

AWSIoT

AmazonAlexa

Cron events

DATASTORES ENDPOINTS

REPOSITORIES EVENT/MESSAGESERVICES

AWS Lambdaと連携するイベントソース

Amazon Config

Amazon Aurora

続々と追加中!

Page 8: Application Lifecycle Management in a Serverless World

AWSのサーバレスオファリング

AWS LambdaAmazon API Gateway

Amazon DynamoDB

Amazon Kinesis Amazon Mobile Analytics

Amazon SNS

Amazon Cognito

AWS IoT

Amazon S3 Amazon Elastic Transcoder

AWS CloudWatch

AWS CloudTrail

Amazon SESAmazon Machine Learning

Amazon Route53Amazon SQS

AWS Step Functions

AmazonSWF

Amazon Pinpoint*

AmazonAthena

Page 9: Application Lifecycle Management in a Serverless World

ユースケース

Web Applications

Data Processing

ChatbotsBackends

</></>

Amazon Alexa

Autonomous IT

• Staticwebsites

• Complexwebapps

• PackagesforFlaskandExpress

• Realtime

• MapReduce

• Batch

• Poweringchatbot logic

• Apps&services

• Mobile

• IoT

• Poweringvoice-enabledapps

• AlexaSkillsKit

• Policyengines

• ExtendingAWSservices

• Infrastructuremanagement

Page 10: Application Lifecycle Management in a Serverless World

So, why are we here today?

Page 11: Application Lifecycle Management in a Serverless World

Application Lifecycle Management

Page 12: Application Lifecycle Management in a Serverless World

サーバレスアプリケーション開発におけるライフサイクルマネジメント✤ 対象

⎻ サーバレスアプリケーションのコード⎻ サーバレスアプリケーションを構成するリソース

✤ やること⎻ コードをどのようにビルド、テストしてデプロイするか⎻ リソースをどのように構成管理してプロビジョニングするか

Page 13: Application Lifecycle Management in a Serverless World

サーバレスアプリケーション開発におけるライフサイクルマネジメント✤ 対象

⎻ サーバレスアプリケーションのコード => Lambdaファンクション⎻ サーバレスアプリケーションを構成するリソース => AWSリソース

✤ やること⎻ コードをどのようにビルド、テストしてデプロイするか⎻ リソースをどのように構成管理してプロビジョニングするか

Page 14: Application Lifecycle Management in a Serverless World

サーバレスアプリケーション開発におけるライフサイクルマネジメント✤ 対象

⎻ サーバレスアプリケーションのコード => Lambdaファンクション⎻ サーバレスアプリケーションを構成するリソース => AWSリソース

✤ やること⎻ Lambdaファンクションをどのようにビルド、テストしてデプロイするか⎻ AWSリソースをどのように構成管理してプロビジョニングするか

Page 15: Application Lifecycle Management in a Serverless World

サーバレスアプリケーション開発におけるライフサイクルマネジメント✤ 対象

⎻ サーバレスアプリケーションのコード => Lambdaファンクション⎻ サーバレスアプリケーションを構成するリソース => AWSリソース

✤ やること⎻ Lambdaファンクションをどのようにビルド、テストしてデプロイするか⎻ AWSリソースをどのように構成管理してプロビジョニングするか

サーバレスといっても特別なことはなく、通常のシステムと同じ

Page 16: Application Lifecycle Management in a Serverless World

開発ワークフロー構築における考慮点✤ 独⽴した複数の環境をどのように構築・維持するか

✤ どのように⾃動化を進めるか

✤ プロビジョニングやコンフィギュレーションが必要なAWSリソースはどれか、そしてそれをどうやるか

✤ 特に開発途中において、アプリケーションやアーキテクチャのテストと検証をどのように⾏っていくか

Page 17: Application Lifecycle Management in a Serverless World

テスト/検証✤ やりたいことは⾃分のコードが正しいことの確認

⎻ シンタックスの問題がないか⎻ 企業のフォーマット標準にあっているか⎻ コンパイルが通るか⎻ ユニットテストを通じて⼗分にテストされているか

✤ サーバレスで確認したいこと⎻ 他のコンポーネントと関連するものとしてファンクションが動くか⎻ アップストリーム、ダウンストリームのエラーを適切にハンドルできるか

✤ アプリケーション/インフラストラクチャ全体で確認したいこと⎻ エンドツーエンドのテスト⎻ セキュリティのベストプラクティスに従っているか⎻ スケーラビリティのハンドリング

Page 18: Application Lifecycle Management in a Serverless World

チェックリスト✤ アプリケーションやインフラリソースのモデル化

✤ 複数環境のコンフィグと管理

✤ ⼿動によるデプロイメント

✤ デリバリプロセスの⾃動化(CI/CD)

✤ デバッグとモニタリング

Page 19: Application Lifecycle Management in a Serverless World

チェックリスト✤ アプリケーションやインフラリソースのモデル化

✤ 複数環境のコンフィグと管理

✤ ⼿動によるデプロイメント

✤ デリバリプロセスの⾃動化(CI/CD)

✤ デバッグとモニタリング

Page 20: Application Lifecycle Management in a Serverless World

Author Package Test Deploy

サーバレスアプリのライフサイクルマネジメント

Page 21: Application Lifecycle Management in a Serverless World

Author Package Test Deploy

AWSLambdaconsole

サーバレスアプリのライフサイクルマネジメント

Page 22: Application Lifecycle Management in a Serverless World

Author Package Test Deploy

AWSLambdaconsole

IDEplugins

サーバレスアプリのライフサイクルマネジメント

Page 23: Application Lifecycle Management in a Serverless World

Author Package Test Deploy

AWSLambdaconsole

IDEplugins

3rd partytoolsTexteditor

サーバレスアプリのライフサイクルマネジメント

Page 24: Application Lifecycle Management in a Serverless World

Author Package Test Deploy

AWSLambdaconsole

IDEplugins

3rd partytoolsTexteditor

サーバレスアプリのライフサイクルマネジメント

Page 25: Application Lifecycle Management in a Serverless World

サーバレスアプリのライフサイクルマネジメント

✤ 数⼗、数百のAWSリソースから構成される場合はどうするか?⎻ Lambdaファンクションだけでなく、関連するAWSリソースも

✤ 開発チームが巨⼤な場合はどうするか?⎻ マネジメントコンソールを使⽤したプロセスはありえない

Author Package Test Deploy

Page 26: Application Lifecycle Management in a Serverless World

AWS Serverless Application Model(powered by CloudFormation)

Page 27: Application Lifecycle Management in a Serverless World

AWS CloudFormation✤ 関連するAWSリソースのコレクションの

プロビジョンと管理

✤ JSON / YAMLで環境を記述⎻ テキストファイルなのでバージョン管理システ

ムにも登録可能⎻ このテンプレートを使って何個でも同じ環境を

つくれる

✤ アプリケーション=CloudFormation stack

✤ テンプレートファイルがインプットであり、プロビジョニングされたAWSリソースがアウトプット

Page 28: Application Lifecycle Management in a Serverless World

AWS Serverless Application Model (SAM)✤ サーバレスアプリに最適化したAWS CloudFomationの拡張

✤ サーバレスアプリ⽤の新たなリソースタイプ⎻ 関数⎻ API⎻ テーブル

✤ CloudFormationがサポートしているすべてのものをサポート

✤ 既存のファンクションをSAMテンプレートとしてエクスポート可能

✤ オープンな仕様(Apache 2.0)

Page 29: Application Lifecycle Management in a Serverless World

SAMテンプレートAWSTemplateFormatVersion: '2010-09-09’

Transform: AWS::Serverless-2016-10-31

Resources:

GetHtmlFunction:

Type: AWS::Serverless::Function

Properties:

CodeUri: s3://flourish-demo-bucket/todo_list.zip

Handler: index.gethtml

Runtime: nodejs4.3

Policies: AmazonDynamoDBReadOnlyAccess

Events:

GetHtml:

Type: Api

Properties:

Path: /{proxy+}

Method: ANY

ListTable:

Type: AWS::Serverless::SimpleTable

Page 30: Application Lifecycle Management in a Serverless World

SAMテンプレートAWSTemplateFormatVersion: '2010-09-09’

Transform: AWS::Serverless-2016-10-31

Resources:

GetHtmlFunction:

Type: AWS::Serverless::Function

Properties:

CodeUri: s3://flourish-demo-bucket/todo_list.zip

Handler: index.gethtml

Runtime: nodejs4.3

Policies: AmazonDynamoDBReadOnlyAccess

Events:

GetHtml:

Type: Api

Properties:

Path: /{proxy+}

Method: ANY

ListTable:

Type: AWS::Serverless::SimpleTable

AWS SAMのテンプレートであり、変換が必要であると宣⾔

Page 31: Application Lifecycle Management in a Serverless World

SAMテンプレートAWSTemplateFormatVersion: '2010-09-09’

Transform: AWS::Serverless-2016-10-31

Resources:

GetHtmlFunction:

Type: AWS::Serverless::Function

Properties:

CodeUri: s3://flourish-demo-bucket/todo_list.zip

Handler: index.gethtml

Runtime: nodejs4.3

Policies: AmazonDynamoDBReadOnlyAccess

Events:

GetHtml:

Type: Api

Properties:

Path: /{proxy+}

Method: ANY

ListTable:

Type: AWS::Serverless::SimpleTable

必要なアクセス権やランタイム、コードの場所などを指定してLambdaファンクションを定義

Page 32: Application Lifecycle Management in a Serverless World

SAMテンプレートAWSTemplateFormatVersion: '2010-09-09’

Transform: AWS::Serverless-2016-10-31

Resources:

GetHtmlFunction:

Type: AWS::Serverless::Function

Properties:

CodeUri: s3://flourish-demo-bucket/todo_list.zip

Handler: index.gethtml

Runtime: nodejs4.3

Policies: AmazonDynamoDBReadOnlyAccess

Events:

GetHtml:

Type: Api

Properties:

Path: /{proxy+}

Method: ANY

ListTable:

Type: AWS::Serverless::SimpleTable

イベントの定義この例ではAPIとして⽤意するURIや、HTTPメソッドを定義

Page 33: Application Lifecycle Management in a Serverless World

SAMテンプレートAWSTemplateFormatVersion: '2010-09-09’

Transform: AWS::Serverless-2016-10-31

Resources:

GetHtmlFunction:

Type: AWS::Serverless::Function

Properties:

CodeUri: s3://flourish-demo-bucket/todo_list.zip

Handler: index.gethtml

Runtime: nodejs4.3

Policies: AmazonDynamoDBReadOnlyAccess

Events:

GetHtml:

Type: Api

Properties:

Path: /{proxy+}

Method: ANY

ListTable:

Type: AWS::Serverless::SimpleTable

DynamoDBのテーブルを作成

Page 34: Application Lifecycle Management in a Serverless World

変換後のテンプレートAWSTemplateFormatVersion: '2010-09-09'

Resources:

GetHtmlFunctionGetHtmlPermissionProd:

Type: AWS::Lambda::Permission

Properties:

Action: lambda:invokeFunction

Principal: apigateway.amazonaws.com

FunctionName:

Ref: GetHtmlFunction

SourceArn:

Fn::Sub: arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${ServerlessRestApi}/Prod/ANY/*

ServerlessRestApiProdStage:

Type: AWS::ApiGateway::Stage

Properties:

DeploymentId:

Ref: ServerlessRestApiDeployment

RestApiId:

Ref: ServerlessRestApi

StageName: Prod

ListTable:

Type: AWS::DynamoDB::Table

Properties:

ProvisionedThroughput:

WriteCapacityUnits: 5

ReadCapacityUnits: 5

AttributeDefinitions:

- AttributeName: id

AttributeType: S

KeySchema:

- KeyType: HASH

AttributeName: id

GetHtmlFunction:

Type: AWS::Lambda::Function

Properties:

Handler: index.gethtml

Code:

S3Bucket: flourish-demo-bucket

S3Key: todo_list.zip

Role:

Fn::GetAtt:

- GetHtmlFunctionRole

- Arn

Runtime: nodejs4.3

GetHtmlFunctionRole:

Type: AWS::IAM::Role

Properties:

ManagedPolicyArns:

- arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess

- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

AssumeRolePolicyDocument:

Version: '2012-10-17'

Statement:

- Action:

- sts:AssumeRole

Effect: Allow

Principal:

Service:

- lambda.amazonaws.com

ServerlessRestApiDeployment:

Type: AWS::ApiGateway::Deployment

Properties:

RestApiId:

Ref: ServerlessRestApi

Description: 'RestApi deployment id: 127e3fb91142ab1ddc5f5446adb094442581a90d'

StageName: Stage

GetHtmlFunctionGetHtmlPermissionTest:

Type: AWS::Lambda::Permission

Properties:

Action: lambda:invokeFunction

Principal: apigateway.amazonaws.com

FunctionName:

Ref: GetHtmlFunction

SourceArn:

Fn::Sub: arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${ServerlessRestApi}/*/ANY/*

ServerlessRestApi:

Type: AWS::ApiGateway::RestApi

Properties:

Body:

info:

version: '1.0'

title:

Ref: AWS::StackName

paths:

"/{proxy+}":

x-amazon-apigateway-any-method:

x-amazon-apigateway-integration:

httpMethod: ANY

type: aws_proxy

uri:

Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetHtmlFunction.Arn}/invocations

responses: {}

swagger: '2.0'

Page 35: Application Lifecycle Management in a Serverless World

SAMで利⽤可能なリソースタイプ✤ AWS::Serverless::Function

⎻ Lambdaファンクション⎻ コードだけでなくメモリなどファンクション⾃体の設定⎻ イベントソースの設定

Page 36: Application Lifecycle Management in a Serverless World

SAMで利⽤可能なリソースタイプ✤ AWS::Serverless::Function

⎻ Lambdaファンクション⎻ コードだけでなくメモリなどファンクション⾃体の設定⎻ イベントソースの設定

✤ AWS::Serverless::Api⎻ Amazon API Gatewayを利⽤したAPIの作成⎻ HTTPSのエンドポイントを通じて呼び出されるリソースとメソッドを定義⎻ AWS::Serverless::FunctionでAPI Gatewayをイベントソースとする定義をしていると⾃動で作成される⎻ Swaggerを利⽤してより細かく管理する場合はこの定義が必須

Page 37: Application Lifecycle Management in a Serverless World

SAMで利⽤可能なリソースタイプ✤ AWS::Serverless::Function

⎻ Lambdaファンクション⎻ コードだけでなくメモリなどファンクション⾃体の設定⎻ イベントソースの設定

✤ AWS::Serverless::Api⎻ Amazon API Gatewayを利⽤したAPIの作成⎻ HTTPSのエンドポイントを通じて呼び出されるリソースとメソッドを定義⎻ AWS::Serverless::FunctionでAPI Gatewayをイベントソースとする定義をしていると⾃動で作成される⎻ Swaggerを利⽤してより細かく管理する場合はこの定義が必須

✤ AWS::Serverless::SimpleTable⎻ DynamoDBのシンプルなテーブルを作成⎻ 細かい設定が必要な場合は通常の AWS::DynamoDB::Tableを使⽤して定義する

Page 38: Application Lifecycle Management in a Serverless World

チェックリスト✤ アプリケーションやインフラリソースのモデル化

✤ 複数環境のコンフィグと管理

✤ ⼿動によるデプロイメント

✤ デリバリプロセスの⾃動化(CI/CD)

✤ デバッグとモニタリング

Page 39: Application Lifecycle Management in a Serverless World

複数環境の構成✤ アプリケーションを構築、テスト、実⾏するにはリソースごと分けた異な

る環境を⽤意するのがよい

✤ Why?⎻ リソースの利⽤が被らないようにするため⎻ ユーザ影響なく新規コードを「安全」にテストするため⎻ インフラ構成の変更を「安全」にテストするため

✤ How?⎻ AWSアカウントをわける⎻ Infrastracture as a Codeのツールを活⽤する⎻ アプリケーションのデリバリとテストを⾃動化する

Page 40: Application Lifecycle Management in a Serverless World

複数環境を構成する2種類の⽅法✤同⼀アカウント、別スタック

⎻ メリット⎻ リソースの管理が簡単⎻ 管理/モニタリングツールを通じた容易

な可視化

⎻ デメリット⎻ パーミッションやアクセス権の分離が

難しい⎻ 数が増えると⾒通しが悪くなる

✤複数アカウント⎻ メリット

⎻ パーミッションとアクセス権の分離が保証される

⎻ 利⽤量をコントロールするためのアカウントごとのリソース制限

⎻ デメリット⎻ 複数アカウントの管理とコントロール

のオーバーヘッド

Page 41: Application Lifecycle Management in a Serverless World

複数環境を構成する2種類の⽅法✤同⼀アカウント、別スタック

⎻ メリット⎻ リソースの管理が簡単⎻ 管理/モニタリングツールを通じた容易

な可視化

⎻ デメリット⎻ パーミッションやアクセス権の分離が

難しい⎻ 数が増えると⾒通しが悪くなる

✤複数アカウント⎻ メリット

⎻ パーミッションとアクセス権の分離が保証される

⎻ 利⽤量をコントロールするためのアカウントごとのリソース制限

⎻ デメリット⎻ 複数アカウントの管理とコントロール

のオーバーヘッド

⼩規模なチーム/個⼈におすすめ ⼤規模なチーム/企業におすすめ

Page 42: Application Lifecycle Management in a Serverless World

複数環境を構成する2種類の⽅法✤同⼀アカウント、別スタック

⎻ メリット⎻ リソースの管理が簡単⎻ 管理/モニタリングツールを通じた容易

な可視化

⎻ デメリット⎻ パーミッションやアクセス権の分離が

難しい⎻ 数が増えると⾒通しが悪くなる

✤複数アカウント⎻ メリット

⎻ パーミッションとアクセス権の分離が保証される

⎻ 利⽤量をコントロールするためのアカウントごとのリソース制限

⎻ デメリット⎻ 複数アカウントの管理とコントロール

のオーバーヘッド

⼩規模なチーム/個⼈におすすめ ⼤規模なチーム/企業におすすめAWS Organizationsの利⽤検討を

Page 43: Application Lifecycle Management in a Serverless World

AWS Organizations✤ 複数のAWSアカウントを運⽤するためのサービス

✤ APIを使⽤してAWSアカウントを作成可能

✤ 追加コストなし。

Page 44: Application Lifecycle Management in a Serverless World

1つのテンプレートを複数環境にデプロイ

λλλ

1つのテンプレート

バージョン管理

Git etc…

Production

Staging

Testing

環境ごとにデプロイ

Page 45: Application Lifecycle Management in a Serverless World

チェックリスト✤ アプリケーションやインフラリソースのモデル化

✤ 複数環境のコンフィグと管理

✤ ⼿動によるデプロイメント

✤ デリバリプロセスの⾃動化(CI/CD)

✤ デバッグとモニタリング

Page 46: Application Lifecycle Management in a Serverless World

パッケージとデプロイに関するAWSコマンド✤ AWS SAMのリリースにともない以下のコマンドが追加✤ aws cloudformation package

⎻ デプロイパッケージの作成(.zip file) ⎻ Amazon S3バケットへのデプロイパッケージのアップロード⎻ S3 URIによるCodeUriプロパティの追加

✤ aws cloudformation deploy⎻ CloudFormationの‘CreateChangeSet’ APIをコール⎻ CloudFormationの‘ExecuteChangeSet’ APIをコール

Page 47: Application Lifecycle Management in a Serverless World

チェックリスト✤ アプリケーションやインフラリソースのモデル化

✤ 複数環境のコンフィグと管理

✤ ⼿動によるデプロイメント

✤ デリバリプロセスの⾃動化(CI/CD)

✤ デバッグとモニタリング

Page 48: Application Lifecycle Management in a Serverless World

AWS CodePipeline✤ ⾼速かつ信頼性の⾼いアプリケーション更新のためのサービス

✤ 独⾃のワークフローを定義⎻ ソースコードチェック⎻ ビルド⎻ テスト⎻ デプロイ

✤ ソフトウェアのリリースプロセスをモデル化し可視化

✤ Git pushごとにビルド、テスト、デプロイ

✤ AWSサービスやサードパーティツールとのインテグレーション

Page 49: Application Lifecycle Management in a Serverless World

Source

SourceGitHub

Build

JenkinsOnEC2Jenkins

Deploy

JavaAppElasticBeanstalk

Pipeline

CodePipeline

Page 50: Application Lifecycle Management in a Serverless World

Source

SourceGitHub

Build

JenkinsOnEC2Jenkins

Deploy

JavaAppElasticBeanstalk

Stage

CodePipeline

Page 51: Application Lifecycle Management in a Serverless World

Source

SourceGitHub

Build

JenkinsOnEC2Jenkins

Deploy

JavaAppElasticBeanstalk

Action

CodePipeline

Page 52: Application Lifecycle Management in a Serverless World

Source

SourceGitHub

Build

JenkinsOnEC2Jenkins

Deploy

JavaAppElasticBeanstalk

NotifyDevelopersLambda

CodePipelineMyApplication

Parallelactions

Page 53: Application Lifecycle Management in a Serverless World

Source

SourceGitHub

Build

JenkinsOnEC2Jenkins

Deploy

JavaAppElasticBeanstalk

TestAPIRunscope

CodePipelineMyApplication

Sequential actions

Page 54: Application Lifecycle Management in a Serverless World

Source

SourceGitHub

Build

JenkinsOnEC2Jenkins

Deploy

JavaAppElasticBeanstalk

TestAPIRunscope

CodePipelineMyApplication

Transition

Page 55: Application Lifecycle Management in a Serverless World

What about build?

Page 56: Application Lifecycle Management in a Serverless World

デプロイパッケージのビルド

Node.js & Python• コードとすべての依存関係を含

むZIPファイル

• npm/pipを使ってライブラリをインストール

Java• コードとすべての依存関係を含

むZIPファイルもしくはスタンドアロンJar

• MavenやEclipseのプラグインを使ってライブラリをインストール

• コンパイルされたクラスとリソースファイル、/libにあるライブラリ

C#(.NET Core)• コードとすべての依存関係を含

むZIPファイルもしくはスタンドアロン.dll

• NuGetやプラグインを使ってライブラリのインストール

Page 57: Application Lifecycle Management in a Serverless World

AWS CodeBuild✤ クラウド上でのビルドとテスト

⎻ ボリュームに合わせて⾃動でスケール⎻ 分単位の時間課⾦

✤ ソースレポジトリとして、AWS CodeCommit、 GitHub、S3を利⽤できる

✤ ビルド環境としてPython、Java、Node.jsをサポート⎻ テストツールを含めたカスタムビルド環境も構築可能

✤ CodePipelineと連携しCI/CD環境を実現

Page 58: Application Lifecycle Management in a Serverless World

サーバレスアプリのパイプライン

Source Build Beta Test Prod

Page 59: Application Lifecycle Management in a Serverless World

サーバレスアプリのパイプライン

GitHub CodeBuild Ghostinspector

Source Build Beta Test Prod

CloudFormation(AWSSAM)

CloudFormation(AWSSAM)

Page 60: Application Lifecycle Management in a Serverless World

サーバレスアプリのパイプライン

GitHub CodeBuild Ghostinspector

Source Build Beta Test Prod

CloudFormation(AWSSAM)

CloudFormation(AWSSAM)

✤ CodePipelineを⽤いてGithubもしくはCodeCommitからソースを直接Pull

Page 61: Application Lifecycle Management in a Serverless World

サーバレスアプリのパイプライン

GitHub CodeBuild Ghostinspector

Source Build Beta Test Prod

CloudFormation(AWSSAM)

CloudFormation(AWSSAM)

✤ CodePipelineを⽤いてGithubもしくはCodeCommitからソースを直接Pull✤ AWS CodeBuildでサーバレスアプリのビルドとパッケージング

⎻ npm、pip、Javaコンパイル

Page 62: Application Lifecycle Management in a Serverless World

サーバレスアプリのパイプライン

GitHub CodeBuild Ghostinspector

Source Build Beta Test Prod

CloudFormation(AWSSAM)

CloudFormation(AWSSAM)

✤ CodePipelineを⽤いてGithubもしくはCodeCommitからソースを直接Pull✤ AWS CodeBuildでサーバレスアプリのビルドとパッケージング

⎻ npm、pip、Javaコンパイル✤ AWS CloudFormationで完成したアプリをデプロイ

Page 63: Application Lifecycle Management in a Serverless World

サーバレスアプリのパイプライン

GitHub CodeBuild Ghostinspector

Source Build Beta Test Prod

CloudFormation(AWSSAM)

CloudFormation(AWSSAM)

✤ CodePipelineを⽤いてGithubもしくはCodeCommitからソースを直接Pull✤ AWS CodeBuildでサーバレスアプリのビルドとパッケージング

⎻ npm、pip、Javaコンパイル✤ AWS CloudFormationで完成したアプリをデプロイ✤ サードパーティツールによるテスト

Page 64: Application Lifecycle Management in a Serverless World

サーバレスアプリのパイプライン

GitHub CodeBuild Ghostinspector

Source Build Beta Test Prod

CloudFormation(AWSSAM)

CloudFormation(AWSSAM)

✤ CodePipelineを⽤いてGithubもしくはCodeCommitからソースを直接Pull✤ AWS CodeBuildでサーバレスアプリのビルドとパッケージング

⎻ npm、pip、Javaコンパイル✤ AWS CloudFormationで完成したアプリをデプロイ✤ サードパーティツールによるテスト✤ 本番環境へのデプロイ

Page 65: Application Lifecycle Management in a Serverless World

チェックリスト✤ アプリケーションやインフラリソースのモデル化

✤ 複数環境のコンフィグと管理

✤ ⼿動によるデプロイメント

✤ デリバリプロセスの⾃動化(CI/CD)

✤ デバッグとモニタリング

Page 66: Application Lifecycle Management in a Serverless World

メトリクスとログ✤CloudWatchメトリクス

⎻ 標準⎻ Invocations⎻ Duration⎻ Throttles⎻ Errors

⎻ カスタムメトリクスの作成

✤CloudWatch Logs⎻ 呼び出しごとに「START」、「

END」、「REPORT」エントリがCloudWatch Logsに出⼒される

⎻ 独⾃のログエントリを出⼒

⎻ 可視化のためにサードパーティツールを利⽤

Page 67: Application Lifecycle Management in a Serverless World

メトリクスとログ✤CloudWatchメトリクス

⎻ 標準⎻ Invocations⎻ Duration⎻ Throttles⎻ Errors

⎻ カスタムメトリクスの作成

✤CloudWatch Logs⎻ 呼び出しごとに「START」、「

END」、「REPORT」エントリがCloudWatch Logsに出⼒される

⎻ 独⾃のログエントリを出⼒

⎻ 可視化のためにサードパーティツールを利⽤

Page 68: Application Lifecycle Management in a Serverless World

AWS X-Rayを使ったトラブルシューティング✤ AWS X-Rayを⽤いることでサービス間のイベントの

遷移を可視化

✤ Lambdaファンクションから他のサービスに対する呼び出しと時間をトレース

✤ ファンクションとサービスの依存関係、関連性を実際に⽬視

✤ 消えたイベントやスロットルといった状態を確認したり診断したりが簡単に

✤ 簡単なセットアップ

簡単セットアップ

AWSLambda

AmazonS3

AmazonDynamoDB

Page 69: Application Lifecycle Management in a Serverless World

AWS X-Rayを使ったトラブルシューティング✤ ⾮同期呼び出しの滞留時間とリトライを確認✤ AWSサービスに対する呼び出しパフォーマンスをプロファイリング

⎻ イベント処理の失敗を検知⎻ パフォーマンス問題の特定と修正が簡単に

dwelltimes

servicecalltimes

retries

Page 70: Application Lifecycle Management in a Serverless World

Service map

Page 71: Application Lifecycle Management in a Serverless World

チェックリスト✤ アプリケーションやインフラリソースのモデル化

✤ 複数環境のコンフィグと管理

✤ ⼿動によるデプロイメント

✤ デリバリプロセスの⾃動化(CI/CD)

✤ デバッグとモニタリング

Page 72: Application Lifecycle Management in a Serverless World

まとめ✤ サーバレスアプリにおけるライフサイクルマネージメント

⎻ サーバレスアプリケーションのコード⎻ サーバレスアプリケーションのリソース⎻ ⼀般的なシステムと⼤きな違いはない

✤ サーバレスアプリのモデル化とデプロイを実現するAWS SAM⎻ ユニットテストはこれまで通り

✤ サーバレスアプリのビルドとデリバリパイプライン⎻ CodeBuild⎻ CodePipeline

✤ サーバレスアプリのデバッグ⎻ CloudWatch⎻ CloudWatch Logs⎻ X-Ray

Page 73: Application Lifecycle Management in a Serverless World

最後に、

Page 74: Application Lifecycle Management in a Serverless World

ローカル実⾏について

Page 75: Application Lifecycle Management in a Serverless World

テストドライバ例

import jsonimport lambda_function

f = open(“event.json”)event = json.load(f)f.close()

context = "”

lambda_function.lambda_handler(event,context)

Page 76: Application Lifecycle Management in a Serverless World

テストドライバ例

import jsonimport lambda_function

f = open(“event.json”)event = json.load(f)f.close()

context = "”

lambda_function.lambda_handler(event,context)

イベントを静的ファイルとして⽤意しておき、ロード

<= 必要に応じて設定する(今回は空)

<= ファンクションの実⾏

Page 77: Application Lifecycle Management in a Serverless World

テストドライバ例

def lambda_handler(event, context):#Do something

if __name__ == "__main__":f = open("event.json")event = json.load(f)f.close()

context = ""

lambda_handler(event,context)

• Pythonの場合、以下のようにすることでも可能。Javaも同様にPublicなmainメソッドを定義して内部で呼び出すことも可能

Page 78: Application Lifecycle Management in a Serverless World

AWS Dev Day Tokyo 2017• 2017/5/31(⽔)〜 6/2(⾦)

• 受付開始 9:00〜• セッション 13:20〜

• 品川プリンスホテルアネックスタワー 5F プリンスホール

• 来場無料(要事前申し込み)http://www.awssummit.tokyo/devday/index.html

5/31(⽔) 6/1(⽊) 6/2(⾦)• Serverless Evolution Day• Microservices、DevOps、IoT、Deep Learning

など最先端技術にフォーカスした実践的なセッション• Amazon.com CTO Werner Vogelsも登壇

Page 79: Application Lifecycle Management in a Serverless World