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

AWS Lambda Update 2021

A49d01c48e10d19feb8e61310bceabab?s=47 kensh
January 26, 2022

AWS Lambda Update 2021

re:Invent 2021を含む、2021年に登場したupdateとそのまとめ

A49d01c48e10d19feb8e61310bceabab?s=128

kensh

January 26, 2022
Tweet

More Decks by kensh

Other Decks in Technology

Transcript

  1. © 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
  2. #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/
  3. #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 ハードウェアから、ソフトウェア(プラット フォーム)を管理・運⽤に責任を持つ
  4. © 2022, Amazon Web Services, Inc. or its affiliates. All

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

  6. #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)
  7. #serverlessjp Graviton2 の利⽤⽅法 AWS CLI / AWS SAM / AWS

    CDK / AWS マネージメントコンソールで指定可能 ・x86_64(デフォルト) ・arm64 (Graviton2 )
  8. #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
  9. #serverlessjp #serverlessjp AWS Graviton2 への移⾏ガイドのご紹介

  10. #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
  11. #serverlessjp 何を表す数字かわかります? 1536300810240

  12. © 2022, Amazon Web Services, Inc. or its affiliates. All

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

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

  15. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. #serverlessjp Graviton2 /tmp 10GB (pre-announcement) Memory 10GB/ 6 vCPU
  16. #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
  17. #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
  18. #serverlessjp AWS Lambda 関連の強化されたモニタリング Amazon CloudWatch Lambda Insights が Graviton

    2対応(GA) Amazon CloudWatch Lambda Insights が コンテナイメージに対応(GA)
  19. #serverlessjp CloudWatch Lambda Insights • Lambda Function のパフォーマンス監視や トラブルシュート、最適化を可能にする機能 •

    Function に関するメトリクスを⾃動的に ダッシュボード化 • メモリリークや新バージョンのデプロイによる性能変化を可視化 • CloudWatch Logs Insights や Service Lens と 連携することでさらに問題の原因究明が容易になる Lambda function Amazon CloudWatch
  20. #serverlessjp Lambda(コンテナ)に対する CloudWatch Lambda Insights の有効化 Agent を導⼊と、Lambda 関数へ権限を付与することで利⽤可能に https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Lambda-Insights-

    Getting-Started-docker.html • 「CloudWatchLambdaInsightsExecutionRolePolicy」または、同等のポリシーを付与すること
  21. #serverlessjp AWS Lambda 関連の強化されたモニタリング Amazon CloudWatch Lambda Insights が Graviton

    2対応(GA) AWS Trusted Advisor による助⾔の提供 Amazon CloudWatch Lambda Insights が コンテナイメージに対応(GA)
  22. #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/
  23. #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
  24. #serverlessjp AWS Lambda の ランタイムポリシー 関数の実⾏は、⾮推奨でも可能。ただし、テクニカルサポートを受ける・セキュリティパッチを 受け取るためにもサポートバージョンへの移⾏を強く推奨 ⾮推奨なランタイム テクニカルサポート対象外 セキュリティパッチその他の更新は未適⽤

    https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtime-support-policy.html
  25. #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)
  26. #serverlessjp #serverlessjp 共通点はなんでしょう︖ Amazon Aurora Amazon ElastiCache Elastic Load Balancing

    AWS Fargate
  27. #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
  28. #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の情報が追加され、識別性が向上
  29. #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
  30. #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“ }
  31. #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)
  32. #serverlessjp これらサービスの共通点は何でしょうか Amazon Simple Queue Service (Amazon SQS) Amazon MQ

    Amazon Managed Streaming for Apache Kafka Amazon Kinesis Data Streams Amazon DynamoDB
  33. #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
  34. #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 ポーリングを⾏いイベントソースから受け取ったレコード群のこと。 データサイズやレコード件数等の上限に達すると関数が起動される バッチ
  35. #serverlessjp 別アカウントのキューをトリガーとして利⽤可能に 同⼀リージョンの異なる AWS アカウントのキューを指定して AWS Lambda 関数の起動が可能に Producer AWS

    Lambda Event source mapping Lambda Functions Amazon Simple Queue Service (Amazon SQS) A Account B Account 異なる
  36. #serverlessjp Kinesis/Dynamo DB は同⼀アカウントをサポート Kinesis/Dynamo DB をイベントソースとする場合は、同⼀リージョン・同⼀アカウントの ストリームをトリガーに指定可能。 Producer Amazon

    Kinesis Data Streams AWS Lambda Event source mapping Lambda Functions A Account
  37. #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
  38. #serverlessjp #serverlessjp Cloud9 の環境上で SAM で Deploy

  39. #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
  40. #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つのイベントデータに対して異なる処理(例︓データの蓄積のための処理と分析の処理)を 別々の関数やコンテナアプリで⾏うことが可能
  41. #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
  42. #serverlessjp #serverlessjp スタックのテンプレートに追加し SAM でデプロイ

  43. #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
  44. #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", }), }
  45. #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
  46. #serverlessjp #serverlessjp Producer を起動し、1000件 投⼊します。

  47. #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サービス利⽤料に影響がある 課題
  48. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. #serverlessjp 実は、⼀部のデータのみを処理したい
  49. #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 側でデータ受け取り後判定しているため) 注意
  50. #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 ] } ]}}'
  51. #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
  52. #serverlessjp • テンプレートを修正し、SAMでデプロイ後、再度1000件投⼊ • Lambdaのイベントソース定義 • CloudWatch Logsで確認 • Function1では、Priceが500以下のデータのみ処理。Expensiveと出⼒されない

    • Function2では、Priceが501以上のデータのみ処理
  53. #serverlessjp Event Filtering 定義による対象イベントの選定 Event source mapping に 条件式(EventBridge のルールと同等の記述で定義)を記載すること

    で、マッチしないイベントによる関数の起動を回避可能。 Producer AWS Lambda Event source mapping Lambda Functions キューから削除 Amazon Simple Queue Service (Amazon SQS)
  54. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. #serverlessjp エラーが発⽣した場合のハンドリングは︖ 〜 イベントソースマッピング編 〜
  55. #serverlessjp #serverlessjp ご参考: エラーハンドリングの解説 https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand-aws-sessions-1-82341

  56. #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 ・最⼤受信回数
  57. #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
  58. #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
  59. #serverlessjp ・CloudWatch Logsで実⾏状況を確認 ・SQSでイベントの情報(※)が転送されていることを確認

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

  61. #serverlessjp エラー発⽣時の挙動 • 最⼤再試⾏回数を5回と設定しているため以下の挙動 • 1回⽬︓通常の実⾏ • 2~6回⽬ 再試⾏5回 •

    再試⾏の際には、エラーとなったレコードだけでなく、バッチ内の全レ コードが再試⾏対象となる。 エラーが発⽣したレコードと同じバッチ(処理の単位)を繰り返し処理
  62. #serverlessjp イベントソースマッピング利⽤時のエラー処理2 バッチ内の⼀部のデータでエラーがあった場合は適切に応答することで、 その後の処理がより効率的に AWS Lambda Lambda Functions Amazon Kinesis

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

    { "batchItemFailures": [ { "itemIdentifier": "id2" }, { "itemIdentifier": "id4" } ] } 「全部リトライ」 「正常なレコードのリトライの回避」 AWS Lambda Lambda Functions
  66. #serverlessjp これらサービスの共通点は何でしょうか Amazon Simple Queue Service (Amazon SQS) Amazon MQ

    Amazon Managed Streaming for Apache Kafka Amazon Kinesis Data Streams Amazon DynamoDB
  67. #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 バッチ内のイベントの件数・最⼤バッチウィンドウ・バッチのサイズの いずれかの条件を満たすと、関数が実⾏される ポイント
  68. © 2022, Amazon Web Services, Inc. or its affiliates. All

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

    rights reserved. #serverlessjp 私は Node.JS Node.js
  70. #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/
  71. #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 拡張⼦が
  72. #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と組み合わせて、コールドスタートをより効果的に短縮できる
  73. #serverlessjp Lambda 実⾏環境のライフサイクル Init フェーズ invoke Shutdown フェーズ invoke invoke

    ランタイムの初期化に加え、 ユーザーコードで実装された 初期化が⾏われるフェーズ ランタイムの終了処理を実施す る。全体で2秒。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-context.html
  74. #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
  75. #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; };
  76. #serverlessjp 2.ソフトウェア関連 Update コンテナサポート モニタリング拡充 ⾔語サポート SQS クロスアカウント対応 Event filtering

    エラーハンドリング 最⼤バッチウィンドウのサポートの追加 Node.jsのESモジュール/top-level awaitのサポート
  77. © 2022, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. #serverlessjp Thank you