$30 off During Our Annual Pro Sale. View Details »

KotlessではじめるServerlessアプリケーション開発

 KotlessではじめるServerlessアプリケーション開発

nakanoshima.dev #14で発表したKotlessのアプリケーション開発についての発表資料です。

BulBulPaul

March 12, 2021
Tweet

More Decks by BulBulPaul

Other Decks in Technology

Transcript

  1. © 2021, Amazon Web Services, Inc. or its Affiliates. アマゾンウェブサービスジャパン

    ポール(おかだ のぶお) 2021/03/12 Kotlessで始める Serverlessアプリケーション開発
  2. © 2021, Amazon Web Services, Inc. or its Affiliates. About

    me Name: ポール (おかだ のぶお) Twitter : @bulbulpaul Job: Solutions Architect Fav: Beer, Kotlin, Python, Lambda 2
  3. © 2021, Amazon Web Services, Inc. or its Affiliates. 話すこと/話さないこと

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

    • Kotlin? • サーバーレスのおさらい • サーバーレスでのAPI構成 • Kotlessについて • Kotlessを利用したサーバーレスAPI開発 • JVM言語のサーバーレスAPI運用時の考慮点 • まとめ 4 4
  5. © 2021, Amazon Web Services, Inc. or its Affiliates. 静的型付けのオブジェクト指向

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

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

    サーバーレスの設計時の参考になる実装例を公開しています。 API設計以外にもデータ処理、イベント駆動の処理連携の例等もあります。 https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/ 11
  9. © 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
  10. © 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
  11. © 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
  12. © 2021, Amazon Web Services, Inc. or its Affiliates. Amazon

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

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

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

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

    @Get(“/wellcome”) fun wellcomeMessage(): String { return “Wellcome to nakanoshima.dev !!” } アノテーションでAPI Gateway の リソース設定をする 24
  20. © 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
  21. © 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
  22. © 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 クエリパラメーターは 引数にマッピングされる
  23. © 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
  24. © 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
  25. © 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
  26. © 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
  27. © 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
  28. © 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
  29. © 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
  30. © 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
  31. © 2021, Amazon Web Services, Inc. or its Affiliates. JVM言語の

    サーバーレスAPI 運用時の考慮点
  32. © 2021, Amazon Web Services, Inc. or its Affiliates. JVM言語をLambdaで利用頂く上で良くある課題

    前提としてLambdaはスケーラブルでフルマネージドサービスです。 ですので、まずはそのまま試して頂く事をオススメしています。 ただ、リクエストに波がある一部のアプリケーションで JVMをランタイム起動時の初期処理で課題に上がるケースがあります。 Cold Startの抑制 37
  33. © 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
  34. © 2021, Amazon Web Services, Inc. or its Affiliates. デプロイや起動時の初期化時間を小さくする

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

    Time Request count Runtimeの立ち上がり時にCold Startが発生する場 合がある 40
  36. © 2021, Amazon Web Services, Inc. or its Affiliates. Provisioned

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

    Concurrencyの詳細について AWSブログやProvisioned Concurrency Dive Deepの発表スライドもご参考ください。 42
  38. © 2021, Amazon Web Services, Inc. or its Affiliates. デプロイや起動時の初期化時間を小さくする

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

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

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