NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

【10周年前祝い】歴史・年表でみるAWSサービス(AWS Lambda編) -機能一覧・概要・アップデートのまとめ・入門-

小西秀和です。
歴史・年表でみるAWS全サービス一覧 -アナウンス日、General Availability(GA)、AWSサービス概要のまとめ-」から始まった、AWSサービスを歴史・年表から機能を洗い出してまとめるシリーズの第8弾です(過去、Amazon S3AWS Systems ManagerAmazon Route 53Amazon EventBridgeAWS KMSAmazon SQSについて書きました)。

今回は2014年11月にアナウンスされたサーバーレスでフルマネージドなコード実行サービスを提供するAWS Lambdaについて歴史年表を作成してみました。
今年2024年11月にはAWS Lambdaがアナウンスから10周年を迎えるということで、かなり早めではありますが前祝いという意味も含めて、この記事を書きました。
今回もAWS Lambdaの誕生から機能追加やアップデートを追いながら主要機能を現在のAWS Lambdaの機能一覧と概要としてまとめています。
これらが、各AWSサービスの機能概要に加えてコンセプトや変わらないもの、変わってきたものを知る手がかりとなればと考えています。
今回の記事の内容は次のような構成になっています。

AWS Lambda歴史年表の作成経緯と方法

今回、AWS Lambdaの歴史年表を作成したのは、今年2024年にAWS Lambdaがアナウンスから10周年を迎えることに他なりません。

また、AWS Lambdaが2014年11月にアナウンスされて以降、様々なAWSサービスとの統合やサポートされているランタイム(サポート言語)の拡張がされてきたため、次のアプローチでAWS Lambdaの情報を整理したいと考えたことも理由の一つです。

  • AWS Lambdaの歴史を追いながら、アップデートの変遷を整理する
  • AWS Lambdaの機能一覧と特徴をまとめる

この年表は主に次のブログやドキュメント履歴のAWS Lambdaに関する内容を参考にしています。

年表の日付は、参考にした資料によってアナウンスや記事投稿のタイミングが違う場合もあったため、若干のブレがあります。
掲載している内容は現在のAWS Lambdaと関係している主要な機能と概要説明に必要なものに限定しています。
つまり、ここの年表にあるものがAWS Lambdaの機能のアップデートの全てではなく、あくまで私がピックアップした代表的なアップデートであることにご注意ください

AWS Lambda歴史年表(2014年11月13日~2024年06月01日までのアップデート)

さて、ここからがAWS Lambdaの機能に関する年表です。AWS Lambdaの歴史は本記事執筆時点で9年7ヶ月程度になり、2024年11月に10周年を迎えます。

※テーブルは項目名クリックでソートできます。

年月日 概要
2014/11/13 AWS Lambdaがアナウンスされる。Node.jsランタイムとzipファイルによるデプロイパッケージのアップロードをサポート。オブジェクトの変更のAmazon S3イベント通知、 Amazon Kinesisストリームに到着したメッセージ、Amazon DynamoDBのテーブル更新をトリガーにした最大実行タイムアウト1分の自動的なコード実行を提供。
2015/04/08 AWS LambdaがAWS CloudFormationでカスタムリソースとして使用できるようになる。
2015/04/09 AWS LambdaがGeneral Availability(GA)になる。リアルタイム(同期)および非同期イベントの両方をサポートし、リソースポリシーが導入される。
2015/04/09 Amazon SNS通知をトリガーとしてLambda関数を呼び出せるようになる。
2015/04/09 AWS Mobile SDKがAWS Lambdaをサポート。
2015/05/28 Lambda関数のデプロイパッケージ(.zipファイル)を同じリージョンのAmazon S3バケットにアップロードし、バケット名とオブジェクトキー名を指定してLambda関数を作成または更新できるようになる。
2015/06/15 JavaでLambdaコードの作成が可能になる。
2015/07/09 Web、モバイル、IoTアプリケーションからLambda関数を呼び出すためにはAWS SDKが必要だったが、Amazon API Gatewayを使用してREST互換のクライアントからLambda関数を呼び出せるようになる。
2015/07/09 Lambdaコンソールが、サンプルイベントソース設定とサンプルコードを提供する「ブループリント」を提供開始。
2015/07/16 DynamoDB Streamsが一般提供開始され、DynamoDBテーブルのトリガーとしてLambda関数を使用できるようになる。
2015/10/08 Pythonを使用したLambda関数コードの開発が可能になる。
2015/10/08 バージョニング機能が追加され、異なる環境で異なるバージョンのLambda関数を実行できるようになる。
2015/10/08 定期的にコードを実行するスケジュールイベントを設定できるようになる。
2015/10/08 最大実行タイムアウトの上限が1分から5分に延長される。
2016/02/11 Lambda関数をVPC内のリソースにアクセスするように設定できるようになる。
2016/04/07 Node.jsのランタイムv4.3をサポート。
2016/06/23 Lambdaコンソールのロール作成プロセスが簡素化。
2016/11/18 AWS SAMを使用してサーバーレスアプリケーションを定義可能になる。
2016/11/18 環境変数を使用してLambda関数の設定値をコード外で指定できるようになる。
2016/11/30 Amazon Lexと連携してチャットボットを作成できるようになる。
2016/12/01 C#をサポート。
2016/12/01 Amazon CloudFrontイベントに応答してLambda@EdgeでLambda関数を実行可能になる。
2017/03/22 Node.jsのランタイムv6.10をサポート。
2017/04/19 X-Rayを導入し、Lambdaアプリケーションのパフォーマンスの問題を検出、分析、最適化可能になる。
2017/08/11 SAM Local(現SAM CLI)を導入。ローカルでサーバーレスアプリケーションを開発、テスト、分析可能になる。
2017/11/28 エイリアスを使ってトラフィックを切り替える機能と、新バージョンのLambda関数の安全なデプロイをサポート。
2017/11/30 AWS Lambda関数の最大メモリ割り当て上限が1536MBから3008MBに増加。
2017/11/30 新しいLambdaコンソールを導入し、関数コードのデバッグと修正が容易になる。個々の関数に対して同時実行制限を設定可能になる。
2018/01/15 Goと.NET 2.0のランタイムをサポート。
2018/04/02 Node.jsのランタイムバージョン8.10をサポート。
2018/06/28 Amazon Simple Queue Service (Amazon SQS)をイベントソースとしてサポート。
2018/07/09 .NET Core 2.1.0のランタイムをサポート。
2018/09/11 PowerShell Core言語をサポート。
2018/10/10 最大実行タイムアウトの上限が5分から15分に延長される。
2018/10/11 AWS Lambdaコンソールでサーバーレスアプリケーションの管理と監視が可能になる。
2018/10/16 AWS LambdaのService Level Agreement (SLA)がアナウンスされる。
2018/11/16 非同期呼び出しの最大ペイロードサイズが128 KBから256 KBに増加。
2018/11/19 KinesisイベントソースのKinesis Data Streams(KDS)拡張ファンアウトとHTTP/2データ取得機能をサポートするようになる。
2018/11/19 Python 3.7のランタイムをサポート。
2018/11/29 Ruby 2.5のランタイムをサポート。
2018/11/29 Lambdaレイヤーが導入される。ライブラリ、カスタムランタイム、その他の依存関係を関数コードとは別にパッケージ化してデプロイ可能になる。
2018/11/29 カスタムランタイムを構築して、任意のプログラミング言語でLambda関数を実行可能になる。
2018/11/29 Application Load BalancersのターゲットとしてLambda関数を指定可能になる。
2019/04/25 GetLayerVersionByArn APIを使用して、バージョンARNを入力としてレイヤーバージョン情報をダウンロード可能になる。
2019/05/14 Lambdaの実行環境がAmazon Linux 2018.03を使用するアナウンス。
2019/05/15 Node.js 10のランタイムをサポート(Amazon Linux 2を使用)。
2019/06/20 Lambdaコンソールの監視ページにAmazon CloudWatch Logs Insightsからのレポートが含まれるようになる。
2019/09/03 VPCで新しいElastic Network Interface(ENI)を使用開始。関数がスケールアップする際に追加のネットワークインターフェイスを作成する必要がなくなり、起動時間が大幅に改善。
2019/09/23 Amazon DynamoDBおよびAmazon Kinesisイベントソースマッピングのカスタムバッチウィンドウを設定可能になる。
2019/10/31 LambdaコンソールでAWS CodeCommit、GitHubなどと統合された継続的デリバリーパイプラインを持つサーバーレスアプリケーションを作成可能になる。
2019/11/18 Node.js 12、Python 3.8、Java 11のランタイムをサポート。
2019/11/19 Amazon SQS FIFOキューからの読み取りをサポートするイベントソースマッピングが作成可能になる。
2019/11/25 Kinesisストリーム、DynamoDBストリームのParallelization Factorをサポートし、イベントソースマッピングで一度に複数のバッチを処理可能になる。
2019/11/25 Kinesisストリーム、DynamoDBストリームによるイベントソースの障害処理機能をサポート。
2019/11/25 関数の作成や更新時にVPCへ接続されている場合は共有Elastic Network Interface(ENI)を即座に作成可能になる。
2019/11/25 非同期呼び出しの設定オプションを追加。Maximum Retry Attempts(最大再試行回数)やMaximum Event Age(最大イベント有効期間)の設定が可能になる。
2019/11/25 非同期呼び出しの実行結果レコードをSQSキュー、SNSトピック、Lambda関数、EventBridgeイベントバスなどの宛先に送信できるようになる。
2019/11/26 Amazon CloudWatch Metricsのパーセンタイルをサポート。
2019/12/03 関数のバージョンやエイリアスにProvisioned Concurrency(プロビジョニングされた同時実行性)を割り当てるオプションを追加。
2019/12/03 LambdaコンソールでAmazon RDS Proxyを作成可能になる。
2019/12/16 VPCを使用するLambda状態のライフサイクルの更新がアナウンスされる。
2020/01/20 関数がVPCに接続されている場合のReason CodeにStateReasonCodeとLastUpdateStatusReasonCodeを追加。
2020/01/20 VPCを使用するLambda状態のライフサイクルの更新がデフォルトで適用されるようになる。
2020/02/18 全ての関数、エイリアス、バージョンに対してConcurrentExecutionsメトリクスが発行され、AWS Lambda関数の同時実行数をバージョンとエイリアス別に表示および監視できるようになる。
2020/02/19 Ruby 2.7のランタイムをサポート(Amazon Linux 2を使用)。
2020/02/20 Compute Savings PlansにAWS Lambdaが追加される。
2020/03/02 VPCを使用するLambda状態のライフサイクルの更新がすべてのLambda関数に適用される。
2020/03/31 .NET Core 3.1.0のランタイムをサポート。
2020/06/16 Lambda関数にAmazon EFSファイルシステムを接続できるようになる。
2020/06/18 HTTP/2ストリームのバッチウィンドウが設定可能になる。
2020/08/10 AWS LambdaのVPC設定用のIAM条件キー(lambda:VpcIds, lambda:SubnetIds, lambda:SecurityGroupIds)が使用可能になる。
2020/08/12 Java 8とカスタムランタイムをサポート(Amazon Linux 2を使用)。
2020/08/13 LambdaがAmazon Managed Streaming for Apache Kafka (Amazon MSK)をイベントソースとしてサポート。
2020/09/17 AWS LambdaがAWS Step Functionsワークフローを視覚化するためのコンソールサポートを追加。
2020/10/08 Lambdaを運用ツールと統合する新しいAWS Lambda拡張機能がプレビュー公開される。
2020/10/20 AWS LambdaがAWS PrivateLinkをサポート。インタフェース型VPCエンドポイントを経由して、VPCからLambda APIにアクセスできるようになる。
2020/11/05 LambdaがAmazon MQをイベントソースとしてサポート。
2020/11/12 Runtime Logs APIをサポート。Lambda拡張機能が実行環境のログストリームをサブスクライブ可能になる。
2020/11/23 管理者がデプロイ時に署名されたコードのみを受け入れるコード署名が使用できるようになる。
2020/12/01 Lambda関数にコンテナイメージを使用できるようになる。
2020/12/01 AWS Lambda関数の最大メモリ割り当て上限が3008MBから10240MBに増加。
2020/12/15 LambdaがセルフマネージドApache Kafkaをイベントソースとしてサポート。
2021/02/03 Node.js 14のランタイムをサポート(Amazon Linux 2を使用)。
2021/03/02 Lambdaコンソールのパフォーマンスと一貫性の向上を目的にデザインを一新。
2021/05/24 Lambda拡張機能が一般提供開始。Lambdaパートナーによって提供される拡張機能を使用可能になる。
2021/06/29 LambdaがセルフマネージドApache KafkaイベントソースでSASL/PLAIN認証メカニズムをサポート。
2021/07/07 LambdaがAmazon MQ for RabbitMQをイベントソースとしてサポート。
2021/08/16 Python 3.9のランタイムをサポート。
2021/09/29 LambdaがAWS Graviton2プロセッサ用の64ビットARMアーキテクチャ(arm64)をサポート。
2021/11/19 Amazon MSKおよびセルフマネージドApache KafkaイベントソースでmTLS認証をサポート。
2021/11/26 Kinesis、DynamoDB、Amazon SQSイベントソースでイベントフィルタリングをサポート。
2022/02/24 .NET 6のランタイムをサポート。
2022/03/11 LambdaがリソースベースのポリシーでAWS Organizationsの組織に対して権限を付与することをサポート。
2022/03/16 同じAWSアカウントの他のユーザーとテストイベントを共有できるようになる。
2022/03/24 Lambda関数で512MBだったエフェメラルストレージを最大10GBまで拡張できるようになる。
2022/04/06 Lambda関数の専用HTTPSエンドポイントとしてAWS Lambda Function URLs(関数URL)をサポート。
2022/05/12 Node.js 16のランタイムをサポート(Amazon Linux 2を使用)。
2022/07/15 AWS Lambda Powertools for TypeScriptが一般提供開始。
2022/07/19 AWS Lambdaが属性ベースのアクセス制御(ABAC)をサポート。
2022/07/22 IAMポリシー条件使用できるリクエスト元の関数のARNを指定するIAM 条件キー(lambda:SourceFunctionArn)を追加。
2022/11/18 Node.js 18のランタイムをサポート(Amazon Linux 2を使用)。
2022/11/28 Lambda SnapStartを使用してJava関数の起動時間を短縮可能になる。
2023/01/24 AWS Lambdaでランタイム管理コントロールをサポート。関数が新しいランタイムバージョンに更新されるタイミングを制御できるようになる。
2023/02/09 非同期呼び出し用のCloudWatchメトリクス(AsyncEventsReceived, AsyncEventAge, AsyncEventsDropped)をサポート。
2023/04/07 レスポンスペイロードストリーミングをサポート。6MBを超えるペイロードを含む応答ペイロードを段階的にクライアントにストリーミングできるようになる。
2023/06/07 Ruby 3.2のランタイムをサポート。
2023/07/27 Python 3.11のランタイムをサポート。
2023/10/12 VPCのアウトバウンド接続でインターネットプロトコルバージョン6(IPv6)をサポート。IPv6経由でデュアルスタックVPC(アウトバウンド接続)内のリソースにアクセスできるようになる。
2023/11/09 LambdaがマネージドランタイムおよびコンテナベースイメージとしてAmazon Linux 2023をサポート。
2023/11/15 Node.js 20のランタイムをサポート。
2023/11/17 Java 21のランタイムをサポート。
2023/12/14 Python 3.12のランタイムをサポート。
2024/02/22 .NET 8のランタイムをサポート。
2024/04/04 Ruby 3.3のランタイムをサポート。

現在のAWS Lambdaの機能一覧と概要

ここからは、現在のAWS Lambdaの主要な機能について詳しく解説していきます。 AWS Lambda は、サーバーやインフラストラクチャを管理することなく、コードを実行できるサーバーレスコンピューティングサービスです。

AWS Lambdaは、イベントドリブンな処理や、リソースの自動スケーリングを提供することにより、アプリケーションの開発と運用を効率化します。 また、コードの実行に必要なリソースを自動的に割り当て、使用した分だけ課金されるため、コスト効率の高いソリューションを実現できます。 さらに、AWS Identity and Access Management (IAM) によるアクセス管理と、トランジット中および保存中のデータ暗号化によって高いセキュリティを実現します。 これらの特長に加え、他のAWSサービスとの簡単な統合が可能であり、アプリケーションの迅速な開発と柔軟な運用を行うことができます。

AWS Lambdaのユースケース

AWS Lambdaは多様なシナリオで活用され、スケーラブルでイベントドリブンなアプリケーションを構築するためにデザインされています。 AWS Lambdaが提供するサーバーレスコンピューティングサービスの主なユースケースには以下のようなものが挙げられます。

  • データ処理
    S3やDynamoDBなどのデータストアに対する変更イベントをトリガーとして、Lambdaでデータの加工や変換を行うことができます。

  • Webアプリケーションのバックエンド
    API GatewayとLambdaを組み合わせることで、サーバーレスなWebアプリケーションのバックエンドを構築できます。

  • イベントドリブンなワークフロー
    Step FunctionsとLambdaを組み合わせることで、複雑なビジネスロジックを持つワークフローを実装できます。

ユースケースの具体例

たとえば、以下のようなユースケースの具体例があります。

  • 画像のサムネイル生成
    S3バケットに画像がアップロードされたことをトリガーとして、Lambdaで自動的にサムネイル画像を生成し、別のS3バケットに保存します。 このようにして、アプリケーションで必要なサムネイル画像を、リアルタイムで生成することができます。

  • Webアプリケーションのバックエンド
    API GatewayとLambdaを使用して、Webアプリケーションのバックエンドを構築します。 Lambdaでビジネスロジックを実装し、API Gatewayから呼び出すことで、フロントエンドとバックエンドを分離し、スケーラブルなアプリケーションを構築できます。

  • IoTデータ処理
    IoTデバイスからのデータをAWS IoTで収集し、Lambdaでリアルタイムに処理することができます。 例えば、センサーデータに基づいて異常検知を行い、アラートを発生させるなどの処理が可能です。

このようにAWS Lambdaは様々なユースケースでサーバーレスコンピューティングサービスを提供しており、イベントドリブンでスケーラブルなアプリケーション設計を可能にします。

AWS Lambdaの概念図

ここから、AWS Lambdaの主な機能や特徴について説明していきますが、その前にAWS Lambdaの全体像を想像しやすくするためにAWS Lambdaの概念図を次に示します。

AWS Lambdaの概念図
AWS Lambdaの概念図

この概念図では、イベントソースからのイベントが同期または非同期の方法でAWS Lambda関数によってどのように処理されるかを示しています。
イベントソースによって、Lambda関数の呼び出し方が同期か非同期かが異なります。同期と非同期の呼び出しを両方サポートするサービスもあれば、一方のみをサポートするサービスもあります。
非同期の場合、AWS Lambdaのイベントキューを介して処理が行われます。

Lambda関数は、Node.js、Python、Java、.NET、Ruby、OS-only Runtimeなど、複数のプログラミングランタイムをサポートしており、これにより異なる言語で記述されたコードを実行できます。

Lambda関数の中で、必要に応じてAWS SDKやAPIを使用してAWSサービスやその他のサービスを呼び出すことができます。
非同期呼び出しの結果は、Amazon SQS、Amazon SNS、AWS Lambda、Amazon EventBridgeなどの指定された宛先に送信することが可能です。

以降では、このようなAWS Lambdaの機能や設定について詳しく紹介していきます。

AWS Lambda関数のランタイム

AWS Lambdaは「ランタイム」によって多種多様なプログラミング言語のサポートを提供しています。
ランタイムは言語固有の環境を提供し、Lambdaと関数間でイベントの呼び出し、コンテキスト情報、そしてレスポンスを中継します。
AWS LambdaのユーザーはAWS Lambdaが提供するマネージドランタイムを利用することも、独自のカスタムランタイムを構築することもできます。

ランタイムの選択は、関数の作成時に行われ、新しいメジャーバージョンへの移行にはランタイム識別子の変更が必要です。AWS Lambdaはメジャーバージョン間の後方互換性を保証しないため、この更新はAWS Lambdaのユーザー主導で行う必要があります。

現在サポートされている主なランタイム

本記事執筆時点で、以下のランタイムがAWS Lambdaでサポートされています。

  • Node.js: nodejs20.xnodejs18.xnodejs16.x
  • Python: python3.12python3.11python3.10python3.9python3.8
  • Java: java21java17java11java8.al2
  • .NET: dotnet8dotnet6
  • Ruby: ruby3.3ruby3.2
  • OS-only Runtime: provided.al2023provided.al2 (OS限定ランタイムでカスタムランタイムを使用することでGoやRustなど他の言語を利用可能)


Lambdaはこれらのランタイムを利用して、x86_64およびarm64アーキテクチャをサポートしています。
ランタイムのアップデートはLambdaによって定期的に管理され、セキュリティパッチやマイナーバージョンリリースのサポートが提供されます。
しかし、ランタイムが非推奨になると、新しいセキュリティパッチの適用や技術的サポートが終了するため、最新またはサポートされているランタイムへの移行が推奨されます。
この情報を踏まえ、Lambda関数の開発や運用においては、使用しているランタイムのサポート状況を常に確認し、必要に応じてランタイムのアップグレード計画を立てることが重要です。

AWS Lambda関数の設定項目

AWS Lambda関数の設定を行う際には、Lambda APIまたはコンソールを利用して、関数のコア機能とオプションをカスタマイズすることができます。
以下に、主要な設定項目とそれに設定可能な値の範囲を説明します。

メモリ (Memory)

関数の実行に必要なメモリ量を設定します。メモリ量はパフォーマンスに直接影響し、割り当てられたメモリ量に応じてCPUとネットワークの帯域幅もスケーリングされます。

設定可能な値: 最小 128MB、最大 10,240MB

一時ストレージ (Ephemeral Storage)

関数の一時的なストレージ容量を増やす方法とタイミングについて学びます。一時ストレージは、関数の実行中に生成される一時ファイルの保存に使用されます。

設定可能な値: 最小 512MB、最大 10,240MB

タイムアウト (Timeout)

関数の最大実行時間を設定します。この値を適切に設定することで、予期しない長時間の実行を防ぎ、コストをコントロールできます。

設定可能な値: 最小 1秒、最大 900秒 (15分)

環境変数 (Environment Variables)

関数コードをポータブルに保ちながら、秘密情報をコードから隔離するために環境変数を使用します。
環境変数は、設定値を関数の設定に格納し、コード内で直接ハードコードすることなく参照できます。

VPC

Lambda関数にVPC設定を適用すると、VPC内のプライベートサブネット内のRDS、EC2インスタンスなどと安全に連携できるようになります。
インターフェイスVPCエンドポイントを使用すれば、公開インターネットを経由せずにLambda関数を呼び出すこともできます。
この設定はセキュリティを強化し、潜在的にパフォーマンスを向上させますが、適切なネットワーク設定が必要です。

ファイルシステム (File System)

Amazon EFSをLambda関数にマウントして、ローカルディレクトリで使用することができます。
ファイルシステムを使用することで、関数コードが安全かつ高い並行性で共有リソースにアクセスし、変更することが可能になります。

エイリアス (Aliases)

クライアントが特定のLambda関数のバージョンを呼び出せるようにエイリアスを設定します。
この設定によって、クライアントの更新を行うことなく、異なるバージョンの関数を指定できます。

バージョン (Versions)

関数のバージョンを公開することで、コードと設定を変更不可能な別のリソースとして保存できます。
この設定によって、安定したデプロイメントとロールバックが容易になります。

レスポンスストリーミング (Response Streaming)

AWS Lambda Function URLs(関数URL)を設定して、レスポンスペイロードをクライアントにストリームで送信できます。
レスポンスストリーミングは、最初のバイトまでの時間を短縮することで、レイテンシに敏感なアプリケーションのパフォーマンスを向上させることができます。また、大きなペイロードを返す関数の構築にも利用できます。

AWS Lambda関数のデプロイ方法

AWS Lambda関数をデプロイする方法には、主に2つの方法があります。
1つめは.zipファイルアーカイブをアップロードする方法、2つめはコンテナイメージを作成してアップロードする方法です。
以下に、それぞれの方法を簡潔に説明します。

.zipファイルアーカイブによるデプロイ

.zipファイルアーカイブには、アプリケーションのコードとその依存関係が含まれます。
Lambdaコンソールまたはツールキットを使用して関数を作成する場合、Lambdaは自動的にコードの.zipファイルアーカイブを作成します。
Lambda API、コマンドラインツール、またはAWS SDKを使用して関数を作成する場合は、デプロイメントパッケージを自ら作成する必要があります。
デプロイメントパッケージをAmazon S3またはローカルマシンからアップロードして、関数のコードをデプロイします。

ファイルのパーミッションは、Lambdaランタイムがデプロイメントパッケージ内のファイルを読み取るために必要です。
非実行ファイルは644のパーミッション、ディレクトリや実行ファイルは755のパーミッションが必要です。

コンテナイメージによるデプロイ

コンテナイメージを使用して、コードと依存関係をパッケージ化することもできます。
Docker CLIなどのツールを使用してコンテナイメージを作成し、Amazon Elastic Container Registry(Amazon ECR)にアップロードします。
関数を呼び出すと、Lambdaはコンテナイメージを実行環境にデプロイします。
Lambdaは関数の初期化コードを実行した後、設定されたエントリポイントを呼び出して関数を実行します。

AWSはLambdaサービスと互換性のあるオープンソースの基本イメージを提供しており、他のコンテナレジストリから別の基本イメージを使用することもできます。
また、ローカルで関数をテストするために、ランタイムインターフェースエミュレータも提供しています。

コンテナイメージとして関数をデプロイする際のパッケージ化やデプロイに追加料金はかかりませんが、Amazon ECRにコンテナイメージを保存する際には関連する料金が発生します。
また、Lambdaは初めてコンテナイメージをダウンロードする際に、イメージを最適化し、暗号化して保存します。
すべての暗号化キーはAWS KMSによって保護され、AWS CloudTrailログを通じてLambdaのキー使用状況を監査することができます。

このように、Lambda関数のデプロイ方法は多岐にわたりますが、プロジェクトのニーズや管理のしやすさに応じて適切な方法を選択することが重要です。

AWS Lambda関数の呼び出し方法とテスト

AWS Lambda関数をデプロイした後、様々な方法で関数を呼び出し、テストすることが可能です。
ここでは、主な呼び出し方法とテストの方法を簡潔に説明し、それらをブログ記事のセクションとしてまとめます。

主な関数の呼び出し方法

  • Lambda コンソール
    Lambda コンソールを使用して、関数を直接テストすることができます。これは開発中やデバッグ時に非常に便利です。

  • AWS SDK
    AWS SDKを利用してプログラムからLambda関数を呼び出します。これはアプリケーションがLambda関数と連携する際に一般的に使用されます。

  • Invoke API
    LambdaのInvoke APIを直接使用して関数を呼び出すことが可能です。Invoke APIよって細かい設定や同期・非同期の制御が可能になります。

  • AWS コマンドラインインターフェース (CLI)
    AWS CLIを使ってコマンドラインから直接関数を呼び出すことができます。これはスクリプトや自動化されたタスクに便利です。

  • AWS Lambda Function URLs(関数URL) HTTPSエンドポイント
    AWS Lambda Function URLsを設定して、専用のHTTP(S)エンドポイントを介して関数を呼び出すことも可能です。このHTTPSエンドポイントによって、HTTPリクエストを受け取るウェブサービスとしてLambda関数を利用できます。ただし、AWS Lambda Function URLsはインターネットから直接アクセス可能であるため、アクセス制御を適切に設定することが重要です。リソースベースのポリシーを利用して特定のIPアドレスからのアクセスのみを許可したり、Cross-Origin Resource Sharing (CORS) を適切に構成してセキュリティリスクを管理する必要があります。

  • イベントソースマッピング
    Amazon DynamoDB、Amazon Kinesis、Amazon SQSなどのAWSサービスからイベントが発生した際に、それをトリガーとしてLambda関数を自動的に呼び出すことができます。イベントソースマッピングによって、ストリームデータの処理やキューからのメッセージ処理を効率的に行うことができます。

呼び出しの同期と非同期

  • 同期呼び出し
    呼び出し元がLambda関数の完了を待ち、結果を受け取ります。関数からのレスポンスをリアルタイムで必要とする場合に適しています。

  • 非同期呼び出し
    イベントはAWS Lambdaのイベントキューを介してLambdaに非同期に渡され、Lambdaがバックグラウンドで処理を行います。呼び出し元は即座にレスポンスを受け取り、処理結果は後で確認します。これはイベント駆動の処理や、処理の遅延が許容される場合に適しています。非同期呼び出しの結果レコードは、Amazon SQS、Amazon SNS、AWS Lambda、Amazon EventBridgeなどの指定された宛先に送信することが可能です。この非同期呼び出しの結果レコードの宛先は、正常に処理されたイベントと、すべての処理試行に失敗したイベントを、それぞれ別々に送信先を指定できます。この非同期呼び出しの結果レコードの宛先では、結果レコードをトリガーにしたイベントドリブンの処理をすることも可能です。

テストとデバッグ

  • コンソールでのテスト
    Lambda コンソールでは、カスタムテストイベントを作成して関数をテストすることができます。コンソールテストをすることで、開発中の関数が想定どおりに動作するか、即座に確認することができます。

  • ローカルでのテスト
    AWS SAM (Serverless Application Model) やローカルの開発環境を用いて、Lambda関数をローカルでテストすることもできます。これはデプロイ前の詳細なデバッグに役立ちます。

AWS Lambdaの多様な呼び出し方法を理解し、適切なテスト手法を取り入れることで、アプリケーションのニーズに合わせて効率的にシステムを構築することが可能です。
開発のフェーズや運用のシナリオに応じて、同期呼び出しや非同期呼び出し、イベントソースマッピングを適切に利用し、豊富なAWSツールとサービスを活用することで、関数のパフォーマンスと信頼性を向上させることができます。

AWS Lambda関数の管理方法

以下の方法とツールを利用することで、AWS Lambda 関数を効率的に管理することができます。

AWS CLIの使用

AWS Command Line Interface(CLI)は、Lambda関数やその他のAWSリソースをコマンドラインから直接管理するためのツールです。
AWS CLIはPythonで記述されたAWS SDK(Boto3)を活用して、AWSサービスと通信します。このツールを使うことで、関数の作成、更新、削除などの管理作業をスクリプト化し、自動化することが可能です。

関数のスケーリング

Lambdaでは、以下の二つの同時実行制御機能を提供しています。

  • 予約同時実行数(Reserved Concurrency)
    特定の関数に対して、予め同時実行数を確保することができます。この設定によって、他の関数の影響を受けずに必要なパフォーマンスを保持することが可能です。

  • プロビジョニングされた同時実行数 (Provisioned Concurrency)
    より応答性を高めるために、事前に初期化された実行環境を確保できます。この設定によって、関数が即時に応答するようになり、スタートアップの遅延(コールドスタート)を減らすことができます。

コード署名

コード署名機能を使うことで、Lambda関数にデプロイされるコードが承認された開発者によって署名されており、改ざんされていないことを保証できます。
これは、関数コードの信頼性と整合性を高めるために重要です。デプロイ時に署名が検証され、検証が失敗した場合にはデプロイがブロックされます。

タグ付けによる整理

AWSのリソースにタグを付けることで、リソースを分類し、管理を容易にします。
たとえば、プロジェクト名、部門名、環境名(開発、テスト、本番など)をタグとして付けることにより、コストセンターの管理やアクセス制御の設定が簡単になります。

レイヤーの使用

Lambdaレイヤーは、共通の依存関係やライブラリを関数間で共有するための機能です。
レイヤーを使用すると、これらの共通コンポーネントを一箇所で管理し、複数のLambda関数で再利用することができます。
この設定によって、デプロイメントパッケージのサイズを小さく保ちながら、開発プロセスを効率化し、コードの重複を減らすことができます。

これらの機能を適切に使用することで、Lambda関数のパフォーマンス、セキュリティ、および管理の効率が向上します。

AWS Lambdaのセキュリティ対策

AWS Lambdaを使用する際もセキュリティは最高の優先事項となります。
AWSのクラウドセキュリティは、最もセキュリティが重視される組織の要件を満たすように設計されています。
AWS Lambdaも他のAWSサービスと同様に、AWSと顧客との共有責任モデルにおいて、AWSはクラウドのインフラストラクチャのセキュリティを担当し、顧客は使用するAWSサービスのセキュリティ設定と管理を担当します。

AWS Lambdaを使用する場合のデータ保護とコンプライアンス

AWS Lambdaを使用する場合のデータ保護とコンプライアンスの実現には、以下のような推奨事項が挙げられます。

  • AWSアカウントの認証情報の保護:AWS IAM Identity CenterやAWS Identity and Access Management (IAM)を設定し、各ユーザーに必要な権限のみを付与します。
  • マルチファクタ認証(MFA)の使用:アカウントのセキュリティを強化します。
  • SSL/TLSを使用した通信:AWSリソースとの通信にはTLS 1.2以上を使用します(推奨はTLS 1.3)。
  • APIおよびユーザー活動のログ記録:AWS CloudTrailを設定し、セキュリティ監視とアクティビティの監視を強化します。
  • AWSの暗号化ソリューションの利用:デフォルトのセキュリティ制御と合わせて使用します。
  • Amazon Macieのような管理セキュリティサービスの利用:Amazon S3に保存された機密データの保護に役立ちます。
  • セキュリティ監視ツールの活用:AWS Security HubやAmazon GuardDutyを使用して、セキュリティの状態を継続的に監視し、脅威を迅速に検出します。

AWS LambdaのIAMとアクセス管理

AWS Lambdaでのアクセス管理にはIAMが中心的な役割を果たします。
IAMを使用することで、管理者はAWSリソースへのアクセスをセキュアに制御できます。
IAMを使用におけるポイントには以下のものが挙げられます。

  • 適切な認証と認可の管理:IAMを使用して、誰がLambdaリソースにアクセスできるかを制御します。
  • ポリシーに基づくアクセス制御:IAMポリシーを使用して、特定のアクションとリソースに対するアクセスを定義します。

転送時と保存時の暗号化

AWS Lambdaも他のAWSサービスと同様にデータ転送時の暗号化とデータ保存時の暗号化によるデータ保護が推奨されます。

  • 転送時の暗号化:Lambda APIエンドポイントはHTTPSを介した安全な接続のみをサポートし、AWS管理コンソール、SDK、APIを通じてLambdaリソースを管理する際にはTLSを使用して通信が暗号化されます。
  • 保存時の暗号化:Lambdaは環境変数を常に暗号化して保存します。デフォルトではAWSが管理するキーを使用しますが、顧客管理キーを使用して暗号化することも可能です。

セキュリティのガバナンスとコンプライアンス

AWS Lambdaを使用する企業は、データの感度や法規制に基づいて、適切なガバナンス戦略を構築する必要があります。
Lambda関数のデプロイにAWS CloudFormation GuardやAWS Configを使用してセキュリティを自動的に評価し、コンプライアンスを維持します。
また、Lambda関数のタグ付けやVPCへの接続なども含まれます。

リジリエンスとスケーリング

  • バージョニングとエイリアス:Lambdaはコードと設定のバージョニングをサポートしており、ブルー/グリーン展開などの高度なデプロイ戦略を実現します。
  • 高可用性:Lambdaは複数のアベイラビリティゾーンにわたって機能を実行し、一部のゾーンでサービス中断が発生した場合でもイベントの処理が可能です。

これらの実践を通じて、AWS Lambdaを安全に活用し、セキュリティリスクを最小限に抑えることができます。定期的なセキュリティ評価と改善により、持続的にシステムの安全性を高めることが推奨されます。

AWS Lambdaのモニタリング

AWS Lambdaでは、Amazon CloudWatchなどのモニタリングサービスと連携してLambda関数のモニタリングとトラブルシューティングを行います。
Lambdaは自動的に関数を監視し、リクエスト数、リクエストごとの実行時間、エラーが発生したリクエスト数などのメトリクスをCloudWatchに発行します。

ラムダコンソールでの関数モニタリング

Lambdaコンソールでは、関数のモニタリングタブを使用して、リクエスト数・実行時間・エラー数などのメトリクスを視覚的に確誌できます。
これらのグラフを利用して、関数のパフォーマンスを迅速に把握し、問題が発生した場合には対応時間を短縮できます。

CloudWatch Logsとの連携

関数の実行に関するログはCloudWatch Logsに自動的に送信されます。
CloudWatch Logsを設定すると、関数の実行に関する詳細な情報をログから取得し、エラーの原因分析やパフォーマンスの問題解析に役立てることができます。

AWS X-Rayによる可視化

AWS X-Rayを利用すると、関数の呼び出しに関連するトレースデータを視視的に確認でき、パフォーマンスのボトルネックやエラーの原因を特定するのに役立ちます。
X-Rayは、サービス間のリクエストをトレースして、アプリケーション全体の動作を理解するのに適しています。

Amazon CloudWatch Lambda Insights

CloudWatch Lambda Insightsを使用すると、関数の実行に関するシステムレベルのメトリクスやログを収集・集約し、Lambda関数の問題を診断するのに役立ちます。
Lambda Insightsは、CPU使用率、メモリ、ディスク、ネットワーク使用状況などのメトリクスを提供し、関数のパフォーマンスをより深く理解するのに役立ちます。

これらのツールとサービスを使用することで、AWS Lambda関数の健全性を維持し、予期せぬダウンタイムやパフォーマンスの低下に迅速に対応できる準備ができます。
各種モニタリングツールは、Lambda関数の運用を効率的に行い、最終的にはアプリケーションの信頼性とカスタマーエクスペリエンスの向上に寄与します。

AWS Lambdaレイヤーによる共通コンポーネントの管理

AWS Lambdaレイヤーは、Lambda 関数のコードとは別に共通のコンポーネントを管理し再利用するための機能です。
レイヤーを使用することで、ライブラリ、カスタムランタイム、その他の依存関係をLambda 関数と分離して管理でき、これらを複数のLambda 関数間で共有することが可能になります。
AWS Lambdaレイヤーを使用すると、関数のデプロイメントパッケージを小さく保ちつつ、コードの再利用性を高めることができます。

Lambda レイヤーは、特定のLambda 関数に関連付けることができ、関数実行時にレイヤーのコンテンツがランタイム環境に追加されます。
開発者は独自のレイヤーを作成するか、他の開発者が公開したレイヤーを利用することができます。

AWS Lambdaレイヤーを使用することで、以下のような利点が得られます。

  • コードの再利用性向上
    同じライブラリやカスタムランタイムを複数のLambda関数で共有できるため、コードの再利用性が向上します。

  • Lambda関数のサイズ削減
    共通の依存関係をレイヤーに移動することで、Lambda関数のサイズを小さくでき、関数のデプロイ時間が短縮されます。

  • 管理の簡素化
    ライブラリやランタイムの更新を一箇所で行うことができるため、管理が簡素化されます。

レイヤーは、AWS Lambda コンソール、AWS CLI、AWS SDKなどを使用して作成および管理できます。作成したレイヤーは、Lambda関数の設定で指定することで、関数から利用できるようになります。
AWS Lambdaレイヤーを活用することで、コードの管理性と再利用性を向上させ、効率的なサーバーレスアプリケーションの開発が可能になります。

AWS Lambdaを呼び出し可能なAWSサービス

AWS Lambdaは、サーバーレスコンピューティングサービスとして、イベントドリブンな処理を実現するための中核的な役割を果たします。
Lambdaの強力な機能の一つが、他のAWSサービスとシームレスに統合し、様々なAWSサービスで発生するイベントをトリガーとしてLambda関数を実行できることです。

ここでは、AWS Lambdaを呼び出し可能な主要なAWSサービスがどのような方法(イベント駆動・非同期・同期・イベントソースマッピングなど)でAWS Lambda関数を呼び出し、どのようなユースケースで使われるのかの説明を表にまとめました。

Service Method of invocation Description
Amazon Alexa イベント駆動
同期呼び出し
AlexaスキルのバックエンドとしてLambda関数を使用し、ユーザーのリクエストに応じたカスタムレスポンスを生成します。
Amazon Managed Streaming for Apache Kafka イベントソースマッピング KafkaトピックのメッセージをLambda関数にストリームし、リアルタイムデータ処理を行います。
Self-managed Apache Kafka イベントソースマッピング 自己管理のApache KafkaクラスターからのメッセージをトリガーにLambda関数を実行し、リアルタイムデータ処理を行います。
Amazon API Gateway イベント駆動
同期呼び出し
REST APIやWebSocket APIを通じてLambda関数を呼び出すことができます。API GatewayはHTTPリクエストをLambda関数に変換し、バックエンドとして機能します。
AWS CloudFormation イベント駆動
非同期呼び出し
カスタムリソースとしてLambda関数を定義し、スタックの作成や更新プロセス中に特定の操作を自動化します。
Amazon CloudFront (Lambda@Edge) イベント駆動
同期呼び出し
CloudFrontのリクエストまたはレスポンス処理時にLambda関数を実行します。このように、グローバルなコンテンツ配信ネットワーク内でのカスタムコード実行が可能になります。
Amazon CloudWatch Logs イベント駆動
非同期呼び出し
CloudWatch LogsのロググループからのログデータをトリガーとしてLambda関数を実行します。このように、ログデータに基づく自動アクションを設定できます。
AWS CodeCommit イベント駆動
非同期呼び出し
リポジトリへのプッシュをトリガーにLambda関数を実行し、コード変更に応じた自動化タスクを行います。
AWS CodePipeline イベント駆動
非同期呼び出し
パイプラインの各ステージでLambda関数を使用してカスタムアクションや検証を行います。
Amazon Cognito イベント駆動
同期呼び出し
ユーザープールイベントに応じてLambda関数を起動します。例えば、ユーザー登録や認証時にカスタムロジックを実行できます。
AWS Config イベント駆動
非同期呼び出し
設定変更やコンプライアンスルールの評価結果をトリガーにLambda関数を実行します。
Amazon Connect イベント駆動
同期呼び出し
Amazon Connectのコンタクトフロー内でLambda関数を呼び出し、動的な顧客対応を実現します。
Amazon DynamoDB イベントソースマッピング テーブルの変更データをストリームとしてLambda関数に送信し、データ変更に応じた処理を自動化します。
Amazon Elastic File System 特別な統合方法 EFSのファイルシステムイベントに応じてLambda関数を起動し、ファイル操作に基づくカスタムアクションを実行します。
Elastic Load Balancing (Application Load Balancer) イベント駆動
同期呼び出し
HTTP(S)リクエストに応じてLambda関数を直接トリガーし、バックエンドサーバーとして機能します。
AWS IoT イベント駆動
非同期呼び出し
IoTデバイスからのメッセージをトリガーにLambda関数を実行し、デバイスデータの処理や分析を行います。
Amazon Kinesis イベントソースマッピング ストリームデータをリアルタイムにLambda関数に送信し、データ処理を行います。
Amazon Data Firehose イベント駆動
同期呼び出し
収集したデータをLambda関数に送信し、データ変換や前処理を行った後、データストアや分析ツールへとロードします。
Amazon Lex イベント駆動
同期呼び出し
チャットボットのインテント処理をLambdaで実行し、ユーザーとの対話を動的に制御します。
Amazon MQ イベントソースマッピング メッセージブローカーからのメッセージをトリガーにLambda関数を実行します。
Amazon Simple Email Service (SES) イベント駆動
非同期呼び出し
受信メールに基づいてLambda関数を実行し、自動的なメール処理や応答を行います。
Amazon Simple Notification Service (SNS) イベント駆動
非同期呼び出し
トピックへのメッセージ公開をトリガーにLambda関数を実行します。
Amazon Simple Queue Service (SQS) イベントソースマッピング メッセージキューからのメッセージをトリガーにLambda関数を実行します。
Amazon Simple Storage Service (S3) イベント駆動
非同期呼び出し
バケット内のオブジェクト操作(作成、更新、削除)をトリガーにLambda関数を実行します。
Amazon Simple Storage Service Batch イベント駆動
同期呼び出し
S3バケット内の大量のオブジェクトに対してLambda関数を同期的に実行し、バッチ処理を行います。
AWS Secrets Manager イベント駆動
同期呼び出し
シークレットのローテーションなどのイベントをLambda関数で処理し、データベース資格情報などの管理を自動化します。
Amazon VPC Lattice イベント駆動
同期呼び出し
VPC Latticeのルーティングルールに基づいて受信したリクエストをLambda関数に転送し、動的なアプリケーション処理を行います。
AWS X-Ray 特別な統合方法 Lambda関数の実行トレースをX-Rayに送信し、パフォーマンスの可視化と分析を行います。
Amazon EventBridge イベント駆動
非同期呼び出し
AWSサービスやカスタムアプリケーションからのイベントをトリガーにLambda関数を実行し、イベント駆動型のアーキテクチャを実現します。
AWS Step Functions イベント駆動
同期呼び出し or 非同期呼び出し
ステートマシンの各ステップでLambda関数を呼び出し、ワークフローの制御や複雑なビジネスロジックの実装を行います。

このように、Lambdaとの統合が可能なAWSサービスはストレージ・データベース・メッセージング・ログ管理・API管理・認証・IoT、デプロイメントなど多岐にわたります。
このような統合によって、アプリケーションの機能を拡張し、運用を自動化し、イノベーティブなソリューションを構築することが可能になります。

AWS Lambdaのベストプラクティス

AWS Lambdaを使用する際のベストプラクティスを効果的に活用することは、セキュリティ・パフォーマンス・コストを最適化します。
以下に、関数のコード・設定・スケーラビリティ・セキュリティなど、主要な領域ごとに主な実践すべきベストプラクティスの概要をまとめました。

関数のコード

  • ハンドラとコアロジックの分離: ユニットテストの容易性を高めるために、Lambdaハンドラからビジネスロジックを分離します。
  • 実行環境の再利用: SDKクライアントやデータベース接続を関数ハンドラの外で初期化し、/tmpディレクトリに静的アセットをキャッシュします。
  • 環境変数の使用: 操作のパラメータを関数に渡す際には、環境変数を活用します。
  • デプロイパッケージのサイズ最小化: 依存関係を厳密に管理し、デプロイパッケージを必要最小限に保ちます。
  • 冪等性の確保: 関数が同じイベントに対して同じ結果を返すように、冪等性のあるコードを書きます。
  • 非公開APIの避過: AWSが非公開で提供するAPIに依存しないようにします。

関数の設定

  • メモリとタイムアウトの最適化: パフォーマンステストを行い、適切なメモリサイズとタイムアウト値を設定します。
  • 最小権限の原則: IAMポリシーを適切に設定し、関数に必要最小限の権限のみを付与します。
  • 不要な関数の削除: 使用していないLambda関数は削除して、リソースの無駄遣いを避けます。

関数のスケーラビリティ

  • スロットリングの管理: タイムアウト、リトライ、ジッター付きのバックオフを適用し、プロビジョニングされた同時実行数を設定することでスロットリングに対する耐性を高めます。

メトリクスとアラーム

  • CloudWatchアラームの活用: Lambda関数のメトリクスを監視し、予期しない動作やパフォーマンスの低下を早期に検出します。
  • AWS Cost Anomaly Detection: 異常なコスト増加を検出するためにCost Anomaly Detectionを使用します。

イベントソースからのストリームの処理

  • バッチサイズの最適化: イベントソースのポーリング頻度とバッチサイズを調整し、効率的なデータ処理を実現します。
  • 冪等性の確保: 関数のコードを冪等に保ち、重複するイベント処理が問題を引き起こさないようにします。

セキュリティ

  • セキュリティ監視の強化: AWS Security HubとAmazon GuardDutyを使用して、Lambda関数のセキュリティ状態を継続的に監視し、脅威を早期に検出します。

このようなベストプラクティスを適切に実装することで、AWS Lambdaを安全かつ効率的に活用できます。
また、定期的にコードやセットアップをレビューし、改善の機会を見つけることも重要です。


<参考資料>
AWS Documentation(AWS Lambda)
Tech Blog with related articles referenced

まとめ

今回はAWS Lambdaの歴史年表を作成して、AWS Lambdaの機能一覧と概要を見てきました。

サーバーレスでフルマネージドなコード実行サービスであるAWS Lambdaは、最初のAWSインフラストラクチャのサービスとして2014年にアナウンス、2015年にGAとなりました。
AWS Lambdaはそれから10年近く経過した現在でも、マイクロサービスアーキテクチャ・分散システム・サーバーレスコンピューティングなどの現代的なコンピューティングにおいて、イベントドリブンやスケジュールドリブンによるサーバーレスなコード実行という非常に重要な機能をアップデートをしながら提供し続けています。

今後も継続的に、AWS Lambdaがどのような機能を提供していくのか、その動向をウォッチしていきたいと思います。

なお、今回の記事の英語版やAWS Lambda以外のサービスも含めたAWSサービス全体の歴史年表もありますので、興味がありましたら御覧ください。

Written by Hidekazu Konishi
Hidekazu Konishi (小西秀和), a Japan AWS Top Engineer and a Japan AWS All Certifications Engineer

執筆者小西秀和

Japan AWS All Certifications Engineer(AWS認定全冠)の知識をベースにAWSクラウドの活用に取り組んでいます。
Amazon.co.jp: 小西 秀和: books, biography, latest update
NRIネットコムBlog: 小西 秀和: 記事一覧