Pythonistaに贈るAWS Lambda入門 / AWS Lambda Essentials for Pythonista
by
Keisuke69
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Amazon Web Services Japan K.K. Keisuke Nishitani (@Keisuke69) 2020.04.15 Pythonistaに贈るAWS Lambda⼊⾨
Slide 2
Slide 2 text
© 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/
Slide 3
Slide 3 text
© 2020, Amazon Web Services, Inc. or its Affiliates. © 2019, Amazon Web Services, Inc. or its Affiliates. 使っていた 8% 使っている 24% 知ってるだけ 37% 知らない 31% AWS Lambdaについて知っていますか 使っていた 使っている 知ってるだけ 知らない
Slide 4
Slide 4 text
© 2020, Amazon Web Services, Inc. or its Affiliates. © 2019, Amazon Web Services, Inc. or its Affiliates. 使っていた 8% 使っている 24% 知ってるだけ 37% 知らない 31% AWS Lambdaについて知っていますか 使っていた 使っている 知ってるだけ 知らない 136名!!!
Slide 5
Slide 5 text
© 2020, Amazon Web Services, Inc. or its Affiliates. © 2019, Amazon Web Services, Inc. or its Affiliates.
Slide 6
Slide 6 text
© 2020, Amazon Web Services, Inc. or its Affiliates. © 2019, Amazon Web Services, Inc. or its Affiliates.
Slide 7
Slide 7 text
© 2020, Amazon Web Services, Inc. or its Affiliates. © 2019, Amazon Web Services, Inc. or its Affiliates. 本日の目標 AWS Lambdaを知らない136名に知ってもらう
Slide 8
Slide 8 text
© 2020, Amazon Web Services, Inc. or its Affiliates. サーバーレスなコード実⾏ イベントドリブン あらゆるランタイム 関数 AWS Lambda
Slide 9
Slide 9 text
© 2020, Amazon Web Services, Inc. or its Affiliates. サーバーレスなコード実⾏ イベントドリブン あらゆるランタイム 関数 AWS Lambda
Slide 10
Slide 10 text
© 2020, Amazon Web Services, Inc. or its Affiliates. サーバーレスとは インフラのプロビジョニング不要 管理不要 ⾃動でスケール 価値に対する⽀払い ⾼可⽤かつ安全
Slide 11
Slide 11 text
© 2020, Amazon Web Services, Inc. or its Affiliates. ⼀般的な3-tier Webアプリ プレゼンテーション層 ロジック層 データストア層 Webサーバ/アプリサーバ ブラウザ/モバイル データベース
Slide 12
Slide 12 text
© 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)
Slide 13
Slide 13 text
© 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) サーバ
Slide 14
Slide 14 text
© 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) サーバ サーバ
Slide 15
Slide 15 text
© 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) サーバ サーバ サーバ
Slide 16
Slide 16 text
© 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) サーバ サーバ サーバ サーバ
Slide 17
Slide 17 text
© 2020, Amazon Web Services, Inc. or its Affiliates. サーバレススタックによる置き換え ブラウザ/モバイル Amazon API Gateway AWS Lambda Amazon DynamoDB etc Amazon S3 Amazon CloudFront
Slide 18
Slide 18 text
© 2020, Amazon Web Services, Inc. or its Affiliates. サーバレススタックによる置き換え ブラウザ/モバイル Amazon API Gateway AWS Lambda Amazon DynamoDB etc Amazon S3 Amazon CloudFront AWSによる管理 (フルマネージド)
Slide 19
Slide 19 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Serverless = No servers to manage and scale
Slide 20
Slide 20 text
© 2020, Amazon Web Services, Inc. or its Affiliates. サーバーレスなコード実⾏ イベントドリブン あらゆるランタイム 関数 AWS Lambda
Slide 21
Slide 21 text
No content
Slide 22
Slide 22 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Not Event-driven APIコール 処理追加
Slide 23
Slide 23 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Event-driven サブスクライブ
Slide 24
Slide 24 text
© 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
Slide 25
Slide 25 text
© 2020, Amazon Web Services, Inc. or its Affiliates. © 2019, Amazon Web Services, Inc. or its Affiliates. 基本的になんでもできる
Slide 26
Slide 26 text
© 2020, Amazon Web Services, Inc. or its Affiliates. © 2019, Amazon Web Services, Inc. or its Affiliates. 基本的になんでもできる (プラットフォームとしての仕様・制約はある)
Slide 27
Slide 27 text
© 2020, Amazon Web Services, Inc. or its Affiliates. © 2019, Amazon Web Services, Inc. or its Affiliates. やらなければいけないことが減る
Slide 28
Slide 28 text
© 2020, Amazon Web Services, Inc. or its Affiliates. © 2019, Amazon Web Services, Inc. or its Affiliates. やらなくてもいいことが増える
Slide 29
Slide 29 text
© 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クラスタ • セキュリティの構成とアップデート、ネット ワーク構成、ファイアウォール、タスク管理 • 物理ハードウェア、ソフトウェ ア、ネットワーキングとファシ リティ • アプリケーションコード • データソースとのインテグレーション • スケーリング • セキュリティの構成とアップデート、ネット ワーク構成、ファイアウォール、タスク管理 • プロビジョニング、スケーリング管理とサー バ管理
Slide 30
Slide 30 text
© 2020, Amazon Web Services, Inc. or its Affiliates. AWS Lambdaの基本
Slide 31
Slide 31 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Lambda関数 - 基本設定 メモリ • 64MBごとに128MBから3008MBの間で設定可能 • 容量に応じてCPU能⼒なども⽐例 • メモリ容量が⼀定を超えると使⽤するコア数も増えるため、マルチコアを活⽤ するようなコードを実装することでより効率的な処理が可能 タイムアウト • Lambda関数の実⾏時間に関するタイムアウト • 最⼤900秒(15分)まで 実⾏ロール • 必要なAWSリソースへのアクセスを許可するIAMロール • 指定されたIAMロールにそってLambda関数からAWSのリソースへのアクセス が許可される
Slide 32
Slide 32 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Lambda関数の制限 インバウンドネットワーク接続はブロックされる アウトバウンドはTCP/IPとUDP/IPソケットのみ ptraceシステムコールはブロックされる TCP 25番ポートのトラフィックはブロックされる
Slide 33
Slide 33 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Lambda関数(ファンクション) AWS Lambdaで実⾏するアプリケーション • サポートされている⾔語、もしくはカスタムランタイムで⽤意した⾔語で記述 それぞれが隔離されたコンテナ内で実⾏される • 1コンテナで複数イベントを同時に処理することはない 利⽤する⾔語の関数/メソッドをハンドラーとして指定し、実⾏の際に呼び出す • ハンドラー内では呼び出しの際にパラメータとして渡されるイベントのデータ (JSON形式)にアクセスすることが可能 コードは依存関係も含めてビルド、パッケージングしたうえでアップロード • ZIP形式 • アップロードしたものはAmazon S3に保存され、実⾏時以外は暗号化される • ユーザがS3にアップロードしてARNで指定することも可能
Slide 34
Slide 34 text
© 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 サポートされていない言語はカス タムランタイムを実装することで 利用可能
Slide 35
Slide 35 text
© 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 同期
Slide 36
Slide 36 text
© 2020, Amazon Web Services, Inc. or its Affiliates. 制限事項
Slide 37
Slide 37 text
© 2020, Amazon Web Services, Inc. or its Affiliates. 制限事項(制限緩和可能) リージョンごとに適⽤され、制限緩和申請が可能 • リクエストはサポートセンターコンソールから リソース デフォルトの制限 同時実行数 1000 関数とレイヤーストレージ 75GB
Slide 38
Slide 38 text
© 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
Slide 39
Slide 39 text
© 2020, Amazon Web Services, Inc. or its Affiliates. 料⾦
Slide 40
Slide 40 text
© 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
Slide 41
Slide 41 text
© 2020, Amazon Web Services, Inc. or its Affiliates. プログラミングモデル
Slide 42
Slide 42 text
© 2020, Amazon Web Services, Inc. or its Affiliates. プログラミングモデルの基本 ハンドラー • 利⽤する⾔語の関数もしくはメソッドを指定し、実⾏の際に呼び出すエント リポイントとなる • ハンドラーを呼び出すことでLambda関数のコードが実⾏開始される • 呼び出しの際にパラメータとして渡されるイベントのデータ(JSON形式) にアクセスすることが可能 コンテキスト • ランタイムに関する情報が含まれ、ハンドラー内部からアクセス可 • コンテキストオブジェクトが 2 つめのパラメータとしてハンドラー関数に渡 される • コールバックを使⽤する⾔語の場合、コールバックメソッドの振る舞いを設 定可能 • デフォルト(true)は全ての⾮同期処理の完了を待ってレスポンス • false にするとcallback が呼び出された時点で即座に処理終了
Slide 43
Slide 43 text
© 2020, Amazon Web Services, Inc. or its Affiliates. プログラミングモデルの基本 ロギング • Lambda関数内にログ出⼒のステートメントを含めることができる • これらのログはAWS CloudWatch Logsに書き込まれる • 各⾔語ごとに特定のステートメントによるログエントリ作成が可能 • CloudWatch Logs の制限を受けるため、スロットリングによって失わ れることがあることに注意 • 場合によっては、実⾏コンテキスト終了時に失われることがある 例外 • Lambda 関数として使⽤する⾔語によって正常終了⽅法は異なる • 同様に実⾏中に発⽣したエラー(例外)を通知する⽅法も異なる • Lambda関数を同期的に呼び出している場合、クライアントへとエラー がレスポンスされる
Slide 44
Slide 44 text
© 2020, Amazon Web Services, Inc. or its Affiliates. プログラミングモデルの基本 Lambda 関数は、ステートレスにする必要がある コンピューティングインフラストラクチャとの直接的な関連性はない • 関数はリクエストのたびに同じコンピューティングインスタンスで実⾏ されるとは限らない ローカルファイルシステムへのアクセス、⼦プロセス、その他類似の⽣成物はリ クエストの有効期限に限定される 永続化するには Amazon S3、Amazon DynamoDB、または別のクラウドスト レージサービスなどへの保存が必要
Slide 45
Slide 45 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Lambda関数の実装 利⽤可能な⾔語で普通に実装する ⾔語ごとの⽅⾔はあるが基本的な構成や実装パターンに⼤きな違いはない • ハンドラ • コンテキスト • ロギング • 例外処理 • トレース
Slide 46
Slide 46 text
© 2020, Amazon Web Services, Inc. or its Affiliates. コンソールエディタ AWS Cloud9をベースにしたコンソールエディタが利⽤可能 • コンパイルが不要な⾔語のみ利⽤可能 マネージメントコンソール上でLambda 関数のコーディング、テスト、実⾏結果の表⽰が可能
Slide 47
Slide 47 text
© 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%
Slide 48
Slide 48 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Lambda Layers 様々なLambda関数で共通利⽤するコンポーネントを個別に 持つのではなく、Lambda Layerとして定義し参照すること ができるように 責務を分けることができるようになるため、プログラマは よりビジネスロジックに集中できるように Layerをシェアするエコシステム
Slide 49
Slide 49 text
© 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
Slide 50
Slide 50 text
© 2020, Amazon Web Services, Inc. or its Affiliates. 関数コード
Slide 51
Slide 51 text
© 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 } 例
Slide 52
Slide 52 text
© 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)
Slide 53
Slide 53 text
© 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
Slide 54
Slide 54 text
© 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)
Slide 55
Slide 55 text
© 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
Slide 56
Slide 56 text
© 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" ] } エラーが発生するコード エラー出力
Slide 57
Slide 57 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Lambda関数実装のTips
Slide 58
Slide 58 text
© 2020, Amazon Web Services, Inc. or its Affiliates. 効率的な関数コード コードの最適化 • 各⾔語のベストプラクティス、最適化⼿法はそのまま当てはまる Fatでモノリシックな関数にならないようにする • 1つの関数はなるべく単機能にする • 関数内でのオーケストレーションは禁物 デプロイパッケージの依存関係をコントロールする ハンドラとコアロジックは分離させる • コアロジック(=ビジネスロジック)の単体テストがしやすくなる
Slide 59
Slide 59 text
© 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"]) }
Slide 60
Slide 60 text
© 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: 毎回実行される コールドスタート時 のみ実行される
Slide 61
Slide 61 text
© 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)
Slide 62
Slide 62 text
© 2020, Amazon Web Services, Inc. or its Affiliates. コード内ではオーケストレーションしない Fatでモノリシックな関数は作らないと いう原則 ステート管理、エラーハンドリングな ど複雑になる上にバグの温床になりや すい ワーカーの実⾏処理をオーケストレー タが待つためタイムアウトを起こしや すい AWS Step Functionsを利⽤する
Slide 63
Slide 63 text
© 2020, Amazon Web Services, Inc. or its Affiliates. レジリエンシの向上 エラーハンドリング • 外部接続に対するタイムアウトを適切にコントロールする • リトライ処理を実装する(Exponential Backoff with Jitter) AWS Lambdaのリトライポリシーを理解すること • 同期はリトライなし • ⾮同期は2回リトライされる • ストリームは期限が切れるまでリトライが繰り返される Dead Letter Queueを活⽤すること • 関数ごとに設定する
Slide 64
Slide 64 text
© 2020, Amazon Web Services, Inc. or its Affiliates. 複雑な依存関係を避ける 依存関係の複雑さを最⼩限に抑える フレームワークを単純化して、実⾏コンテキスト起動時のロードの⾼速化を優先 する • Spring Framework などの複雑なフレームワークではなく、Dagger や Guice などの単純なIoCフレームワークを使⽤する
Slide 65
Slide 65 text
© 2020, Amazon Web Services, Inc. or its Affiliates. 組み込まれたSDKは使⽤しない AWS Lambdaの実⾏環境にはランタイムによってAWS SDKなどが組み込み済み となっていて、関数コードから利⽤可能 これらはAWS Lambdaのサービス側で定期的に更新される • 最新の機能やセキュリティパッチの適⽤のため • この更新に伴って、Lambda関数の動作が微妙に変わる場合がある 関数で使⽤する依存関係はすべて完全にユーザで制御するほうが望ましく、すべ ての依存関係はデプロイパッケージとしてパッケージすることを推奨
Slide 66
Slide 66 text
© 2020, Amazon Web Services, Inc. or its Affiliates. ⾮同期実⾏を活⽤する 同期でInvokeすると同時実⾏数の制限に引っかかってつまりがち • ⾮同期呼び出しの場合、許可された同時実⾏数内で順次処理をし、バー ストも許容されている • 同期呼び出しの場合、許可された同時実⾏数を超えた時点でエラーが返 されてしまう • ⾮同期の場合はリトライされる できるだけ⾮同期でInvokeするのがスケーラビリティの観点ではオススメ • その処理、本当にレスポンス必要ですか︖ ⾮同期実⾏を⾏う場合、DLQの設定も忘れずに
Slide 67
Slide 67 text
© 2020, Amazon Web Services, Inc. or its Affiliates. 冪等性を確保する 冪等性はお客様のコードで確保する必要がある AWS Lambdaで保証しているのは最低1回実⾏することであり1回しか実⾏しな いことではない • 同⼀イベントで同⼀Lambdaファンクションが2回起動されることがまれ に発⽣する • Amazon DynamoDBを利⽤するなどして冪等性を担保する実装を⾏うこ と 実装例: • イベントIDをAmazon DynamoDBに保管し、処理実⾏前にチェックする • 処理前後でバケットをわけ、処理後に消す
Slide 68
Slide 68 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Think Parallel AWS Lambdaの最⼤限活かすにはいかに並列処理で同時実⾏を⾏うか 1つあたりのイベントを⼩さくして同時に並列で動かせるようなアーキテクチャ にする • 1回のInvokeでループさせるのではなく、ループ回数分Lambdaファンク ションを⾮同期Invokeする • ⻑時間実⾏のLambdaファンクションが減るので、同時実⾏数の制限にも 引っかかりにくくなる
Slide 69
Slide 69 text
© 2020, Amazon Web Services, Inc. or its Affiliates. ハードコーディングしない コードと設定/データを分離する • 関数へのパラメータは環境変数を利⽤する • 書き込み先のS3バケットの名前など • ステージ(Prod, Dev, Testなど)ごとの切り替えなども容易になる 特に認証情報のハードコーティングは多⼤なセキュリティリスクをはらむ • AWSのAPIアクセスキー • サードパーティAPIのキー • など… AWS Systems Manager Parameter StoreやAWS Secrets Managerの利⽤も検討す る
Slide 70
Slide 70 text
© 2020, Amazon Web Services, Inc. or its Affiliates. Lambdaおよびサーバーレスですべてやろうとしない Lambdaの実⾏モデルが向かないケースがあるのも事実 • ステートフルなアプリケーション • ロングバッチ • CPU/メモリのスペック • おとなしくコンテナとか使いましょう • フルサーバーレスにすることが⽬的ではありません • Lambdaとコンテナ/EC2が混在していてもいいのです • 特にAPI Gatewayはメソッド単位でバックエンドを選べる コストへの過剰な期待はやめる • コスト効率は⾮常に⾼いが、絶対的に激安というわけではない
Slide 71
Slide 71 text
© 2020, Amazon Web Services, Inc. or its Affiliates. ⽬指すべきこと
Slide 72
Slide 72 text
© 2020, Amazon Web Services, Inc. or its Affiliates. いかに速く、 価値のある、 システムを作るか ⽬指すべきこと
Slide 73
Slide 73 text
「差別化に繋がらない重労働」 を 「自分でやらない」
Slide 74
Slide 74 text
「差別化に繋がらない重労働」 を 「自分でやらない」
Slide 75
Slide 75 text
https://go.aws/3cnDB9B
Slide 76
Slide 76 text
© 2019, Amazon Web Services, Inc. or its Affiliates. Thank you! @Keisuke69