Slide 1

Slide 1 text

© 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. #serverlessjp AWS Lambda Update 2021 S e r v e r l e s s M e e t u p J a p a n V i r t u a l # 2 0 - A W S r e : C a p

Slide 2

Slide 2 text

#serverlessjp 当セッションの概要 • AWS re:Invent 2021 を含む、2021 年の AWS Lambda に関連する 主要アップデートを デモを交えてご紹介します。 • AWS Lambda の基本的な動作の解説は当セッションでは⾏いませんの で、AWS Black Belt Online Seminar をご視聴ください。 AWS Black Belt Online Seminar https://aws.amazon.com/jp/aws-jp-introduction/

Slide 3

Slide 3 text

#serverlessjp The Shared Responsibility Model for AWS Lambda https://aws.amazon.com/jp/compliance/shared-responsibility-model/ https://docs.aws.amazon.com/whitepapers/latest/security-overview-aws-lambda/the-shared- responsibility-model.html リージョン アベイラビリティ ゾーン EC2 ハードウェア ハードウェア ソフトウェア コン ピュート 実⾏環境 ⾔語 ネット ワーク 認証・認可 リソース設定 利⽤者の関数 コード・ライブラリ お客様 AWS AWS Lambda • お客様 コードの実装やアップロード、データの管理 (暗号化オプションを含む)、IAM での適切 な権限の適⽤について責任を持つ • AWS ハードウェアから、ソフトウェア(プラット フォーム)を管理・運⽤に責任を持つ

Slide 4

Slide 4 text

© 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. #serverlessjp 速く 低コスト

Slide 5

Slide 5 text

#serverlessjp AWS Graviton プロセッサ AWSが開発したクラウドに最適なCPUでArmベースのCPU AWSのカスタムCPU イノベーションを 加速、進化を継続 クラウドネイティブな ワークロードに最適化

Slide 6

Slide 6 text

#serverlessjp Graviton2 搭載の AWS Lambda 関数 x86ベースの Lambda と⽐較し 最⼤ 34% のコストパフォーマンス向上 最⼤ 34% のコスト パフォーマンス向上 20% コスト削減 vs 同サイズの Lambda 関数 ⾼パフォーマンス vs x86 対応リージョン US East (N. Virginia) US East (Ohio) US West (Oregon) Europe (Frankfurt) Europe (Ireland) EU (London) Asia Pacific (Mumbai) Asia Pacific (Singapore) Asia Pacific (Sydney) Asia Pacific (Tokyo)

Slide 7

Slide 7 text

#serverlessjp Graviton2 の利⽤⽅法 AWS CLI / AWS SAM / AWS CDK / AWS マネージメントコンソールで指定可能 ・x86_64(デフォルト) ・arm64 (Graviton2 )

Slide 8

Slide 8 text

#serverlessjp Graviton2 対応の Lambda ランタイム • Node.js 12, Node.js 14 • Python 3.8, Python 3.9 • Java 8 (AL2), Java 11 • .NET Core 3. • Ruby 2.7 • Custom Runtime on Amazon Linux 2 • Go は、Amazon Linux 2 をベースにイメージ構成することで利⽤可能 https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html

Slide 9

Slide 9 text

#serverlessjp #serverlessjp AWS Graviton2 への移⾏ガイドのご紹介

Slide 10

Slide 10 text

#serverlessjp Graviton2 搭載の AWS Lambda への移⾏ 1. 依存関係の整理 1. Lambda 関数内で利⽤するライブラリ/Lambda Layer / Lambda Extensions 2. 利⽤するツールの確認(例︓CI/CD パイプラインやコンパイラ) 2. 依存するライブラリ/ツールが arm64 に対応しているか確認 1. 既存の arm64 バイナリや、アーキテクチャに依存しないソースコード (Open Source Software) を探す 2. ベンダーまたはプロバイダに arm64 サポートに向けたロードマップを尋ねる 3. 調査やエスカレーションを⽀援できる AWS アカウントチームに連絡 3. ビルド・デプロイ・テスト 4. パフォーマンステスト 1. Lambda 関数の alias routing configuration を活⽤した x86 と arm64 の関数を⽐較しテスト (重みづけをしたトラフィックルーティングの活⽤で容易に⽐較が実現可能) 5. AWS Graviton2 getting started guide on Github 1. https://github.com/aws/aws-graviton-getting-started https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html

Slide 11

Slide 11 text

#serverlessjp 何を表す数字かわかります? 1536300810240

Slide 12

Slide 12 text

© 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. #serverlessjp ⼤量のデータ

Slide 13

Slide 13 text

#serverlessjp 使⽤可能なリソース ワークロードに適したメモリの割り当てをすることが重要 https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html 128 10,240 1 1769 512

Slide 14

Slide 14 text

#serverlessjp 使⽤可能なリソース ワークロードに適したメモリの割り当てをすることが重要 https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html 128 10,240 1 1769 512 10GB

Slide 15

Slide 15 text

© 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. #serverlessjp Graviton2 /tmp 10GB (pre-announcement) Memory 10GB/ 6 vCPU

Slide 16

Slide 16 text

#serverlessjp AWS Lambda がサポートするパッケージ⽅式 2020 年の AWS re:Invent 以降、コンテナイメージが新たにサポート # Zip コンテナ 1 ストレージ場所 S3 ECR 2 ストレージサイズ上限 (リージョン単位) 75GB (上限緩和可能) ECR のクォータに準拠 3 アーティファクトサイズ上限 250 MB (展開後) 10 GB 4 Layer 対応 あり なし 5 コード署名 あり なし 常時起動する必要のないコンテナアプリを起動する場合、 Lambdaを利⽤することでコスト効率が良い場合も ポイント https://docs.aws.amazon.com/lambda/latest/dg/configuration-images.html

Slide 17

Slide 17 text

#serverlessjp ECRのクロスアカウントサポート AWS Lambda 関数のアカウントとは異なる AWS アカウントの ECR に保存された コンテナイメージが利⽤可能に。1か所で管理が可能になり Immutable Image の活⽤が容易化 Development Account AWS Lambda Amazon ECR Image Production Account AWS Lambda Amazon ECR Image Development Account AWS Lambda Amazon ECR Image Production Account https://docs.aws.amazon.com/lambda/latest/dg/configuration-images.html#configuration-images- permissions AWS Lambda

Slide 18

Slide 18 text

#serverlessjp AWS Lambda 関連の強化されたモニタリング Amazon CloudWatch Lambda Insights が Graviton 2対応(GA) Amazon CloudWatch Lambda Insights が コンテナイメージに対応(GA)

Slide 19

Slide 19 text

#serverlessjp CloudWatch Lambda Insights • Lambda Function のパフォーマンス監視や トラブルシュート、最適化を可能にする機能 • Function に関するメトリクスを⾃動的に ダッシュボード化 • メモリリークや新バージョンのデプロイによる性能変化を可視化 • CloudWatch Logs Insights や Service Lens と 連携することでさらに問題の原因究明が容易になる Lambda function Amazon CloudWatch

Slide 20

Slide 20 text

#serverlessjp Lambda(コンテナ)に対する CloudWatch Lambda Insights の有効化 Agent を導⼊と、Lambda 関数へ権限を付与することで利⽤可能に https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Lambda-Insights- Getting-Started-docker.html • 「CloudWatchLambdaInsightsExecutionRolePolicy」または、同等のポリシーを付与すること

Slide 21

Slide 21 text

#serverlessjp AWS Lambda 関連の強化されたモニタリング Amazon CloudWatch Lambda Insights が Graviton 2対応(GA) AWS Trusted Advisor による助⾔の提供 Amazon CloudWatch Lambda Insights が コンテナイメージに対応(GA)

Slide 22

Slide 22 text

#serverlessjp AWS Trusted Advisorによる助⾔の提供 AWS Lambdaに関する4つの助⾔が追加。 3.⾮推奨 (または⾮推奨になりそうな) ランタイム の使⽤ ⾮推奨とされたか、⾮推奨になりそうな関数ラン タイムをチェック。 4.単⼀の AZ での VPC 対応関数 単⼀AZで稼働中のVPC アクセス可能な Lambda 関数をチェック。 ⾼可⽤性を実現するために、VPC 対応の関数を複 数のアベイラビリティーゾーンに接続することを お勧めします。 1.⾼エラー率 過去 7 ⽇間のいずれかの⽇において、エラー率が 1 ⽇で 10% を超える関数をチェック エラーによりリトライが発⽣しコスト増につなが ることも。 2.過剰なタイムアウト 過去 7 ⽇間のいずれかの⽇において、タイムアウ ト率が 1 ⽇で 10% を超える関数をチェック。 エラーによりリトライが発⽣しコスト増につなが ることも。 https://aws.amazon.com/jp/about-aws/whats-new/2021/03/aws-lambda-adds-four-trusted- advisor-checks/

Slide 23

Slide 23 text

#serverlessjp 2022/1 現在 サポートされているランタイム サポート対象 Arm64(Graviton 2) サポート Node.JS Node.js 14 Node.js 12 対応 Python Python 3.9 Python 3.8 対応 Python 3.7 Python 3.6 未対応 Ruby Ruby 2.7 対応 Java Java 11 Java 8(Amazon Linux2) 対応 Java 8(Amazon Linux1) 未対応 Go Go 1.x 未対応 .NET Core .NET Core 3.1 対応 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

Slide 24

Slide 24 text

#serverlessjp AWS Lambda の ランタイムポリシー 関数の実⾏は、⾮推奨でも可能。ただし、テクニカルサポートを受ける・セキュリティパッチを 受け取るためにもサポートバージョンへの移⾏を強く推奨 ⾮推奨なランタイム テクニカルサポート対象外 セキュリティパッチその他の更新は未適⽤ https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtime-support-policy.html

Slide 25

Slide 25 text

#serverlessjp AWS Lambda 関連の強化されたモニタリング ・VPC 内リソースにアクセス可能な Lambda 関数が 利⽤する ENI情報がCloudTrailで出⼒が可能に ・CloudWatch で異常値検出するメトリクスを 追加可能に ・Amazon MSK*/self-managed Kafka で OffsetLag メトリクスが取得可能に (*Amazon Managed Streaming for Apache Kafka) Amazon CloudWatch Lambda Insights が Graviton 2対応(GA) AWS Trusted Advisor による助⾔の提供 Amazon CloudWatch Lambda Insights が コンテナイメージに対応(GA)

Slide 26

Slide 26 text

#serverlessjp #serverlessjp 共通点はなんでしょう︖ Amazon Aurora Amazon ElastiCache Elastic Load Balancing AWS Fargate

Slide 27

Slide 27 text

#serverlessjp #serverlessjp Private subnet 1 Private subnet 2 共通点はなんでしょう︖ Amazon Aurora Amazon ElastiCache Elastic Load Balancing AWS Fargate Customer Own VPC Availability Zone 1 Availability Zone 2

Slide 28

Slide 28 text

#serverlessjp Lambda 関数からのVPC 内リソースへのアクセス Client Account Customer Own VPC Private subnet 1 Availability Zone 1 Availability Zone 2 Private subnet 2 AWS Cloud Lambda 関数 による VPC 内のリソース(Aurora/ ElastiCache/ Fargate/ EC2 等)へのアクセスは、 ENI(Elastic Network Interface)を Customer VPC に作成して ENI 経由で アクセス Amazon Aurora Amazon Replica Amazon ElastiCache Amazon ElastiCache Elastic Load Balancing Elastic Load Balancing AWS Fargate AWS Fargate AWS Lambda Service VPC Service Account AWS Lambda Execution Environment Lambda function Elastic network interface ※ Elastic network interface ※ VPC 内リソースにアクセス可能なLambda 関数の実⾏記録にENIの情報が追加され、識別性が向上

Slide 29

Slide 29 text

#serverlessjp Lambda 関数のデータイベント有効化 CloudTrailでは管理イベントとデータイベントがあり、Lambda 関数の Invoke について記録する 場合は、以下のような定義をすることで記録可能に(有料) Trail: Type: AWS::CloudTrail::Trail Properties: TrailName: !Sub ${AWS::StackName}-cloudtrail S3BucketName: !Sub ${LogBucket} EnableLogFileValidation: true EventSelectors: - DataResources: - Type: AWS::Lambda::Function Values: - !GetAtt HelloWorldFunction.Arn IncludeManagementEvents: false IncludeGlobalServiceEvents: false IsLogging: true IsMultiRegionTrail: false

Slide 30

Slide 30 text

#serverlessjp CloudTrailにENI のID情報が出⼒可能に { "eventVersion": "1.08", "eventTime": "2021-12-20T10:07:13Z", "eventSource": "lambda.amazonaws.com", "eventName": "Invoke", "awsRegion": "ap-northeast-1", "sourceIPAddress": “1.1.1.1", "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", "requestParameters": { "functionName": "arn:aws:lambda:ap-northeast- 1:123456789012:function:sam-vpc-HelloWorldFunction", "invocationType": "RequestResponse", "logType": "Tail", "contentType": "application/json“ }, "responseElements": null, "additionalEventData": { "customerEniId": "eni-0c91ad65d8e92f254", "functionVersion": "arn:aws:lambda:ap-northeast- 1:123456789012:function:sam-vpc-HelloWorldFunction:$LATEST“ }, "requestID": "a8b05cac-9ce9-4bdd-82a8-071f906de90c", "eventID": "7271b4cc-b471-42cf-ae29-8b013048936e", "readOnly": false, "resources": [ { "accountId": "123456789012", "type": "AWS::Lambda::Function", "ARN": "arn:aws:lambda:ap-northeast- 1:123456789012:function:sam-vpc-HelloWorldFunction“ } ], "eventType": "AwsApiCall", "managementEvent": false, "recipientAccountId": "123456789012", "eventCategory": "Data“ }

Slide 31

Slide 31 text

#serverlessjp AWS Lambda 関連の強化されたモニタリング ・VPC 内リソースにアクセス可能な Lambda 関数が 利⽤する ENI情報がCloudTrailで出⼒が可能に ・CloudWatch で異常値検出するメトリクスを 追加可能に ・Amazon MSK*/self-managed Kafka で OffsetLag メトリクスが取得可能に (*Amazon Managed Streaming for Apache Kafka) Amazon CloudWatch Lambda Insights が Graviton 2対応(GA) AWS Trusted Advisor による助⾔の提供 Amazon CloudWatch Lambda Insights が コンテナイメージに対応(GA)

Slide 32

Slide 32 text

#serverlessjp これらサービスの共通点は何でしょうか Amazon Simple Queue Service (Amazon SQS) Amazon MQ Amazon Managed Streaming for Apache Kafka Amazon Kinesis Data Streams Amazon DynamoDB

Slide 33

Slide 33 text

#serverlessjp これらサービスの共通点は何でしょうか Amazon Simple Queue Service (Amazon SQS) Amazon MQ Amazon Managed Streaming for Apache Kafka Amazon Kinesis Data Streams Amazon DynamoDB A.イベントソースマッピングを定義することで Lamda 関数をシームレスに統合可能なサービス https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/in vocation-eventsourcemapping.html

Slide 34

Slide 34 text

#serverlessjp イベントソースマッピング イベントソースマッピングが利⽤可能なサービスと連携する場合関数のコード内でポーリング処理 を実装する必要がなくLambdaがポーリングを⾏い、「バッチ」を作成後、関数を起動する Amazon Simple Queue Service (Amazon SQS) Amazon MQ Amazon Managed Streaming for Apache Kafka Amazon Kinesis Data Streams Amazon DynamoDB AWS Lambda event source mapping Lambda Functions ポーリングを⾏いイベントソースから受け取ったレコード群のこと。 データサイズやレコード件数等の上限に達すると関数が起動される バッチ

Slide 35

Slide 35 text

#serverlessjp 別アカウントのキューをトリガーとして利⽤可能に 同⼀リージョンの異なる AWS アカウントのキューを指定して AWS Lambda 関数の起動が可能に Producer AWS Lambda Event source mapping Lambda Functions Amazon Simple Queue Service (Amazon SQS) A Account B Account 異なる

Slide 36

Slide 36 text

#serverlessjp Kinesis/Dynamo DB は同⼀アカウントをサポート Kinesis/Dynamo DB をイベントソースとする場合は、同⼀リージョン・同⼀アカウントの ストリームをトリガーに指定可能。 Producer Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions A Account

Slide 37

Slide 37 text

#serverlessjp #serverlessjp LambdaとKinesis Data Streamsをデプロイ Stream: Type: AWS::Kinesis::Stream Properties: Name: LambdaEventFilteringStream RetentionPeriodHours: 168 ShardCount: 1 Producer Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions ProducerFunction: Type: AWS::Serverless::Function Properties: CodeUri: KinesisClient/ Handler: app.lambda_handler Runtime: python3.9 Architectures: - x86_64 Environment: Variables: STREAM_NAME: !Ref Stream Policies: - Version: '2012-10-17' Statement: - Effect: Allow Action: kinesis:PutRecord Resource: - !GetAtt Stream.Arn Lambda Functions Function1: Type: AWS::Serverless::Function Properties: CodeUri: KinesisFunction/ Handler: app.lambda_handler Runtime: python3.9 Architectures: - x86_64 Events: KinesisEvent: Type: Kinesis Properties: Stream: !GetAtt Stream.Arn StartingPosition:LATEST Enabled: True BatchSize: 50 MaximumBatchingWindowInSeconds: 10 MaximumRetryAttempts: 5

Slide 38

Slide 38 text

#serverlessjp #serverlessjp Cloud9 の環境上で SAM で Deploy

Slide 39

Slide 39 text

#serverlessjp 複数のアプリが同⼀ Stream を別々に利⽤可能 1つのイベントデータに対して異なる処理(例︓データの蓄積のための処理と分析の処理)を 別々の関数やコンテナアプリで⾏うことが可能 Producer Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions AWS Lambda Event source mapping Lambda Functions AWS Fargate Container

Slide 40

Slide 40 text

#serverlessjp Producer Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions AWS Lambda Event source mapping Lambda Functions AWS Fargate Container 複数のアプリが同⼀ Stream を別々に利⽤可能 1つのイベントデータに対して異なる処理(例︓データの蓄積のための処理と分析の処理)を 別々の関数やコンテナアプリで⾏うことが可能

Slide 41

Slide 41 text

#serverlessjp #serverlessjp 異なる処理をする関数をもう⼀つ追加 Users Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions A Account Lambda Functions AWS Lambda Event source mapping Lambda Functions Function2: Type: AWS::Serverless::Function Properties: CodeUri: KinesisFunction2/ Handler: app.lambda_handler Runtime: python3.9 Architectures: - x86_64 Events: KinesisEvent: Type: Kinesis Properties: Stream: !GetAtt Stream.Arn StartingPosition: LATEST Enabled: True BatchSize: 50 MaximumBatchingWindowInSeconds: 10 MaximumRetryAttempts: 5

Slide 42

Slide 42 text

#serverlessjp #serverlessjp スタックのテンプレートに追加し SAM でデプロイ

Slide 43

Slide 43 text

#serverlessjp #serverlessjp Producer を起動し、1000件 投⼊します。 Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions return { 'EventTime': datetime.datetime.now().isoformat(), 'ID': "ID-"+str(100000+count), 'Price ': random.randint(1,1000) } Producer Lambda Functions AWS Lambda Event source mapping Lambda Functions

Slide 44

Slide 44 text

#serverlessjp #serverlessjp Producer を起動し、1000件 投⼊します。 Users Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions A Account Lambda Functions AWS Lambda Event source mapping Lambda Functions def lambda_handler(event, context): for record in event['Records']: payload=base64.b64decode(record["kinesis"]["data"]) print(payload.decode('ascii')) data=json.loads(payload) price = data["Price"] if price > 500 : print(“Expensive" ) return { "statusCode": 200, "body": json.dumps({ "message": "hello Tokyo", }), }

Slide 45

Slide 45 text

#serverlessjp #serverlessjp Producer を起動し、1000件 投⼊します。 Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions AWS Lambda Event source mapping Lambda Functions def lambda_handler(event, context): for record in event['Records']: payload=base64.b64decode(record["kinesis"]["data"]) print(payload.decode('ascii’)) return { "statusCode": 200, "body": json.dumps({ "message": "hello Las Vegas", }), } Producer Lambda Functions

Slide 46

Slide 46 text

#serverlessjp #serverlessjp Producer を起動し、1000件 投⼊します。

Slide 47

Slide 47 text

#serverlessjp Producer Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions AWS Lambda Event source mapping Lambda Functions AWS Fargate Container 複数のアプリが同⼀Streamを別々に利⽤可能 1つのイベントデータに対して異なる処理(例︓データの蓄積のための処理と分析の処理)を 別々の関数やコンテナアプリで⾏うことが可能 Lambda 関数が⼀部のイベントのみを処理したい場合、 関数起動後に判定を⾏う必要があり、その処理実装・処理時間・AWSサービス利⽤料に影響がある 課題

Slide 48

Slide 48 text

© 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. #serverlessjp 実は、⼀部のデータのみを処理したい

Slide 49

Slide 49 text

#serverlessjp Event Filtering 定義による対象イベントの選定 Event source mapping に 条件式(EventBridge のルールと同等の記述で定義)を記載すること で、マッチしないイベントによる Lambda 関数の起動を回避可能。 Producer Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions AWS Lambda Event source mapping Lambda Functions AWS Fargate Container スキップ Kinesis Data Streams の読込キャパシティは従来通り消費される。 (Event source mapping 側でデータ受け取り後判定しているため) 注意

Slide 50

Slide 50 text

#serverlessjp #serverlessjp FilterConditionを追加し対象を選定 Users Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions A Account Lambda Functions AWS Lambda Event source mapping Lambda Functions Events: KinesisEvent: Type: Kinesis Properties: Stream: !GetAtt Stream.Arn StartingPosition: LATEST Enabled: True BatchSize: 50 MaximumBatchingWindowInSeconds: 10 MaximumRetryAttempts: 2 FilterCriteria: Filters: - Pattern: '{"data": {"Price": [ { "numeric": [ "<=", 500 ] } ]}}'

Slide 51

Slide 51 text

#serverlessjp #serverlessjp FilterConditionを追加し対象を選定 Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions AWS Lambda Event source mapping Lambda Functions FilterCriteria: Filters: - Pattern: '{"data": {"Price": [ { "numeric": [ “>", 500 ] } ]}}' Producer Lambda Functions

Slide 52

Slide 52 text

#serverlessjp • テンプレートを修正し、SAMでデプロイ後、再度1000件投⼊ • Lambdaのイベントソース定義 • CloudWatch Logsで確認 • Function1では、Priceが500以下のデータのみ処理。Expensiveと出⼒されない • Function2では、Priceが501以上のデータのみ処理

Slide 53

Slide 53 text

#serverlessjp Event Filtering 定義による対象イベントの選定 Event source mapping に 条件式(EventBridge のルールと同等の記述で定義)を記載すること で、マッチしないイベントによる関数の起動を回避可能。 Producer AWS Lambda Event source mapping Lambda Functions キューから削除 Amazon Simple Queue Service (Amazon SQS)

Slide 54

Slide 54 text

© 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. #serverlessjp エラーが発⽣した場合のハンドリングは︖ 〜 イベントソースマッピング編 〜

Slide 55

Slide 55 text

#serverlessjp #serverlessjp ご参考: エラーハンドリングの解説 https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand-aws-sessions-1-82341

Slide 56

Slide 56 text

#serverlessjp イベントソースマッピング利⽤時のエラー処理1 ⼀定回数 or ⼀定時間経過しても処理が成功しないデータは退避 または、破棄を検討 AWS Lambda Evemt source mapping Lambda Functions Amazon Kinesis Data Streams Amazon Simple Queue Service (Amazon SQS) Amazon Simple Notification Service (Amazon SNS) Event source mapping ・レコードの最⼤有効期間 ・最⼤再試⾏回数 Amazon Simple Queue Service (Amazon SQS) Lambda Functions AWS Lambda Evemt source mapping Amazon Simple Queue Service (Amazon SQS) Amazon SQS DLQ ・最⼤受信回数

Slide 57

Slide 57 text

#serverlessjp #serverlessjp エラーが発⽣するようにコードを修正 Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions A Account AWS Lambda Event source mapping Lambda Functions if price > 500 : #print(“Expensive” ) raise ValueError("Expensive!") Producer Lambda Functions

Slide 58

Slide 58 text

#serverlessjp #serverlessjp エラー発⽣時の退避設定を追加 Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions AWS Lambda Event source mapping Lambda Functions Events: KinesisEvent: Type: Kinesis Properties: Stream: !GetAtt Stream.Arn StartingPosition: LATEST Enabled: True BatchSize: 50 MaximumBatchingWindowInSeconds: 10 MaximumRetryAttempts: 5 DestinationConfig: OnFailure: Destination: !GetAtt KinesisDestinationQueue.Arn KinesisDestinationQueue: Type: AWS::SQS::Queue Producer Lambda Functions

Slide 59

Slide 59 text

#serverlessjp ・CloudWatch Logsで実⾏状況を確認 ・SQSでイベントの情報(※)が転送されていることを確認

Slide 60

Slide 60 text

#serverlessjp ・CloudWatch Logsで実⾏状況を確認 ・SQSでイベントの情報(※)が転送されていることを確認 ※実際のレコードは含まれていないので、Kinesis Data Streams内の有効期限が切れて データが失われる前に、この情報を処理し、ストリームから取得する必要があります。

Slide 61

Slide 61 text

#serverlessjp エラー発⽣時の挙動 • 最⼤再試⾏回数を5回と設定しているため以下の挙動 • 1回⽬︓通常の実⾏ • 2~6回⽬ 再試⾏5回 • 再試⾏の際には、エラーとなったレコードだけでなく、バッチ内の全レ コードが再試⾏対象となる。 エラーが発⽣したレコードと同じバッチ(処理の単位)を繰り返し処理

Slide 62

Slide 62 text

#serverlessjp イベントソースマッピング利⽤時のエラー処理2 バッチ内の⼀部のデータでエラーがあった場合は適切に応答することで、 その後の処理がより効率的に AWS Lambda Lambda Functions Amazon Kinesis Data Streams チェックポイント機能(エラーレコードのIDを応答) { "batchItemFailures": [ { "itemIdentifier": "" } ] } 「全部リトライ」 ・「⼆分割してリトライ」 「エラーレコードからのリトライ」

Slide 63

Slide 63 text

#serverlessjp #serverlessjp レコードのシーケンス番号を応答 Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions Lambda Functions AWS Lambda Event source mapping Lambda Functions return { 'batchItemFailures': [ { 'itemIdentifier': record['kinesis']['sequenceNumber'] } ]

Slide 64

Slide 64 text

#serverlessjp #serverlessjp Event Source Mappingの構成を変更 Amazon Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions AWS Lambda Event source mapping Lambda Functions Events: KinesisEvent: Type: Kinesis Properties: Stream: !GetAtt Stream.Arn StartingPosition: LATEST Enabled: True BatchSize: 50 MaximumBatchingWindowInSeconds: 10 MaximumRetryAttempts: 5 FunctionResponseTypes: - ReportBatchItemFailures Lambda Functions

Slide 65

Slide 65 text

#serverlessjp イベントソースマッピング利⽤時のエラー処理2 バッチ内の⼀部のデータでエラーがあった場合は適切に応答することで、 その後の処理がより効率的に Amazon Simple Queue Service (Amazon SQS) { "batchItemFailures": [ { "itemIdentifier": "id2" }, { "itemIdentifier": "id4" } ] } 「全部リトライ」 「正常なレコードのリトライの回避」 AWS Lambda Lambda Functions

Slide 66

Slide 66 text

#serverlessjp これらサービスの共通点は何でしょうか Amazon Simple Queue Service (Amazon SQS) Amazon MQ Amazon Managed Streaming for Apache Kafka Amazon Kinesis Data Streams Amazon DynamoDB

Slide 67

Slide 67 text

#serverlessjp 最⼤バッチウィンドウのサポートの追加 Amazon MSK, self-hosted Apache Kafka, Amazon MQ for ActiveMQ and RabbitMQで最⼤バッ チウィンドウを指定可能になり、関数起動の最⼤待機時間が制御でき処理効率の改善が可能 Amazon Simple Queue Service (Amazon SQS) Amazon MQ Amazon Managed Streaming for Apache Kafka Amazon Kinesis Data Streams Amazon DynamoDB AWS Lambda event source mapping Lambda Functions バッチ内のイベントの件数・最⼤バッチウィンドウ・バッチのサイズの いずれかの条件を満たすと、関数が実⾏される ポイント

Slide 68

Slide 68 text

© 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. #serverlessjp AWS Lambda関数を初めて作成した時の ランタイムは何ですか︖

Slide 69

Slide 69 text

© 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. #serverlessjp 私は Node.JS Node.js

Slide 70

Slide 70 text

#serverlessjp ES modules のサポート • import/export オペレータによるモジュール利⽤可能に • Node(CommonJS modules)ではなく、JavaScript(ES6)標準モジュール • webpack などでのパッケージングで、静的解析や、tree shaking(実⾏されないコードを削除 する機能)の恩恵を受けやすい • ES modules は、デフォルトで strict mode 適⽤ • 厳格な構⽂管理の適⽤を簡単に Node.js 14.x ランタイムにおいて、CommonJS modulesでは不便だった部分が解消 https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/

Slide 71

Slide 71 text

#serverlessjp ES modules として Lambda関数を扱うには 以下のどちらかの⽅法か、または組み合わせて利⽤可能 // package.json { "name": "ec-module-example", "type": "module", "description": "ES module.", "version": "1.0", "main": "index.js", "author": "Dan Fox", "license": "ISC” } // index.mjs import { square } from './lib.mjs’; export async function handler() { let result = square(6); // 36 return result; }; // lib.mjs export function square(x) { return x * x; } commonjs”だが、”module”を .js 拡張⼦が

Slide 72

Slide 72 text

#serverlessjp ES modules のサポート • import/export オペレータによるモジュール利⽤可能に • Node(CommonJS modules)ではなく、JavaScript(ES6)標準モジュール • webpack などでのパッケージングで、静的解析や、tree shaking(実⾏されないコードを削除 する機能)の恩恵を受けやすい • ES modules は、デフォルトで strict mode 適⽤ • 厳格な構⽂管理の適⽤を簡単に Node.js 14.x ランタイムにおいて、CommonJS modulesでは不便だった部分が解消 https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/ • top-level await をサポートするように改善 • Provisioned Concurrencyと組み合わせて、コールドスタートをより効果的に短縮できる

Slide 73

Slide 73 text

#serverlessjp Lambda 実⾏環境のライフサイクル Init フェーズ invoke Shutdown フェーズ invoke invoke ランタイムの初期化に加え、 ユーザーコードで実装された 初期化が⾏われるフェーズ ランタイムの終了処理を実施す る。全体で2秒。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-context.html

Slide 74

Slide 74 text

#serverlessjp Top-level awaitのサポート top-levelで、awaitが書けることにより、Initフェーズでの処理を擬似的に同期処理化 import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm"; const ssmClient = new SSMClient(); const input = { "Name": "/configItem" }; const command = new GetParameterCommand(input); const parameter = await ssmClient.send(command); // top-level await

Slide 75

Slide 75 text

#serverlessjp Top-level awaitのサポート top-levelで、awaitが書けることにより、Initフェーズでの処理を擬似的に同期処理化 import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm"; const ssmClient = new SSMClient(); const input = { "Name": "/configItem" }; const command = new GetParameterCommand(input); const parameter = await ssmClient.send(command); // top-level await export async function handler() { const response = { statusCode: 200, "body": parameter.Parameter.Value }; return response; };

Slide 76

Slide 76 text

#serverlessjp 2.ソフトウェア関連 Update コンテナサポート モニタリング拡充 ⾔語サポート SQS クロスアカウント対応 Event filtering エラーハンドリング 最⼤バッチウィンドウのサポートの追加 Node.jsのESモジュール/top-level awaitのサポート

Slide 77

Slide 77 text

© 2022, Amazon Web Services, Inc. or its affiliates. All rights reserved. #serverlessjp Thank you