Upgrade to Pro — share decks privately, control downloads, hide ads and more …

サーバーレスAPIをKotlinで開発してみよう!

 サーバーレスAPIをKotlinで開発してみよう!

JJUG CCC 2021 Springでの発表資料です。

BulBulPaul

May 23, 2021
Tweet

More Decks by BulBulPaul

Other Decks in Technology

Transcript

  1. © 2021, Amazon Web Services, Inc. or its Affiliates. ポール

    @bulbulpaul Amazon Web Services Japan サーバーレスAPIを Kotlinで開発してみよう - JJUG CCC 2021 Spring - 2021/05/23 !
  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. 話すこと/話さないこと

    話すこと • KotlinでのサーバーレスAPI開発 • サーバーレスアプリケーションモデル(SAM)を使った開発方法 • サーバーレス / Kotlin でのテスト • CI/CDの利用例(Github Actions ver.) 話さないこと • Kotlinの詳細な言語仕様 • 他のサーバーレスFWとの細かな比較 • AWSの各サービスの詳細な解説 3 3
  4. © 2021, Amazon Web Services, Inc. or its Affiliates. Disclaimer

    本資料は作成時点(2021/05)の以下のバージョンを前提とします。 • Kotlin 1.5.0 • Gradle 6.8.3 • AWS SAM 1.21.1 • AWS Toolkit for IntelliJ IDEA 1.2.6 4 4
  5. © 2021, Amazon Web Services, Inc. or its Affiliates. アジェンダ

    • Kotlinの概要 • サーバーレスのおさらい • サーバーレスアプリケーションの構成パターン • Kotlinでのサーバーレスアプリケーション • 開発 • テスト • CI/CD • まとめ
  6. © 2021, Amazon Web Services, Inc. or its Affiliates. 静的型付けのオブジェクト指向

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

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

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

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

    Lambdaが提供しているランタイム • Java8 (open-jdk, corretto) • Java11(coretto) 他にもLambdaに対応したコンテナイメージが利用可能なので 別のJVMを使ったコンテナを作成頂いて利用いただくことも可能です。 15 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html
  12. © 2021, Amazon Web Services, Inc. or its Affiliates. サーバーレスAPI開発に利用するツール・フレームワーク

    AWSが提供しているServerless Application Model(SAM)を 使ってKotlinでのAPI開発を実施します。 他にもServerless Framework, Kotless等のフレームワークもあります。 16 https://speakerdeck.com/bulbulpaul/kotlessdehazimeruserverlessapurikesiyonkai-fa KotlessでのサーバーレスAPI開発に ついては過去の登壇資料があります ので、そちらをご参照ください。
  13. © 2021, Amazon Web Services, Inc. or its Affiliates. AWS

    Serverless Application Model (SAM) • サーバーレスAPIだけではなくイベント駆動な アプリケーションの開発・デプロイに特化 • CLIを提供し、ローカル実行やデプロイコマンドを 提供 • デプロイにはCloudFormationが利用されている • OSSとしてGithub上で公開し開発をしている サーバーレスアプリケーション開発をサポートするツール https://github.com/aws/serverless-application-model
  14. © 2021, Amazon Web Services, Inc. or its Affiliates. AWSにおけるサーバーレスなAPI構成例

    公開するAPIをサーバーレスで構成する場合の典型例。 API Gatewayを利用し、Lambdaを経由してRDBのデータ参照/更新を 実行する。 AWS Cloud AWS Lambda Amazon API Gateway Amazon RDS Client 19
  15. © 2021, Amazon Web Services, Inc. or its Affiliates. Kotlinのプロジェクトを作成

    1. SAMを使って元になるプロジェクトを生成 2. 現在は初期化テンプレートにKotlinで存在しないので、Javaのプロ ジェクトを生成し、IntelliJのConvert to KotlinでKotlin化 3. IntelliJでローカル実行やテストが実行をする
  16. © 2021, Amazon Web Services, Inc. or its Affiliates. Demo

    (SAMでのプロジェクト作成、Kotlin化)
  17. © 2021, Amazon Web Services, Inc. or its Affiliates. AWSにおけるサーバーレスなAPI構成例

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

    • 1つのLambdaインスタンスで同時に実行されるリクエストは1つ • Lambdaは関数を同時実行し水平方向にスケールアウトする。 実行環境毎にRDBへ接続すると接続数の制限や接続コストが発生する • Lambdaインスタンス内でコネクションプーリングをしてもあまり効果 がない Amazon RDS AWS Lambda Lambdaインスタンス
  19. © 2021, Amazon Web Services, Inc. or its Affiliates. サーバーレスにおけるRDB接続はRDS

    Proxyを利用 • コネクションプーリングが必要な場合は RDS Proxy を利用してマネージドなコネクションプール接続をする • LambdaからはRDS Proxyへ接続する コネクションが埋まっている場合はwaitが発生する Amazon RDS
  20. © 2021, Amazon Web Services, Inc. or its Affiliates. AWSにおけるサーバーレスなAPI構成例

    公開するAPIをサーバーレスで構成する場合の典型例。 API Gatewayを利用し、Lambdaを経由してRDBのデータ参照/更新を 実行する。 AWS Cloud AWS Lambda Amazon API Gateway Amazon RDS Client 25
  21. © 2021, Amazon Web Services, Inc. or its Affiliates. Kotlinでのシリアライズ・デシリアライズ

    Kotlinではkotlinx.serialization というマルチプラットフォーム向けの ライブラリが提供されています。 こちらはreflectionless serializationとなり、Jackson-module-kotlin等の ライブラリよりも軽量に扱うことが可能です。 https://github.com/Kotlin/kotlinx.serialization
  22. © 2021, Amazon Web Services, Inc. or its Affiliates. 開発時におけるその他のTips

    初期化が必要な処理はHandler内で行わずにStatic領域を活用する。 e.g. ロガー、シリアライザー、SDKやクライアントの初期化 ただし、Kotlinの場合はStatic修飾子がない為 Companion Objectを利用する。
  23. © 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 ライブラリの読み込みや ハンドラー読み込み等 28 28
  24. © 2021, Amazon Web Services, Inc. or its Affiliates. デプロイや起動時の初期化時間を小さくする

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

    ü ライブラリ内で不要なものは取り除く Gradleならdependenciesでexcludeを設定する → Jarのサイズを小さくするので、初期化処理が速くなる ü KotlinやJavaの標準機能で実装する → ライブラリを使わない為、初期化処理が速くなる ü AWS SDK for Javaは2.xを利用する → パフォーマンス観点でも2.xの方が良い ü AWS SDKの設定を明示的に記載する → 利用リージョン等が自動設定されるが、手動にするほうが少し速い ü Lambda関数からLambda関数を呼び出すのを避ける → 呼び出し元はレスポンス待ちの間も料金が発生する。 AWS StepFunctions等の活用を検討したほうが良い
  26. © 2021, Amazon Web Services, Inc. or its Affiliates. 開発ステップのまとめ

    • AWS SAM を使ってプロジェクトの生成やローカル実行、デプロイが 可能 • 他にもKotlessやServerless Frameworkもあります • Kotlinで初期化テンプレートは未対応の為、Kotlinへの変換が必要 • IDE向けにAWS Toolkitが提供されている • RDBへのコネクションプールが必要な場合はRDS Proxyを利用する • JSONのシリアライズはkotlinx.serialization ライブラリを利用する • Lambdaの特性やライフサイクルを理解し、実行時の速度や初期化の 速度改善はベストプラクティスやTipsを活用 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html
  27. © 2021, Amazon Web Services, Inc. or its Affiliates. アーキテクチャから見た考え方の例

    AWS Lambda Amazon API Gateway Amazon RDS 周辺知識が必要な結合テスト 外部に依存しないテスト
  28. © 2021, Amazon Web Services, Inc. or its Affiliates. Kotlinでのテストツール群

    • テストフレームワーク/ランナー • JUnit • Javaでもおなじみ • Kotest • Kotlin製フレームワーク • Spek • Kotlin製テストフレームワーク GhrkinやSpecificationのスタイルでテストを定義する • Mock • mockk • Kotlin製のMockライブラリ、宣言的にMockを定義可能 • mockito-kotlin • MockitoのKotlinヘルパー
  29. © 2021, Amazon Web Services, Inc. or its Affiliates. テストステップのまとめ

    • テストを分けて考える • Lambdaが接する世界 • DBや外部に依存するテスト等はMock等を活用し、テストをする • Lambdaや接する世界の知識が無くても良い部分 • 処理が独立しているのでUnit Testしやすい • Kotlinのテストツールを使ってKotlinらしく宣言的に テストコードを書くことが可能
  30. © 2021, Amazon Web Services, Inc. or its Affiliates. SAMでのデプロイ

    SAM CLI でデプロイコマンドが利用可能です。 CI/CDのサービスでもこちらのコマンドを利用します。 AWS Cloud AWS Lambda Amazon API Gateway Amazon RDS sam deploy SAM CLI
  31. © 2021, Amazon Web Services, Inc. or its Affiliates. Github

    Actionsを利用したSAMのCI/CD Lambda Github Actions Github Repository SAM CLI Client PC Push Trigger Deploy Run Test / Deploy
  32. © 2021, Amazon Web Services, Inc. or its Affiliates. Github

    Actions 利用時の設定方法 1. IAMでCI用のアカウントを作成する 2. Github ActionsのSecretsに以下を設定する 1. REGION: 利用リージョン 2. ACCESS_KEY_ID: アクセスキーID 3. SECRET_ACCESS_KEY: アクセスキー 3. .github/workflowsにjobの定義するyamlを作成する 1. この時、クレデンシャルの検証は aws-actions/configure-aws-credentials@v1のアクションを利用する 2. TestはGradleのtestタスク 3. SAMを使ってvalidate, build, deployを実行する AWS for Github Actions: https://github.com/aws-actions
  33. © 2021, Amazon Web Services, Inc. or its Affiliates. Github

    Actionsのworkflowイメージ① AWSが公開しているアクションを 利用してクレデンシャルを検証 Secretsから値を読み込み
  34. © 2021, Amazon Web Services, Inc. or its Affiliates. Github

    Actionsのworkflowイメージ② SAMを使ったBuild, Deploy SAMを使ったBuild, Deploy
  35. © 2021, Amazon Web Services, Inc. or its Affiliates. CI/CDステップのまとめ

    • SAMの場合、デプロイコマンドが利用可能 • Github ActionsのSecretsにクレデンシャル情報の保存が必要 • Unit TestはGradleのtestタスクで実行する • ビルドやデプロイはSAM validate, build, deployを利用する • Github Actionsやその他のCIサービスと連携してCI/CDを構築すること が可能 • AWSサービスではCode Build, Code Deploy等と連携可能
  36. © 2021, Amazon Web Services, Inc. or its Affiliates. まとめ

    • AWS SAM を使ってプロジェクトの生成やローカル実行、デプロイが可能 • 他にもKotlessやServerless Frameworkもあります • SAMはKotlinで初期プロジェクトは作成できない為、Kotlinへの変換が必要 • テストはPureなユニットテストにする。外部依存はMockを使って対応 • テスト用のKotlinのツールやライブラリを活用する • CI/CDはSAMやGradleのコマンドを組み合わせて構築する • 今回の資料・コードは公開しますので、Twitter等で情報をご確認ください