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

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

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⼊⾨

    View full-size slide

  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/

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. © 2020, Amazon Web Services, Inc. or its Affiliates.
    © 2019, Amazon Web Services, Inc. or its Affiliates.
    本日の目標
    AWS Lambdaを知らない136名に知ってもらう

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. © 2020, Amazon Web Services, Inc. or its Affiliates.
    サーバーレスとは
    インフラのプロビジョニング不要
    管理不要
    ⾃動でスケール
    価値に対する⽀払い ⾼可⽤かつ安全

    View full-size slide

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

    View full-size slide

  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)

    View full-size slide

  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)
    サーバ

    View full-size slide

  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)
    サーバ
    サーバ

    View full-size slide

  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)
    サーバ
    サーバ
    サーバ

    View full-size slide

  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)
    サーバ
    サーバ
    サーバ
    サーバ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  19. © 2020, Amazon Web Services, Inc. or its Affiliates.
    Serverless = No servers to manage and scale

    View full-size slide

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

    View full-size slide

  21. © 2020, Amazon Web Services, Inc. or its Affiliates.
    Not Event-driven
    APIコール
    処理追加

    View full-size slide

  22. © 2020, Amazon Web Services, Inc. or its Affiliates.
    Event-driven
    サブスクライブ

    View full-size slide

  23. © 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  27. © 2020, Amazon Web Services, Inc. or its Affiliates.
    © 2019, Amazon Web Services, Inc. or its Affiliates.
    やらなくてもいいことが増える

    View full-size slide

  28. © 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クラスタ
    • セキュリティの構成とアップデート、ネット
    ワーク構成、ファイアウォール、タスク管理
    • 物理ハードウェア、ソフトウェ
    ア、ネットワーキングとファシ
    リティ
    • アプリケーションコード
    • データソースとのインテグレーション
    • スケーリング
    • セキュリティの構成とアップデート、ネット
    ワーク構成、ファイアウォール、タスク管理
    • プロビジョニング、スケーリング管理とサー
    バ管理

    View full-size slide

  29. © 2020, Amazon Web Services, Inc. or its Affiliates.
    AWS Lambdaの基本

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  33. © 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
    サポートされていない言語はカス
    タムランタイムを実装することで
    利用可能

    View full-size slide

  34. © 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 同期

    View full-size slide

  35. © 2020, Amazon Web Services, Inc. or its Affiliates.
    制限事項

    View full-size slide

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

    View full-size slide

  37. © 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

    View full-size slide

  38. © 2020, Amazon Web Services, Inc. or its Affiliates.
    料⾦

    View full-size slide

  39. © 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

    View full-size slide

  40. © 2020, Amazon Web Services, Inc. or its Affiliates.
    プログラミングモデル

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  46. © 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%

    View full-size slide

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

    View full-size slide

  48. © 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

    View full-size slide

  49. © 2020, Amazon Web Services, Inc. or its Affiliates.
    関数コード

    View full-size slide

  50. © 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 }

    View full-size slide

  51. © 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)

    View full-size slide

  52. © 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

    View full-size slide

  53. © 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)

    View full-size slide

  54. © 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

    View full-size slide

  55. © 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"
    ]
    }
    エラーが発生するコード
    エラー出力

    View full-size slide

  56. © 2020, Amazon Web Services, Inc. or its Affiliates.
    Lambda関数実装のTips

    View full-size slide

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

    View full-size slide

  58. © 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"])
    }

    View full-size slide

  59. © 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:
    毎回実行される
    コールドスタート時
    のみ実行される

    View full-size slide

  60. © 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)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  66. © 2020, Amazon Web Services, Inc. or its Affiliates.
    冪等性を確保する
    冪等性はお客様のコードで確保する必要がある
    AWS Lambdaで保証しているのは最低1回実⾏することであり1回しか実⾏しな
    いことではない
    • 同⼀イベントで同⼀Lambdaファンクションが2回起動されることがまれ
    に発⽣する
    • Amazon DynamoDBを利⽤するなどして冪等性を担保する実装を⾏うこ

    実装例:
    • イベントIDをAmazon DynamoDBに保管し、処理実⾏前にチェックする
    • 処理前後でバケットをわけ、処理後に消す

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  70. © 2020, Amazon Web Services, Inc. or its Affiliates.
    ⽬指すべきこと

    View full-size slide

  71. © 2020, Amazon Web Services, Inc. or its Affiliates.
    いかに速く、
    価値のある、
    システムを作るか
    ⽬指すべきこと

    View full-size slide

  72. 「差別化に繋がらない重労働」

    「自分でやらない」

    View full-size slide

  73. 「差別化に繋がらない重労働」

    「自分でやらない」

    View full-size slide

  74. https://go.aws/3cnDB9B

    View full-size slide

  75. © 2019, Amazon Web Services, Inc. or its Affiliates.
    Thank you!
    @Keisuke69

    View full-size slide