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

Pythonistaに贈るAWS Lambda入門 / AWS Lambda Essentia...

Keisuke69
April 15, 2020

Pythonistaに贈るAWS Lambda入門 / AWS Lambda Essentials for Pythonista

2020年4月15日に開催された「みんなのPython勉強会#56」で講演した際の資料です。

Keisuke69

April 15, 2020
Tweet

More Decks by Keisuke69

Other Decks in Technology

Transcript

  1. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Web Services Japan K.K. Keisuke Nishitani (@Keisuke69) 2020.04.15 Pythonistaに贈るAWS Lambda⼊⾨
  2. © 2020, Amazon Web Services, Inc. or its Affiliates. Keisuke

    Nishitani Manager, Senior Solutions Architect Amazon Web Service Japan K.K Everything will be serverless. ⾳楽 x キャンプ x マンガ フジロッカー Twitter: @Keisuke69 ブログ他: https://note.com/keisuke69 https://www.keisuke69.net/
  3. © 2020, Amazon Web Services, Inc. or its Affiliates. ©

    2019, Amazon Web Services, Inc. or its Affiliates. 使っていた 8% 使っている 24% 知ってるだけ 37% 知らない 31% AWS Lambdaについて知っていますか 使っていた 使っている 知ってるだけ 知らない
  4. © 2020, Amazon Web Services, Inc. or its Affiliates. ©

    2019, Amazon Web Services, Inc. or its Affiliates. 使っていた 8% 使っている 24% 知ってるだけ 37% 知らない 31% AWS Lambdaについて知っていますか 使っていた 使っている 知ってるだけ 知らない 136名!!!
  5. © 2020, Amazon Web Services, Inc. or its Affiliates. ©

    2019, Amazon Web Services, Inc. or its Affiliates.
  6. © 2020, Amazon Web Services, Inc. or its Affiliates. ©

    2019, Amazon Web Services, Inc. or its Affiliates.
  7. © 2020, Amazon Web Services, Inc. or its Affiliates. ©

    2019, Amazon Web Services, Inc. or its Affiliates. 本日の目標 AWS Lambdaを知らない136名に知ってもらう
  8. © 2020, Amazon Web Services, Inc. or its Affiliates. サーバーレスなコード実⾏

    イベントドリブン あらゆるランタイム 関数 AWS Lambda
  9. © 2020, Amazon Web Services, Inc. or its Affiliates. サーバーレスなコード実⾏

    イベントドリブン あらゆるランタイム 関数 AWS Lambda
  10. © 2020, Amazon Web Services, Inc. or its Affiliates. サーバーレスとは

    インフラのプロビジョニング不要 管理不要 ⾃動でスケール 価値に対する⽀払い ⾼可⽤かつ安全
  11. © 2020, Amazon Web Services, Inc. or its Affiliates. ⼀般的な3-tier

    Webアプリ プレゼンテーション層 ロジック層 データストア層 Webサーバ/アプリサーバ ブラウザ/モバイル データベース
  12. © 2020, Amazon Web Services, Inc. or its Affiliates. ⼀般的な3-tier

    Webアプリ AP (Amazon EC2) DB (Amazon RDS) LB (ELB) Web (Amaon EC2) Static Contents (Amazon S3) ブラウザ/モバイル CDN (Amazon CloudFront)
  13. © 2020, Amazon Web Services, Inc. or its Affiliates. ⼀般的な3-tier

    Webアプリ AP (Amazon EC2) DB (Amazon RDS) LB (ELB) Web (Amaon EC2) Static Contents (Amazon S3) ブラウザ/モバイル CDN (Amazon CloudFront) サーバ
  14. © 2020, Amazon Web Services, Inc. or its Affiliates. ⼀般的な3-tier

    Webアプリ AP (Amazon EC2) DB (Amazon RDS) LB (ELB) Web (Amaon EC2) Static Contents (Amazon S3) ブラウザ/モバイル CDN (Amazon CloudFront) サーバ サーバ
  15. © 2020, Amazon Web Services, Inc. or its Affiliates. ⼀般的な3-tier

    Webアプリ AP (Amazon EC2) DB (Amazon RDS) LB (ELB) Web (Amaon EC2) Static Contents (Amazon S3) ブラウザ/モバイル CDN (Amazon CloudFront) サーバ サーバ サーバ
  16. © 2020, Amazon Web Services, Inc. or its Affiliates. ⼀般的な3-tier

    Webアプリ AP (Amazon EC2) DB (Amazon RDS) LB (ELB) Web (Amaon EC2) Static Contents (Amazon S3) ブラウザ/モバイル CDN (Amazon CloudFront) サーバ サーバ サーバ サーバ
  17. © 2020, Amazon Web Services, Inc. or its Affiliates. サーバレススタックによる置き換え

    ブラウザ/モバイル Amazon API Gateway AWS Lambda Amazon DynamoDB etc Amazon S3 Amazon CloudFront
  18. © 2020, Amazon Web Services, Inc. or its Affiliates. サーバレススタックによる置き換え

    ブラウザ/モバイル Amazon API Gateway AWS Lambda Amazon DynamoDB etc Amazon S3 Amazon CloudFront AWSによる管理 (フルマネージド)
  19. © 2020, Amazon Web Services, Inc. or its Affiliates. サーバーレスなコード実⾏

    イベントドリブン あらゆるランタイム 関数 AWS Lambda
  20. © 2020, Amazon Web Services, Inc. or its Affiliates. Not

    Event-driven APIコール 処理追加
  21. © 2020, Amazon Web Services, Inc. or its Affiliates. サーバーレスなアプリケーションモデル

    イベントソース 関数 サービスなど Node.js Java Python Go C# Ruby イベント S3にオブジェクトが作られる Kinesisにストリームデータが保存される HTTPSによるリクエスト etc... API Gateway S3 Amazon Kinesis Data Streams SQS S3 DynamoDB
  22. © 2020, Amazon Web Services, Inc. or its Affiliates. ©

    2019, Amazon Web Services, Inc. or its Affiliates. 基本的になんでもできる
  23. © 2020, Amazon Web Services, Inc. or its Affiliates. ©

    2019, Amazon Web Services, Inc. or its Affiliates. 基本的になんでもできる (プラットフォームとしての仕様・制約はある)
  24. © 2020, Amazon Web Services, Inc. or its Affiliates. ©

    2019, Amazon Web Services, Inc. or its Affiliates. やらなければいけないことが減る
  25. © 2020, Amazon Web Services, Inc. or its Affiliates. ©

    2019, Amazon Web Services, Inc. or its Affiliates. やらなくてもいいことが増える
  26. © 2020, Amazon Web Services, Inc. or its Affiliates. オペレーションの責任範囲

    AWS Lambda Serverless functions AWS Fargate Serverless containers ECS/EKS Container-management as a service EC2 Infrastructure-as-a-Service More opinionated Less opinionated AWSの管理範囲 お客様の管理範囲 • データソースとのインテグレーション • 物理ハードウェア、ソフトウェア、ネット ワークとファシリティ • プロビジョニング • アプリケーションコード • コンテナオーケストレーションとプロビ ジョニング • クラスタのスケーリング • 物理ハードウェア、ホストOS/カーネ ル、ネットワーキングとファシリティ • アプリケーションコード • データソースとのインテグレーション • セキュリティの構成とアップデート、ネットワー ク構成、タスク管理 • コンテナオーケストレーションのコン トロールプレーン • 物理ハードウェア、ソフトウェア、 ネットワーキングとファシリティ • アプリケーションコード • データソースとのインテグレーション • Workerクラスタ • セキュリティの構成とアップデート、ネット ワーク構成、ファイアウォール、タスク管理 • 物理ハードウェア、ソフトウェ ア、ネットワーキングとファシ リティ • アプリケーションコード • データソースとのインテグレーション • スケーリング • セキュリティの構成とアップデート、ネット ワーク構成、ファイアウォール、タスク管理 • プロビジョニング、スケーリング管理とサー バ管理
  27. © 2020, Amazon Web Services, Inc. or its Affiliates. Lambda関数

    - 基本設定 メモリ • 64MBごとに128MBから3008MBの間で設定可能 • 容量に応じてCPU能⼒なども⽐例 • メモリ容量が⼀定を超えると使⽤するコア数も増えるため、マルチコアを活⽤ するようなコードを実装することでより効率的な処理が可能 タイムアウト • Lambda関数の実⾏時間に関するタイムアウト • 最⼤900秒(15分)まで 実⾏ロール • 必要なAWSリソースへのアクセスを許可するIAMロール • 指定されたIAMロールにそってLambda関数からAWSのリソースへのアクセス が許可される
  28. © 2020, Amazon Web Services, Inc. or its Affiliates. Lambda関数の制限

    インバウンドネットワーク接続はブロックされる アウトバウンドはTCP/IPとUDP/IPソケットのみ ptraceシステムコールはブロックされる TCP 25番ポートのトラフィックはブロックされる
  29. © 2020, Amazon Web Services, Inc. or its Affiliates. Lambda関数(ファンクション)

    AWS Lambdaで実⾏するアプリケーション • サポートされている⾔語、もしくはカスタムランタイムで⽤意した⾔語で記述 それぞれが隔離されたコンテナ内で実⾏される • 1コンテナで複数イベントを同時に処理することはない 利⽤する⾔語の関数/メソッドをハンドラーとして指定し、実⾏の際に呼び出す • ハンドラー内では呼び出しの際にパラメータとして渡されるイベントのデータ (JSON形式)にアクセスすることが可能 コードは依存関係も含めてビルド、パッケージングしたうえでアップロード • ZIP形式 • アップロードしたものはAmazon S3に保存され、実⾏時以外は暗号化される • ユーザがS3にアップロードしてARNで指定することも可能
  30. © 2020, Amazon Web Services, Inc. or its Affiliates. サポートされている⾔語(2020年4⽉15⽇時点)

    Python 2.7, 3.6, 3.7, 3.8 Node.js 10, 12 .NET Core 2,1(C#/PowerShell 6.0) Go 1.x Java 8, 11 Ruby 2.5, 2.7 サポートされていない言語はカス タムランタイムを実装することで 利用可能
  31. © 2020, Amazon Web Services, Inc. or its Affiliates. サポートされるイベントソース(⼀部)

    イベントソース 呼び出しタイプ 備考 Amazon S3 ⾮同期 Amazon DynamoDB 同期 ポーリングベース(ストリームベース) Amazon Kinesis Data Streams 同期 ポーリングベース(ストリームベース) Amazon Simple Notification Service ⾮同期 Amazon Simple Email Service ⾮同期 Amazon Simple Queue Service 同期 ポーリングベース(ストリームベースではない) Amazon Cognito 同期 AWS CloudFormation 同期 Amazon CloudWatch Logs 同期 Amazon CloudWatch イベント ⾮同期 AWS CodeCommit ⾮同期 Schedlued Event(Amazon CloudWatch Events を使用) ⾮同期 AWS Config ⾮同期 Amazon Alexa 同期 Amazon Lex 同期 Amazon API Gateway 同期 AWS IoT ボタン ⾮同期 Amazon CloudFront 同期 Amazon Kinesis Data Firehose 同期
  32. © 2020, Amazon Web Services, Inc. or its Affiliates. 制限事項(制限緩和可能)

    リージョンごとに適⽤され、制限緩和申請が可能 • リクエストはサポートセンターコンソールから リソース デフォルトの制限 同時実行数 1000 関数とレイヤーストレージ 75GB
  33. © 2020, Amazon Web Services, Inc. or its Affiliates. 制限事項(制限緩和不可)

    リソース 制限 関数のメモリ割り当て 128 MBから3008 MBまで、64 MBごとに増加でき ます。 関数タイムアウト 900 seconds (15 分) 関数の環境変数 4 KB 関数リソースベースのポリシー 20 KB 関数レイヤー 5 layers 呼び出しペイロード (リクエストとレスポンス) 6 MB (同期) 256 KB (非同期) デプロイパッケージサイズ 50 MB (zip 圧縮済み、直接アップロード) 250 MB (解凍、例: レイヤー) 3 MB (コンソールエディタ) テストイベント (コンソールエディタ) 10 /tmp ディレクトリのストレージ 512 MB ファイルの説明 1024 実行プロセス/スレッド 1024
  34. © 2020, Amazon Web Services, Inc. or its Affiliates. 料⾦体系

    リクエスト (全リージョン) • ⽉間100万リクエストまでは無料 • 超過分は$0.20/100万リクエスト (1リクエストあたり$0.0000002) 実⾏時間 (全リージョン) • 100ms単位で課⾦となり、100ms以下は繰り上げで計算 • メモリー容量により単価および無料時間が異なる 例) メモリ128MBの場合おおよそ$ 0.000000208/100ms • あくまでも単価としては1GBの関数を1秒間実⾏する場合の価格 ($0.00001667) かなり複雑なのでこちらも参考に • http://qiita.com/Keisuke69/items/e3f79b50b6039175401b
  35. © 2020, Amazon Web Services, Inc. or its Affiliates. プログラミングモデルの基本

    ハンドラー • 利⽤する⾔語の関数もしくはメソッドを指定し、実⾏の際に呼び出すエント リポイントとなる • ハンドラーを呼び出すことでLambda関数のコードが実⾏開始される • 呼び出しの際にパラメータとして渡されるイベントのデータ(JSON形式) にアクセスすることが可能 コンテキスト • ランタイムに関する情報が含まれ、ハンドラー内部からアクセス可 • コンテキストオブジェクトが 2 つめのパラメータとしてハンドラー関数に渡 される • コールバックを使⽤する⾔語の場合、コールバックメソッドの振る舞いを設 定可能 • デフォルト(true)は全ての⾮同期処理の完了を待ってレスポンス • false にするとcallback が呼び出された時点で即座に処理終了
  36. © 2020, Amazon Web Services, Inc. or its Affiliates. プログラミングモデルの基本

    ロギング • Lambda関数内にログ出⼒のステートメントを含めることができる • これらのログはAWS CloudWatch Logsに書き込まれる • 各⾔語ごとに特定のステートメントによるログエントリ作成が可能 • CloudWatch Logs の制限を受けるため、スロットリングによって失わ れることがあることに注意 • 場合によっては、実⾏コンテキスト終了時に失われることがある 例外 • Lambda 関数として使⽤する⾔語によって正常終了⽅法は異なる • 同様に実⾏中に発⽣したエラー(例外)を通知する⽅法も異なる • Lambda関数を同期的に呼び出している場合、クライアントへとエラー がレスポンスされる
  37. © 2020, Amazon Web Services, Inc. or its Affiliates. プログラミングモデルの基本

    Lambda 関数は、ステートレスにする必要がある コンピューティングインフラストラクチャとの直接的な関連性はない • 関数はリクエストのたびに同じコンピューティングインスタンスで実⾏ されるとは限らない ローカルファイルシステムへのアクセス、⼦プロセス、その他類似の⽣成物はリ クエストの有効期限に限定される 永続化するには Amazon S3、Amazon DynamoDB、または別のクラウドスト レージサービスなどへの保存が必要
  38. © 2020, Amazon Web Services, Inc. or its Affiliates. Lambda関数の実装

    利⽤可能な⾔語で普通に実装する ⾔語ごとの⽅⾔はあるが基本的な構成や実装パターンに⼤きな違いはない • ハンドラ • コンテキスト • ロギング • 例外処理 • トレース
  39. © 2020, Amazon Web Services, Inc. or its Affiliates. コンソールエディタ

    AWS Cloud9をベースにしたコンソールエディタが利⽤可能 • コンパイルが不要な⾔語のみ利⽤可能 マネージメントコンソール上でLambda 関数のコーディング、テスト、実⾏結果の表⽰が可能
  40. © 2020, Amazon Web Services, Inc. or its Affiliates. デプロイパッケージ

    コードと依存関係で構成される .zip または .jar ファイル • フォルダを含めないフラットなzipファイルであること • 依存関係の含め⽅は⾔語による 例) Node.jsの場合、依存ライブラリはnode_modulesフォルダ内にインストールした上でこの フォルダも含めてzip化する • ⾔語ごとの詳細 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/deployment-package-v2.html Lambda関数の実装コードとしてアップロード コードファイルおよびデプロイパッケージを構成するすべての依存ライブラリに対してグローバルな読み 取り権限が必要 • ないと実⾏がエラーになる $ zipinfo test.zip Archive: test.zip Zip file size: 473 bytes, number of entries: 2 -r--r--r-- 3.0 unx 0 bx stor 17-Aug-10 09:37 exlib.py -r--r--r-- 3.0 unx 234 tx defN 17-Aug-10 09:37 index.py 2 files, 234 bytes uncompressed, 163 bytes compressed: 30.3%
  41. © 2020, Amazon Web Services, Inc. or its Affiliates. Lambda

    Layers 様々なLambda関数で共通利⽤するコンポーネントを個別に 持つのではなく、Lambda Layerとして定義し参照すること ができるように 責務を分けることができるようになるため、プログラマは よりビジネスロジックに集中できるように Layerをシェアするエコシステム
  42. © 2020, Amazon Web Services, Inc. or its Affiliates. Lambda

    Layersの利⽤ 共通コンポーネントをZIPファイルにして Lambda Layerとしてアップロード Layersはimmutableであり、アップデート 管理のためにバージョニングする場合も バージョンが削除されたり、利⽤権限が剥 奪された場合、それを利⽤していた関数は 稼働し続けるが新規作成は不可 5つのLayersまで利⽤可能で、カスタムラン タイムをLayerとすることも可能 Lambda Layers arn:aws:lambda:region:accountId:layer:shared-lib Lambda Layers arn:aws:lambda:region:accountId:layer:shared-lib:2 Lambda Layers arn:aws:lambda:region:accountId:layer:shared-lib:3
  43. © 2020, Amazon Web Services, Inc. or its Affiliates. Lambdaファンクション

    def handler_name(event, context): ... return some_value 基本形 def my_handler(event, context): message = 'Hello {}{}!'.format(event['first_name'],event['last_name’]) return { 'message' : message } 例
  44. © 2020, Amazon Web Services, Inc. or its Affiliates. ロギング

    import json import os def lambda_handler(event, context): print('## ENVIRONMENT VARIABLES’) print(os.environ) print('## EVENT’) print(event)
  45. © 2020, Amazon Web Services, Inc. or its Affiliates. ロギング

    START RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 Version: $LATEST ## ENVIRONMENT VARIABLES environ({'AWS_LAMBDA_LOG_GROUP_NAME': '/aws/lambda/my-function', 'AWS_LAMBDA_LOG_STREAM_NAME': '2020/01/31/[$LATEST]3893xmpl7fac4485b47bb75b671a283c', 'AWS_LAMBDA_FUNCTION_NAME': 'my-function', ...}) ## EVENT {'key': 'value'} END RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 REPORT RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 Duration: 15.74 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 56 MB Init Duration: 130.49 ms XRAY TraceId: 1-5e34a614-10bdxmplf1fb44f07bc535a1 SegmentId: 07f5xmpl2d1f6f85 Sampled: true
  46. © 2020, Amazon Web Services, Inc. or its Affiliates. ロギング

    import json import os import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): logger.info('## ENVIRONMENT VARIABLES') logger.info(os.environ) logger.info('## EVENT') logger.info(event)
  47. © 2020, Amazon Web Services, Inc. or its Affiliates. ロギング

    START RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 Version: $LATEST [INFO] 2020-01-31T22:12:58.534Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 ## ENVIRONMENT VARIABLES [INFO] 2020-01-31T22:12:58.534Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 environ({'AWS_LAMBDA_LOG_GROUP_NAME': '/aws/lambda/my-function', 'AWS_LAMBDA_LOG_STREAM_NAME': '2020/01/31/[$LATEST]1bbe51xmplb34a2788dbaa7433b0aa4d', 'AWS_LAMBDA_FUNCTION_NAME': 'my-function', ...}) [INFO] 2020-01-31T22:12:58.535Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 ## EVENT [INFO] 2020-01-31T22:12:58.535Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 {'key': 'value'} END RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 REPORT RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 Duration: 2.75 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 56 MB Init Duration: 113.51 ms XRAY TraceId: 1-5e34a66a-474xmpl7c2534a87870b4370 SegmentId: 073cxmpl3e442861 Sampled: true
  48. © 2020, Amazon Web Services, Inc. or its Affiliates. エラーハンドリング

    def lambda_handler(event, context): return x + 10 { "errorMessage": "name 'x' is not defined", "errorType": "NameError", "stackTrace": [ " File ¥"/var/task/error_function.py¥", line 2, in lambda_handler¥n return x + 10¥n" ] } エラーが発生するコード エラー出力
  49. © 2020, Amazon Web Services, Inc. or its Affiliates. 効率的な関数コード

    コードの最適化 • 各⾔語のベストプラクティス、最適化⼿法はそのまま当てはまる Fatでモノリシックな関数にならないようにする • 1つの関数はなるべく単機能にする • 関数内でのオーケストレーションは禁物 デプロイパッケージの依存関係をコントロールする ハンドラとコアロジックは分離させる • コアロジック(=ビジネスロジック)の単体テストがしやすくなる
  50. © 2020, Amazon Web Services, Inc. or its Affiliates. ハンドラとコアロジックの分離

    app =Todo() def lambda_handler(event, context): ret =app.dispatch(event) return { 'statusCode': ret["status_code"], 'headers': ret["headers"], 'body': json.dumps(ret["body"]) }
  51. © 2020, Amazon Web Services, Inc. or its Affiliates. コンテナ再利⽤を有効活⽤する

    グローバルスコープを賢く活⽤する AWS SDKのクライアントやDBクライアントの初期 化はハンドラの外側で⾏う • グローバルスコープはコールドスタートで しか実⾏されない • コンテナが維持されている間は利⽤可能 import sys import logging import rds_config import pymysql rds_host = "rds-instance" db_name = rds_config.db_name try: conn = pymysql.connect(…) except: logger.error("ERROR:…") def handler(event, context): with conn.cursor() as cur: 毎回実行される コールドスタート時 のみ実行される
  52. © 2020, Amazon Web Services, Inc. or its Affiliates. 必要なもののみ読み込むようにする

    無駄に不要なデータを読み込まない • Amazon S3 selectの利⽤など # Download and process all keys for key in src_keys: response = s3_client.get_object(…) contents = response['Body'].read() for line in contents.split('¥n')[:-1]: line_count +=1 try: data = line.split(',') srcIp = data[0][:8] … # Select IP Address and Keys for key in src_keys: response = s3_client.select_object_content( expression=“SELECT SUBSTR(obj._1, 1, 8), obj._2 FROM s3object as obj”) contents = response['Body'].read() for line in contents: line_count +=1 try: … After (95s, $0.028) Before (200s, $0.112)
  53. © 2020, Amazon Web Services, Inc. or its Affiliates. コード内ではオーケストレーションしない

    Fatでモノリシックな関数は作らないと いう原則 ステート管理、エラーハンドリングな ど複雑になる上にバグの温床になりや すい ワーカーの実⾏処理をオーケストレー タが待つためタイムアウトを起こしや すい AWS Step Functionsを利⽤する
  54. © 2020, Amazon Web Services, Inc. or its Affiliates. レジリエンシの向上

    エラーハンドリング • 外部接続に対するタイムアウトを適切にコントロールする • リトライ処理を実装する(Exponential Backoff with Jitter) AWS Lambdaのリトライポリシーを理解すること • 同期はリトライなし • ⾮同期は2回リトライされる • ストリームは期限が切れるまでリトライが繰り返される Dead Letter Queueを活⽤すること • 関数ごとに設定する
  55. © 2020, Amazon Web Services, Inc. or its Affiliates. 複雑な依存関係を避ける

    依存関係の複雑さを最⼩限に抑える フレームワークを単純化して、実⾏コンテキスト起動時のロードの⾼速化を優先 する • Spring Framework などの複雑なフレームワークではなく、Dagger や Guice などの単純なIoCフレームワークを使⽤する
  56. © 2020, Amazon Web Services, Inc. or its Affiliates. 組み込まれたSDKは使⽤しない

    AWS Lambdaの実⾏環境にはランタイムによってAWS SDKなどが組み込み済み となっていて、関数コードから利⽤可能 これらはAWS Lambdaのサービス側で定期的に更新される • 最新の機能やセキュリティパッチの適⽤のため • この更新に伴って、Lambda関数の動作が微妙に変わる場合がある 関数で使⽤する依存関係はすべて完全にユーザで制御するほうが望ましく、すべ ての依存関係はデプロイパッケージとしてパッケージすることを推奨
  57. © 2020, Amazon Web Services, Inc. or its Affiliates. ⾮同期実⾏を活⽤する

    同期でInvokeすると同時実⾏数の制限に引っかかってつまりがち • ⾮同期呼び出しの場合、許可された同時実⾏数内で順次処理をし、バー ストも許容されている • 同期呼び出しの場合、許可された同時実⾏数を超えた時点でエラーが返 されてしまう • ⾮同期の場合はリトライされる できるだけ⾮同期でInvokeするのがスケーラビリティの観点ではオススメ • その処理、本当にレスポンス必要ですか︖ ⾮同期実⾏を⾏う場合、DLQの設定も忘れずに
  58. © 2020, Amazon Web Services, Inc. or its Affiliates. 冪等性を確保する

    冪等性はお客様のコードで確保する必要がある AWS Lambdaで保証しているのは最低1回実⾏することであり1回しか実⾏しな いことではない • 同⼀イベントで同⼀Lambdaファンクションが2回起動されることがまれ に発⽣する • Amazon DynamoDBを利⽤するなどして冪等性を担保する実装を⾏うこ と 実装例: • イベントIDをAmazon DynamoDBに保管し、処理実⾏前にチェックする • 処理前後でバケットをわけ、処理後に消す
  59. © 2020, Amazon Web Services, Inc. or its Affiliates. Think

    Parallel AWS Lambdaの最⼤限活かすにはいかに並列処理で同時実⾏を⾏うか 1つあたりのイベントを⼩さくして同時に並列で動かせるようなアーキテクチャ にする • 1回のInvokeでループさせるのではなく、ループ回数分Lambdaファンク ションを⾮同期Invokeする • ⻑時間実⾏のLambdaファンクションが減るので、同時実⾏数の制限にも 引っかかりにくくなる
  60. © 2020, Amazon Web Services, Inc. or its Affiliates. ハードコーディングしない

    コードと設定/データを分離する • 関数へのパラメータは環境変数を利⽤する • 書き込み先のS3バケットの名前など • ステージ(Prod, Dev, Testなど)ごとの切り替えなども容易になる 特に認証情報のハードコーティングは多⼤なセキュリティリスクをはらむ • AWSのAPIアクセスキー • サードパーティAPIのキー • など… AWS Systems Manager Parameter StoreやAWS Secrets Managerの利⽤も検討す る
  61. © 2020, Amazon Web Services, Inc. or its Affiliates. Lambdaおよびサーバーレスですべてやろうとしない

    Lambdaの実⾏モデルが向かないケースがあるのも事実 • ステートフルなアプリケーション • ロングバッチ • CPU/メモリのスペック • おとなしくコンテナとか使いましょう • フルサーバーレスにすることが⽬的ではありません • Lambdaとコンテナ/EC2が混在していてもいいのです • 特にAPI Gatewayはメソッド単位でバックエンドを選べる コストへの過剰な期待はやめる • コスト効率は⾮常に⾼いが、絶対的に激安というわけではない
  62. © 2020, Amazon Web Services, Inc. or its Affiliates. いかに速く、

    価値のある、 システムを作るか ⽬指すべきこと