Slide 1

Slide 1 text

© 2021, Amazon Web Services, Inc. or its Affiliates. アマゾンウェブサービスジャパン ポール(おかだ のぶお) 2021/03/12 Kotlessで始める Serverlessアプリケーション開発

Slide 2

Slide 2 text

© 2021, Amazon Web Services, Inc. or its Affiliates. About me Name: ポール (おかだ のぶお) Twitter : @bulbulpaul Job: Solutions Architect Fav: Beer, Kotlin, Python, Lambda 2

Slide 3

Slide 3 text

© 2021, Amazon Web Services, Inc. or its Affiliates. 話すこと/話さないこと 話すこと • Kotlessの解説 • KotlessでのサーバーレスAPI開発 • AWS Lambdaのコールドスタート対応 話さないこと • Kotlinの詳細な言語仕様 • 他のサーバーレスFWとの細かな比較 3 3

Slide 4

Slide 4 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Agenda • Kotlin? • サーバーレスのおさらい • サーバーレスでのAPI構成 • Kotlessについて • Kotlessを利用したサーバーレスAPI開発 • JVM言語のサーバーレスAPI運用時の考慮点 • まとめ 4 4

Slide 5

Slide 5 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Kotlin?

Slide 6

Slide 6 text

© 2021, Amazon Web Services, Inc. or its Affiliates. 静的型付けのオブジェクト指向 プログラミング言語 Kotlin Foundationが管理するOSS 実行環境としてJVM, JS, Native(LLVM) 最新版は 1.4.31 (2021/03時点) Androidだけでなく、サーバーサイドで の利用も増えてきている JVMに関してはJavaとの互換性を担保 6

Slide 7

Slide 7 text

© 2021, Amazon Web Services, Inc. or its Affiliates. サーバーレスの おさらい

Slide 8

Slide 8 text

© 2021, Amazon Web Services, Inc. or its Affiliates. サーバーレスとは • ユーザーがコントロール可能なサーバーを前提としない • ただし、コンピュートリソースを意識する設定は有り e.g. AWS Lambda: 実行する関数のランタイムのメモリ量 サーバーを意識しない サーバーがない 8

Slide 9

Slide 9 text

© 2021, Amazon Web Services, Inc. or its Affiliates. AWSのサーバーレスなサービス群 Amazon DynamoDB Amazon RDS, Amazon Aurora Amazon API Gateway AWS Step Functions Amazon EventBridge Amazon SNS Amazon SQS, Amazon MQ Amazon Kinesis Data Streams Amazon Kinesis Data Firehose AWS Transfer Family Amazon Cognito Amazon S3, Amazon EFS AWS Lambda AWS AppSync Queue ファイル RDB NoSQL 流⼊データ 流⼊ログ データ保持/管理 ストリーム Pub/Sub イベントバス ワークフロー ロジック フロー制御/イベント処理 外部 I/F API GraphQL 認証・認可 SFTP/FTP 9

Slide 10

Slide 10 text

© 2021, Amazon Web Services, Inc. or its Affiliates. AWSでの サーバーレス構成

Slide 11

Slide 11 text

© 2021, Amazon Web Services, Inc. or its Affiliates. AWSにおけるサーバーレスの代表的なユースケース例 サーバーレスの設計時の参考になる実装例を公開しています。 API設計以外にもデータ処理、イベント駆動の処理連携の例等もあります。 https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/ 11

Slide 12

Slide 12 text

© 2021, Amazon Web Services, Inc. or its Affiliates. AWSにおけるサーバーレスなAPI構成例 公開するAPIをサーバーレスで構成する場合の典型例。 API Gatewayを利用し、Lambdaを経由してデータの参照/更新を実行する。 AWS Cloud AWS Lambda Amazon API Gateway Amazon DynamoDB Client 12

Slide 13

Slide 13 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Amazon API Gateway APIエンドポイントの作成や管理、運用、公開を実現するフルマネージド サービス。REST/HTTP/WebSocketをサポート。 認証認可やWAF連携、バックエンドサービスとの連携が可能。 Amazon API Gateway Lambda関数 EC2インスタンス 他AWS サービス Internet (外部Web) AWS Cloud Client 13

Slide 14

Slide 14 text

© 2021, Amazon Web Services, Inc. or its Affiliates. AWS Lambda ビジネスロジックをフルマネージドな環境で実行するサービス。 実行時間(ms)での課金やコスト効率や柔軟なスケーリングが可能に。 ランタイム • Python • Node.js • Java • Go • Ruby • .NET Core (C#/ PoweShell) • カスタムランタイム • コンテナイメージ New ! AWS Lambda ・ ・ ・ 実行要求 (同期/非同期) Lambda関数 ・ ・ ・ ・ ・ ・ 14

Slide 15

Slide 15 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Amazon Dynamo DB ・ ・ ・ 大規模なパフォーマンス 1 秒あたり数百万件のリクエスト を処理 マイクロ秒のレイテンシーを実現 自動化されたグローバルレプリ ケーション エンタープライズ対応 ACID トランザクション 保管時の暗号化 オンデマンドバックアップおよ び復元 NoSQL Workbench サーバー管理が不要 メンテナンス不要 自動スケーリング オンデマンドキャパシティー モード あらゆる規模に対応する高速で柔軟な キーバリュー データベース 15

Slide 16

Slide 16 text

© 2021, Amazon Web Services, Inc. or its Affiliates. テーブル DynamoDBの主要構造 テーブル内にアイテム(項目)が保存。アイテムはテーブル内にて 「Partition Keyのみ」or 「Partition Key + Sort Key」で一意性が必須 Id:1 Id:2 Id:3 Id:4 Name:a Name:c Name:d Partition Key Sort Key 属性 Date:X Date:Y 名前と値(データ型 付)のペア1つ分 Partition Key以 外はアイテム間で 不揃いOK Name:b アイテム Primary Key (この組み合わせで一意性必須) RDBにおける 「レコード」と同様 (オプション) 16

Slide 17

Slide 17 text

© 2021, Amazon Web Services, Inc. or its Affiliates. AWSにおけるサーバーレスなAPI構成例 公開するAPIをサーバーレスで構成する場合の典型例。 API Gatewayを利用し、Lambdaを経由してデータの参照/更新を実行する。 AWS Cloud AWS Lambda Amazon API Gateway Amazon DynamoDB Client 17

Slide 18

Slide 18 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Kotless

Slide 19

Slide 19 text

© 2021, Amazon Web Services, Inc. or its Affiliates. サーバーレスAPI開発を実現する Kotlin製のフレームワーク Kotlinを開発しているJetBrains の Incubator Project 最新版は 0.16 Beta版は0.17-beta-5 (2021/03時点) 現時点で対応しているクラウド環境は AWSのみ 19

Slide 20

Slide 20 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Kotlessが実現すること • KotlinでのサーバーレスAPIの開発をシンプルにする • APIフレームワークのように実装する • API Gateway + Lambdaのデプロイ • Gradleコマンド(Plugin)でデプロイやローカル実行が可能 • デプロイは内部でTerraformを実行している(拡張も可能) • AWS環境のデプロイに対応(他のクラウドも対応予定) 20

Slide 21

Slide 21 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Kotlessを利用した サーバーレスAPI開発

Slide 22

Slide 22 text

© 2021, Amazon Web Services, Inc. or its Affiliates. APIコード例 @Get(“/wellcome”) fun wellcomeMessage(): String { return “Wellcome to nakanoshima.dev !!” } 22

Slide 23

Slide 23 text

© 2021, Amazon Web Services, Inc. or its Affiliates. APIコード例 @Get(“/wellcome”) fun wellcomeMessage(): String { return “Wellcome to nakanoshima.dev !!” } Lambdaで実行する関数 23

Slide 24

Slide 24 text

© 2021, Amazon Web Services, Inc. or its Affiliates. APIコード例 @Get(“/wellcome”) fun wellcomeMessage(): String { return “Wellcome to nakanoshima.dev !!” } アノテーションでAPI Gateway の リソース設定をする 24

Slide 25

Slide 25 text

© 2021, Amazon Web Services, Inc. or its Affiliates. 先程のコードがどのように構成されているか @Get(“/wellcome”) fun wellcomeMessage(): String { return “Wellcome to nakanoshima.dev !!” } AWS Cloud Amazon API Gateway /welcome GET Lambda関数 25

Slide 26

Slide 26 text

© 2021, Amazon Web Services, Inc. or its Affiliates. 先程のコードがどのように構成されているか @Get(“/wellcome”) fun wellcomeMessage(): String { return “Wellcome to nakanoshima.dev !!” } @Get(“/translate”) fun translate(en: String): String { val result = vocabulary. getByWord(en) return result[“ja”] } AWS Cloud Amazon API Gateway /welcome GET Lambda関数 Lambda関数 /translate GET 26

Slide 27

Slide 27 text

© 2021, Amazon Web Services, Inc. or its Affiliates. 先程のコードがどのように構成されているか @Get(“/wellcome”) fun wellcomeMessage(): String { return “Wellcome to nakanoshima.dev !!” } @Get(“/translate”) fun translate(word: String): String { val result = vocabulary. getByWord(word) return result[“ja”] } AWS Cloud Amazon API Gateway /welcome GET Lambda関数 Lambda関数 /translate GET 27 クエリパラメーターは 引数にマッピングされる

Slide 28

Slide 28 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Lambda関数はどのように分かれるのか 関数の集約単位は設定で指定可能。 • それぞれのLambda関数を作成 • 一つの関数で振り分け • 権限設定単位での関数の集約 • e.g. DynamoDBの参照権限等 AWS Cloud Amazon API Gateway /welcome GET Lambda関数 Lambda関数 /events GET 28

Slide 29

Slide 29 text

© 2021, Amazon Web Services, Inc. or its Affiliates. DBを含めたAPIを構築する Dynamo DBへのアクセスをする関数を作成します。 AWS Cloud Lambda関数 Amazon API Gateway /translate GET Lambda関数 /welcome GET Amazon DynamoDB DynamoDBへの 参照権限をつける 29

Slide 30

Slide 30 text

© 2021, Amazon Web Services, Inc. or its Affiliates. DBの権限設定コード例 @DynamoDBTable(“demo_db”, PermissionLevel.Read) object Vocabulary { private val client: AmazonDynamoDB fun getByWord(word: String): String { … } } 30

Slide 31

Slide 31 text

© 2021, Amazon Web Services, Inc. or its Affiliates. DBの権限設定コード例 @DynamoDBTable(“demo_db”, PermissionLevel.Read) object Vocabulary { private val client: AmazonDynamoDB fun getByWord(word: String): String { … } } アノテーションDynamoDBへの 参照権限設定をする Lambda関数 AWS Cloud Amazon DynamoDB 31

Slide 32

Slide 32 text

© 2021, Amazon Web Services, Inc. or its Affiliates. DBの権限設定コード例 @DynamoDBTable(“demo_db”, PermissionLevel.Read) object Vocabulary { private val client: AmazonDynamoDB fun getByWord(word: String): String { … } } Lambda関数 AWS Cloud Amazon DynamoDB Lambda関数に作成したIAMロール を設定する 32

Slide 33

Slide 33 text

© 2021, Amazon Web Services, Inc. or its Affiliates. DBを含めたAPIをKotlinのコードで構築することが可能 Dynamo DBへのアクセスをする関数を作成します。 AWS Cloud Lambda関数 Amazon API Gateway /translate GET Lambda関数 /welcome GET Amazon DynamoDB DynamoDBへの 参照権限をつける 33

Slide 34

Slide 34 text

© 2021, Amazon Web Services, Inc. or its Affiliates. 他の構成はどうするのか 現時点でKotlessのアノテーションで指定できるのは DynamoDB, SQS(キュー), S3(オブジェクトストレージ)に対応 AWS Cloud Lambda関数 Amazon API Gateway /translate GET Lambda関数 /welcome GET DynamoDB 34 SQS S3

Slide 35

Slide 35 text

© 2021, Amazon Web Services, Inc. or its Affiliates. RDBはどうなる? RDSに接続する場合はRDS Proxyを使って構成頂けます。 AWS Cloud Lambda関数 Amazon API Gateway /translate GET Lambda関数 /welcome GET 35 RDS RDS Proxy

Slide 36

Slide 36 text

© 2021, Amazon Web Services, Inc. or its Affiliates. JVM言語の サーバーレスAPI 運用時の考慮点

Slide 37

Slide 37 text

© 2021, Amazon Web Services, Inc. or its Affiliates. JVM言語をLambdaで利用頂く上で良くある課題 前提としてLambdaはスケーラブルでフルマネージドサービスです。 ですので、まずはそのまま試して頂く事をオススメしています。 ただ、リクエストに波がある一部のアプリケーションで JVMをランタイム起動時の初期処理で課題に上がるケースがあります。 Cold Startの抑制 37

Slide 38

Slide 38 text

© 2021, Amazon Web Services, Inc. or its Affiliates. AWS Lambdaのインスタンスライフサイクル Cold Start コンテナ 生成 パッケージ ロード パッケージ 展開 ランタイム ・ 起動初期化 関数 ・ メソッド起動 デプロイ Warm Start https://d1.awsstatic.com/whitepapers/Overview-AWS-Lambda-Security.pdf Time line ライブラリの読み込みや ハンドラー読み込み等 38 38

Slide 39

Slide 39 text

© 2021, Amazon Web Services, Inc. or its Affiliates. デプロイや起動時の初期化時間を小さくする コンテナ 生成 パッケージ ロード パッケージ 展開 ランタイム ・ 起動初期化 関数 ・ メソッド起動 デプロイ Time line Cold Start コンテナ 生成 Warm Start 39 不要なライブラリの削除、 標準的なクラスの利用、 コンパイル時DIの活用 パッケージのサイズを 小さくする

Slide 40

Slide 40 text

© 2021, Amazon Web Services, Inc. or its Affiliates. リクエストに波があるJVMシステム Time Request count Runtimeの立ち上がり時にCold Startが発生する場 合がある 40

Slide 41

Slide 41 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Provisioned Concurrency コンテナ 生成 パッケージ ロード パッケージ 展開 ランタイム ・ 起動初期化 関数 ・ メソッド起動 デプロイ Time line Cold Startの処理を 事前暖機しておく Cold Start コンテナ 生成 Warm Start 41

Slide 42

Slide 42 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Provisioned Concurrencyの詳細について AWSブログやProvisioned Concurrency Dive Deepの発表スライドもご参考ください。 42

Slide 43

Slide 43 text

© 2021, Amazon Web Services, Inc. or its Affiliates. デプロイや起動時の初期化時間を小さくする コンテナ 生成 パッケージ ロード パッケージ 展開 ランタイム ・ 起動初期化 関数 ・ メソッド起動 デプロイ Time line Cold Start コンテナ 生成 Warm Start 43 不要なライブラリの削除、 標準的なクラスの利用、 コンパイル時DIの活用 パッケージのZipを 小さくする

Slide 44

Slide 44 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Provisioned Concurrency コンテナ 生成 パッケージ ロード パッケージ 展開 ランタイム ・ 起動初期化 関数 ・ メソッド起動 デプロイ Time line Cold Startの処理を 事前暖気しておく Cold Start コンテナ 生成 Warm Start 44

Slide 45

Slide 45 text

© 2021, Amazon Web Services, Inc. or its Affiliates. まとめ

Slide 46

Slide 46 text

© 2021, Amazon Web Services, Inc. or its Affiliates. まとめ • KotlessはKotlinでのサーバーレスAPI開発を 手軽に始めることができるフレームワーク • API Gateway, Lambda, IAMをDSL, アノテーションから構築が可能 • JVMでのコールドスタート対応はまず サイズを小さくするベーシックなアプローチ、 そこからアプリケーション要件に合わせて LambdaのProvisioned Concurrency の利用もご検討ください • 是非KotlinでもサーバーレスAPI開発をやっていきましょう! 46

Slide 47

Slide 47 text

© 2021, Amazon Web Services, Inc. or its Affiliates. 参考資料 Kotless関連 • Kotless official page : https://site.kotless.io/ • Github repository: https://github.com/JetBrains/kotless • Serverless Development With Kotlin and Kotless by Vladislav Tankov: https://www.youtube.com/watch?v=S5sB1qHpRPQ • From Zero to Lambda with Kotless: https://hadihariri.com/2020/05/12/from-zero-to-lamda-with-kotless/ Terraform • aws_lambda_provisioned_concurrency_config: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_provisioned_concurrency_config • aws_appautoscaling_policy: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/appautoscaling_policy AWS関連 • 形で考えるサーバーレス設計 : https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/ • Lamda関数の同時実行数の管理 : https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-concurrency.html • Security Overview of AWS Lambda : https://docs.aws.amazon.com/whitepapers/latest/security-overview-aws-lambda/security- overview-aws-lambda.pdf • Working with AWS Lambda function metrics: https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics.html • Provisioned Concurrency Dive Deep: https://speakerdeck.com/_kensh/aws-lambda-provisioned-concurrency-dive-deep-and-practice • Provisioned Concurrencyのベストプラクティス: https://qiita.com/_kensh/items/5ab0ba7ca71ca82685e3 47

Slide 48

Slide 48 text

© 2021, Amazon Web Services, Inc. or its Affiliates. Thank you! @bulbulpaul