Traffine I/O

日本語

2022-08-02

AWS Lambda概要

AWS Lambdaとは

AWS Lambdaは、Amazon Web Services(AWS)が提供するサーバーレスのコンピュートサービスであり、サーバーのプロビジョニングや管理なしにコードを実行できます。Lambdaは、着信イベントの数に基づいてアプリケーションを自動的にスケールし、イベント駆動型アーキテクチャや予測できないワークロードを持つアプリケーションに最適なソリューションです。

Lambdaは、Node.js、Python、Java、Go、.NETなどのさまざまなランタイム環境をサポートしており、開発者は好きなプログラミング言語を使用して関数を記述できます。Lambda関数を作成して、Amazon S3、Amazon DynamoDB、Amazon API GatewayなどのさまざまなAWSサービスからのイベントを処理することができます。

AWS Lambdaを使用することで、スケーリング、パッチ適用、監視などの運用的な側面をAWSが処理するため、アプリケーションのロジックに集中することができます。また、Lambdaの料金モデルは、コードの使用するコンピュート時間にのみ支払いをするため、多くのユースケースにおいて費用対効果が高いソリューションとなっています。

Lambdaの機能

AWS Lambdaは、アプリケーションを構築し、スケールするための幅広い機能を提供しています。主な機能やユースケースは以下のとおりです。

  • イベント駆動型処理
    Lambdaは、Amazon S3のデータの変更、DynamoDBテーブルの更新、またはAmazon SQSキュー内のメッセージなど、さまざまなAWSサービスからのイベントに自動的にコードを実行できます。

  • スケーラビリティ
    Lambdaは、着信イベントを処理するために必要なインスタンスの数を管理することで、アプリケーションを自動的にスケールします。これにより、アプリケーションは手動介入なしでトラフィックの急増に効率的に対処できます。

  • マイクロサービスとAPI
    Lambda関数を使用してマイクロサービスを構築し、Amazon API Gatewayを使用してAPIとして公開できます。これにより、リクエストの数に自動的にスケーリングすることができるスケーラブルで費用効果の高いRESTful APIを作成できます。

  • データ処理
    Lambda関数は、リアルタイムおよびバッチデータ処理に使用できます。例えば、Lambdaを使用してログファイルを処理および分析したり、データを変換したり、Amazon KinesisやApache Kafkaなどのストリーミングデータソースのリアルタイムデータ処理を実行したりすることができます。

  • AWSサービスとの統合
    Lambdaは他のAWSサービスとシームレスに統合し、サーバーを管理することなくエンドツーエンドのアプリケーションを構築することができます。Lambdaを使用して、Amazon S3、Amazon DynamoDB、Amazon API Gatewayなどのサービスからのイベントに基づいてコードの実行をトリガーすることができます。

  • カスタムランタイム環境
    AWS Lambdaは、Node.js、Python、Java、Go、.NETなどのさまざまなランタイム環境をサポートしています。また、他の言語や好みの言語の特定のバージョンを使用するためのカスタムランタイムを作成することができます。

  • コスト最適化
    AWS Lambdaを使用すると、コードの実行に使用されるコンピュート時間にのみ支払いをするため、アイドル状態のサーバーリソースに対して支払う必要がなく、多くのアプリケーションでコスト削減ができます。

AWS Lambdaを活用することで、開発者はアプリケーションコードの記述と展開に集中できます。AWSはスケーリング、パッチ適用、監視などの運用的な側面を処理するため、開発プロセスを簡素化し、市場投入までの時間を短縮することができます。

Lambdaの制約事項

AWS Lambdaは、いくつかの利点を提供する一方で、設計および実装時に考慮する必要がある制限事項があります。

  • 実行タイムアウト
    Lambda関数の最大実行時間は15分です。関数によっては処理時間が長くなるため、タスクを小さく分割したり、Amazon EC2やAWS Fargateなどの他のコンピュートオプションを検討する必要があるかもしれません。

  • 関数メモリとCPUパワー
    Lambda関数は、128 MBから10,240 MBまでメモリを割り当てることができます。CPUパワーやネットワーク帯域幅、ディスクI/Oは、メモリ構成に比例して割り当てられます。アプリケーションに必要なリソースが増えた場合は、他のAWSコンピュートサービスを検討する必要があるかもしれません。

  • パッケージサイズの制限
    Lambda関数のデプロイメントパッケージサイズには、50 MB(圧縮)および250 MB(非圧縮)の制限があります。関数に大きな依存関係やライブラリがある場合は、コンテナイメージを使用するか、依存関係を最適化する必要があります。

  • 同時実行数
    AWS Lambdaには、リージョンあたりデフォルトで1,000の同時実行数のソフト制限があります。AWSサポートに制限の引き上げを要求することで、この制限を増やすことができます。ただし、Lambda関数が相互作用する下流サービスに影響を与える可能性があるため、増加した同時実行数の影響を考慮することが重要です。

  • コールドスタートの遅延
    Lambda関数が初めて呼び出される場合、または一定期間活動していなかった場合、新しいコンテナを実行する必要があるため、追加の遅延が発生する場合があります。これを「コールドスタート」と呼びます。コールドスタートの遅延を最小限に抑えるためには、Provisioned Concurrencyを使用するか、定期的に関数を呼び出して「ウォームアップ」させることができます。

  • ステートレスの実行
    Lambda関数は状態レスであるため、呼び出しの間に状態を維持しません。アプリケーションに状態管理が必要な場合は、Amazon DynamoDBやAmazon S3などの外部データストアに状態データを保存する必要があります。

  • 限定されたGPUサポート
    Lambda関数はGPUベースの処理をサポートしていません。GPUリソースが必要な場合は、GPUサポートを備えたAmazon EC2インスタンスまたは機械学習ワークロードの場合はAmazon SageMakerを使用することを検討してください。

AWS Lambdaの制限を理解することは、パフォーマンスが良く、効率的にスケールするサーバーレスアプリケーションを構築するために不可欠です。これらの制限に注意しながら、アプリケーションをこれらの制限内で動作するように設計するか、Lambdaが特定のユースケースに適していない場合は代替のAWSサービスを選択することができます。

AWS Lambdaの価格

AWS Lambdaの価格は、リクエスト数と関数が消費するコンピュート時間の期間に基づいています。このペイアズユーゴーモデルにより、Lambda関数が使用するリソースのみを支払うことで、コストを最適化することができます。

  • リクエスト
    Lambda関数に対して行われた総リクエスト数に対して請求されます。無料枠後、100万リクエストあたり0.20ドルの価格が適用されます。

  • 期間
    Lambda関数の実行にかかるコンピュート時間に応じて請求されます。100ミリ秒のインクリメントで計測されます。価格は、関数に割り当てられたメモリ量に依存します。例えば、128 MBのメモリに対する価格は、100 msあたり0.0000002083ドルです。

また、AWSはLambdaユーザー向けに豊富な無料枠を提供しており、以下を含みます。

  • 1か月あたり100万の無料リクエスト
  • 1か月あたり400,000 GB-秒のコンピュート時間

データ転送コストやLambdaと一緒に使用されるAmazon S3やAmazon DynamoDBなどの他のAWSサービスに関連する追加料金など、その他の料金に関する注意点があります。

AWS Lambdaの詳細な価格分解および特定の要件に基づいてコストを計算するには、AWS Lambda Pricingページをご覧ください。

https://aws.amazon.com/lambda/pricing/

Lambda関数の作成方法

AWS Lambda関数を作成するには、2つの方法があります。コードと依存関係をZIPファイルにパッケージする方法と、コンテナイメージを使用する方法です。両方のアプローチについて、ステップバイステップのガイドを以下に示します。

ZIPファイル

  1. コードの準備

Node.js、Python、Java、Go、.NETなど、サポートされているランタイムを使用してLambda関数を作成します。必要な依存関係をコードと同じディレクトリに含めるようにしてください。

  1. コードと依存関係をパッケージ化

コードと依存関係を含むZIPアーカイブを作成します。関数のエントリーポイント(Node.jsの場合はhandler、Pythonの場合はlambda_functionなど)がアーカイブのルートレベルにあることを確認してください。

  1. ZIPファイルをAWS Lambdaにアップロード
  • AWS Management Consoleを使用する場合: AWS Management ConsoleのLambdaサービスに移動し、「関数の作成」をクリックし、「スクラッチから作成」を選択し、関数名、ランタイム、および実行ロールなどの必要な詳細情報を提供します。「関数コード」セクションで、「.zipファイルをアップロード」を選択し、ZIPアーカイブをアップロードします。

  • AWS CLIを使用する場合: 次のコマンドを実行してAWS CLIを使用してLambda関数を作成できます。

bash
$ aws lambda create-function \
   --function-name YourFunctionName \
   --runtime YourRuntime \
   --role YourExecutionRoleARN \
   --handler YourEntryPoint \
   --zip-file fileb://your-zipped-code.zip
  1. トリガーを構成(オプション)

Amazon S3、Amazon DynamoDB、またはAmazon API Gatewayなどのイベントソースを設定して、Lambda関数をトリガーするようにします。

  1. Lambda関数をテスト

AWS Management Console、AWS CLI、またはSDKを使用してLambda関数を呼び出してテストします。

コンテナイメージ

  1. コードの準備

サポートされているランタイムまたはカスタムランタイムを使用して、Lambda関数を作成します。必要な依存関係をコードと同じディレクトリに含めるようにしてください。

  1. Dockerfileを作成
    プロジェクトディレクトリにDockerfileを作成し、コンテナイメージを定義します。AWSが提供するベースイメージを使用するか、独自のベースイメージを作成してください。Dockerfileで関数のエントリーポイントが正しく指定されていることを確認してください。

  2. コンテナイメージをビルド

プロジェクトディレクトリで以下のコマンドを実行して、コンテナイメージをビルドします。

bash
$ docker build -t your-image-name .
  1. イメージをAmazon Elastic Container Registry(ECR)にプッシュ

Amazon ECRで新しいリポジトリを作成し、DockerクライアントをECRレジストリに認証します。次のコマンドでコンテナイメージをECRレジストリにプッシュします。

bash
$ docker push your-ecr-repository:your-image-tag
  1. コンテナイメージを使用してLambda関数を作成
  • AWS Management Consoleを使用する場合: AWS Management ConsoleのLambdaサービスに移動し、「関数の作成」をクリックし、「コンテナイメージ」を選択し、関数名と実行ロールなどの必要な詳細情報を提供します。「コンテナイメージURI」フィールドにECRイメージURIを入力します。

  • AWS CLIを使用する場合: 次のコマンドを実行してAWS CLIを使用して、コンテナイメージを使用してLambda関数を作成できます。

bash
$ aws lambda create-function \
   --function-name YourFunctionName \
   --role YourExecutionRoleARN \
   --package-type Image \
   --code ImageUri=your-ecr-repository:your-image-tag
  1. トリガーを構成する(オプション)

Amazon S3、Amazon DynamoDB、またはAmazon API Gatewayなどのイベントソースを設定して、Lambda関数をトリガーするようにします。

  1. Lambda関数をテスト

AWS Management Console、AWS CLI、またはSDKを使用してLambda関数を呼び出してテストします。

参考

https://aws.amazon.com/lambda/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!