AWS Lambdaを始める: ステップバイステップのチュートリアル

AWS Lambdaは、インフラストラクチャを管理せずにコードを実行できる強力なサーバーレスコンピューティングサービスであり、サーバーのプロビジョニングやメンテナンスを気にすることなくコードの記述に集中できます。

このチュートリアルでは、最初の関数の設定から他のAWSサービスとの統合まで、AWS Lambdaを探求します。

データストリームの処理やAPIの構築を行う場合でも、このガイドはAWS Lambdaを使用したサーバーレス展開の初めの一歩をサポートします。

AWS Lambdaは、Amazon Web Services(AWS)によって提供されるサーバーレスコンピューティングプラットフォームで、開発者がサーバーのプロビジョニングや管理をせずにコードを実行できます。AWS Lambdaは、必要なときだけリソースを動的に割り当てて関数を実行し、事前割り当てされたサーバー容量ではなく使用量に基づいて料金を請求します。

このアプリケーション開発のアプローチは、従来のインフラストラクチャ設定の必要を排除し、コードの記述と展開にのみ集中できるようにします。

AWS Lambdaはイベント駆動型であり、他のAWSサービスからの特定のイベントによってトリガーされるため、応答性が高く、スケーラブルでコスト効率の良いソリューションの構築に最適です。

従来のデプロイメント方法では、サーバーの設定と管理が必要で、スケーリング、更新、パッチ適用を伴います。これらの作業は時間がかかり、高コストであり、 sporadic workloads には効率が悪い場合があります。それに対して、サーバーレスデプロイメントはこれらのオーバーヘッドを排除し、初めから自動スケーリングと高可用性を提供します。

AWS Lambdaの特徴

  • イベント駆動アーキテクチャ:AWS Lambda 関数はデータの変更、HTTP リクエスト、AWS リソースの更新など、イベントに応じて呼び出されます。
  • 複数のランタイムサポート:Lambda は Python、Node.js、Java、Go、Ruby、.NET を含むさまざまなランタイムをサポートしています。開発者は、AWS Lambda Runtime API を使用して独自のランタイムを持ち込むこともでき、多様なユースケースに対応できる柔軟なプラットフォームです。
  • 自動スケーラビリティ:AWS Lambda は需要に応じてアプリケーションを自動的にスケールさせます。単一のイベントを処理するか、同時に数千を処理するかにかかわらず、Lambda は計算リソースを動的に調整します。
  • 従量課金制: コストはリクエストの数と関数の実行時間によって決まります。これにより、前払いの投資が不要になり、使用した分だけ支払うことができます。
  • 統合されたセキュリティ: LambdaはAWSアイデンティティおよびアクセス管理 (IAM)と連携し、細かなアクセス制御と関数と他のAWSサービス間の安全なインタラクションを確保します。

Lambdaの一般的なユースケース

  • データストリームの処理: AWS LambdaはAmazon Kinesisと統合して、リアルタイムでストリーミングデータを処理および分析します。例えば、IoTデバイスを監視したり、ログファイルを動的に処理したりできます。
  • RESTful APIの構築: Lambda関数はAWS API Gatewayと組み合わせて、ウェブおよびモバイルアプリケーションのためのスケーラブルなAPIを作成できます。この設定は、ユーザー認証の処理、データベースのクエリ、または動的コンテンツの生成に一般的に使用されます。
  • ワークフローの自動化: S3、DynamoDB、またはCloudWatchなどのサービスからのイベントに基づいてLambda関数をトリガーすることで、複雑なワークフローを自動化できます。たとえば、S3にアップロードされた画像をリサイズしたり、古いデータベースのレコードを自動的にアーカイブしたりできます。
  • データパイプラインにおけるイベント処理: Lambdaを使用して、S3バケットへの新しいアップロードを処理したり、ストレージの前にデータを変換したり、外部API呼び出しでデータストリームを強化したりするなど、リアルタイムのデータイベントを処理できます。
  • サーバーレスバックエンド処理: Lambda は、データの検証、ETL(抽出、変換、ロード)プロセス、Amazon SNS または SES を介した通知など、バックエンドタスクをオフロードするために一般的に使用されています。

How Does AWS Lambda Work?

AWS Lambda はイベント駆動モデルで動作し、特定のトリガーやイベントに応答してコードを実行します。Lambda の機能の鍵は、他の AWS サービスとの統合および必要に応じて関数を実行できる能力にあります。AWS Lambda の動作メカニクスをステップバイステップで紹介します。

ラムダやその他の主要なAWSサービスを使用したアーキテクチャダイアグラムの例。画像出典:AWS。

1. AWS Lambda関数のトリガー

AWS Lambda関数は、さまざまなAWSサービスや外部システムからのイベントによって開始されます。一般的なイベントソースの例には以下が含まれます:

  • API Gateway:ユーザーがAPI GatewayエンドポイントにHTTPリクエスト(例:GETまたはPOSTリクエスト)を送信すると、Lambdaはリクエストを処理する関数を実行できます。たとえば、データベースにユーザーを作成するためのRESTful APIエンドポイントです。
  • S3 イベント: Lambda 関数は、S3 バケット内のオブジェクトのアップロード、削除、または変更などのアクションに応答することができます。たとえば、S3 バケットに画像がアップロードされた後に画像のリサイズやファイル形式の変換などを行うことができます。
  • DynamoDB ストリーム: DynamoDB テーブルへの変更(挿入、更新、削除など)は、Lambda 関数をトリガーすることができます。たとえば、DynamoDB テーブルに新しい行が追加されたときにアナリティクスパイプラインをトリガーすることができます。
  • カスタムアプリケーション: SDK、CLI、または HTTP リクエストを使用して直接 Lambda 関数を呼び出すことができ、外部システムと統合することができます。

2. 実行環境

イベントがLambda関数をトリガーすると、AWSはコードを実行するための実行環境を自動的に作成します。この環境には次のものが含まれます:

  • 関数コード: 特定のタスクのために書かれたコードです。
  • 割り当てられたリソース: CPUとメモリ(設定可能)は、関数の必要に応じて動的に割り当てられます。
  • 依存関係: デプロイ時に指定された外部ライブラリやパッケージが含まれます。

3. 同時実行性とスケーリング

AWS Lambdaは、関数の複数インスタンスを並行して実行することで自動スケーリングをサポートします。設定なしで透過的にスケールすることができます。以下は同時実行性の仕組みです:

  • 関数が100のイベントを同時に処理する必要がある場合、Lambdaは必要なだけの実行環境を作成します(同時実行数の制限まで)。

4. 他のAWSサービスとの統合

AWS Lambdaは、堅牢なエンドツーエンドソリューションを構築するためにAWSサービスと深く統合されています:

  • データベースとのインタラクション: Lambdaは実行中にDynamoDBやRDSにデータを読み書きできます。
  • メッセージングサービス: Lambdaは、SNS経由で通知をトリガーしたり、メッセージをSQSキューに送信して下流処理を行うことができます。
  • モニタリングとログ: CloudWatchはLambda関数のすべてのログ、メトリクス、エラーの詳細を取得し、パフォーマンスの問題をモニタリングおよびトラブルシューティングできます。

それでは、最初のLambda関数の設定を始めましょう!

AWS Lambdaの設定

事前準備

  • AWS アカウント: アクティブな AWS アカウントを持っていることを確認してください。 こちらでサインアップしてください。
  • IAM ユーザーの設定: AWS Lambda の権限を持つ IAM ユーザーを作成してください。 IAM ガイドに従ってください。

開発環境の設定

  • AWS CLIのインストール: AWS CLIをダウンロードしてインストールします。IAM資格情報を使用して構成します。
  • PythonまたはNode.jsをセットアップ: イントール PythonまたはNode.jsを好みのランタイムに基づいて行います。AWS Lambdaは複数のランタイムをサポートしています。このチュートリアルではPythonランタイムを使用します

ステップ1: AWS Lambdaコンソールにアクセス

  1. AWS Management ConsoleにログインしますAWS Management Console
  2. Lambdaサービスに移動します。

AWSコンソールのナビゲーションダッシュボード。

ナビゲーションメニューでLambdaをクリックします ダッシュボードを表示します:

AWSコンソールのAWS Lambdaダッシュボード。

ステップ2: 新しい関数を作成します

  1. クリック 関数の作成
  2. 「ゼロから作成」を選択します。
  3. 関数の名前を入力します。
  4. ランタイムを選択します(例:Python 3.11)。
  5. ボタンをクリックします。関数の作成 ボタン。

AWS Lambda 関数を新規作成します。

数秒かかります。関数が作成されると、上部に成功メッセージが表示されます。

ステップ 3: 関数コードの記述

簡単なコード編集用の AWS Lambda ブラウザ IDE。

ステップ 4: Lambda 関数のテスト

この時点で、この関数は単に文字列 「Hello from Lambda!」 を返します。

ロジックも依存関係も何もありません。

私たちは、文字列を返す lambda_handler() という名前の関数を含む lambda_function.py というPythonスクリプトを持っています。

今、単にテストボタンをクリックすることでテストできます。

ブラウザでAWS Lambda関数をテストします。

私たちの関数は入力を取らないので、「イベントJSON」を削除できます。イベント名を指定して、Invokeボタンをクリックしてください。

AWS Lambda関数のテストが成功しました。

関数は正常に実行され、メッセージが返されました。

Yayy! AWS Lambdaを使用してサーバーレス関数をデプロイしました。現時点ではあまり多くのことはしていませんが、稼働しています。この関数が呼び出されるたびに、単純な文字列を返します。

AWS Lambdaのイベントトリガー

前述の通り、AWS Lambdaアーキテクチャを使用すると、さまざまなAWSサービスからの特定のイベントに応答して関数をトリガーできるため、ワークフローの自動化やシステムの統合に柔軟に対応できるツールとなります。

S3バケットへのファイルアップロード、DynamoDBテーブルの更新、またはAPI Gatewayを介したAPI呼び出しなどのイベントがLambda関数を呼び出すことができ、リアルタイム処理とスケーラブルな実行を実現します。

1. S3トリガーの設定

  1. S3コンソールに移動します。
  2. S3バケットを選択します。
  3. プロパティの下に、オブジェクトの作成時にLambda関数をトリガーするイベント通知を追加します。AWS S3バケットでイベント通知を作成します。S3でトリガーするLambda関数を選択します。

使用例:

    • S3 にアップロードされた画像の自動リサイズ。
    • ストリーミング用にビデオを複数の解像度や形式に変換。
    • ファイル形式、サイズ、またはメタデータをアップロード時にチェック。
    • アップロードされたドキュメントからテキストを抽出するために AI を使用(例: Amazon Textract 経由)。

2. API Gateway の統合

  1. API Gateway サービスに移動

AWS コンソール内の API Gateway サービスダッシュボード。

  1. 新しい REST API を作成。

API Gateway 経由で新しい REST API を作成。

  1. メソッド(例: POST)を構成して Lambda 関数をトリガーする。

使用例:

    • リアルタイムのレスポンス用のサーバーレス API を構築。
    • ユーザーデータを作成して保存するために Lambda 関数をトリガー。
    • POST リクエストを処理して顧客注文をリアルタイムで検証する。

    • Lambda 関数をトリガーしてデータベースや API からデータをクエリして返す。

AWS Lambdasの展開と監視

AWS Lambda関数の展開は直感的で、AWS Management Consoleを使用した手動展開やAWS CLIを使用した自動展開など、必要に応じて異なる方法で行うことができます。

1. AWSコンソールを使用した手動展開

AWS Management ConsoleはLambda関数の展開のための直感的なWebインターフェースを提供します。この方法は小規模なプロジェクトや迅速な変更に最適です。以下はコンソールを使用してLambda関数を展開する方法です:

  1. 関数を作成または編集:
    • AWS Management Consoleにログインします。
    • AWS Lambdaに移動します。
    • 新しい関数を設定するために関数の作成をクリックするか、更新するために既存の関数を選択します。
  2. コードをアップロード:
    • 「アップロード」を選択し、.zipファイルまたはコンテナイメージを選択します。
    • 小規模な開発には統合コードエディタで関数コードを直接編集できます。
  3. 関数を構成する:
    • 使用ケースに基づいて環境変数、メモリ割り当て、およびタイムアウト制限を定義します。
    • 他のAWSサービスとのやり取りを許可するために必要なアクセス許可をAWS IAMロールを使用して追加します。
  4. 変更を展開:
    • 変更を保存およびアクティブ化するために展開をクリックします。
    • テスト機能を使用して、手動で関数を呼び出し、期待どおりに機能することを検証します。

2. AWS CLIを使用した自動展開 

AWS CLIは、自動化や頻繁な更新のためにLambda関数を展開および更新する効率的な方法です。特に大規模なプロジェクトやCI/CDパイプラインでは、一貫性が確保され、手動エラーが削減されます。

ステップ1 – 展開パッケージの準備

コードと依存関係を .zip ファイルにパッケージ化します。例:

zip -r my-deployment-package.zip .

ステップ2 – CLIを使用して関数を展開

update-function-code コマンドを使用して新しいコードをAWS Lambdaにアップロードします:

aws lambda update-function-code \ --function-name MyFunction \ --zip-file fileb://my-deployment-package.zip

–function-name MyFunction \

–zip-file fileb://my-deployment-package.zip

aws lambda get-function --function-name MyFunction

ステップ3 – 展開の確認

展開後、以下を使用して関数のステータスを確認します:

このコマンドは関数の設定を取得し、デプロイメントを確認します。

CloudWatchによるLambdaの監視

監視は、Lambda関数が効率的に実行され、エラーを適切に処理し、パフォーマンスの期待に応えるために重要です。AWS Lambdaは Amazon CloudWatch と統合されて、監視およびログ記録機能を提供します。

  1. Amazon CloudWatchは自動的にLambda関数の主要なメトリクスを収集し表示します。これらのメトリクスは、関数のパフォーマンスを分析し、問題をトラブルシュートするのに役立ちます。
  2. 監視すべきメトリクス:
  3. 呼び出し: 関数が呼び出された回数を追跡します。トラフィックパターンや使用傾向を把握するのに役立ちます。
  4. エラー: 関数の実行中に発生したエラーの数を表示します。障害率を特定し、デバッグの問題を解決するのに使用します。

所要時間: 関数の実行にかかった時間を測定します。パフォーマンスの最適化やコスト管理に重要です。

  • スロットル: 同時実行制限に達したためにスロットルされた呼び出しの数を表示します。
  • メトリクスへのアクセス:
  • CloudWatchメトリクスコンソールに移動します

選択 Lambda 名前空間のリストから。

詳細なメトリクスを表示するために監視したい関数を選択してください。

AWS Lambda ベストプラクティス

最初の Lambda 関数をデプロイしたので、今後のより複雑なプロジェクトに向けてのベストプラクティスを知っておくことは有用です。このセクションでは、念頭に置いておくべきいくつかのベストプラクティスを提供します。

1. 関数のコールドスタートを最適化する

  • コールドスタートは、Lambda 関数がアイドル状態から呼び出されるときに発生し、AWS が実行環境をプロビジョニングするためにわずかな遅延が発生します。AWS はこのオーバーヘッドを最小限に抑えていますが、コールドスタート時間を短縮するための対策があります:
  • デプロイメントパッケージを小さくする
  • 必要な依存関係のみを含めて、デプロイメントパッケージを軽量化します。

AWS Lambda Layers のようなツールを使用して、共通のライブラリ(例: AWS SDK)を個々のパッケージに含めることなく、複数の関数間で共有します。

可能な場合はコードを圧縮して最小化し、特に JavaScript や Python ベースの関数に適用します。

関数内での重い初期化を避ける

関数ハンドラーの外にリソース集中型の初期化(例:データベース接続、APIクライアント、サードパーティライブラリなど)を移動します。これにより、コードが環境ごとに1度だけ実行され、複数の呼び出しで再利用されます。

プロビジョニングされた並行性を活用

重要な、レイテンシに敏感な関数では、要求を処理するための実行環境を用意するためにプロビジョニングされた並行性を使用します。追加費用がかかりますが、高優先度のワークロードに対して低レイテンシを保証します。

2. 関数を状態を持たないように保つ

状態を持たないことは、サーバーレスアーキテクチャの基本原則であり、アプリケーションがシームレスにスケーリングされることを保証します:

インメモリデータへの依存を避ける

ランバダ関数は一時的であり、その実行環境は一時的であり、複数の呼び出しにわたって持続しない可能性があります。インメモリ変数に依存せず、ステート情報をDynamoDB、S3、またはRedisなどの外部システムに格納してください。

Idempotencyを有効にする

関数を設計して重複イベントを適切に処理します。リクエストのために一意の識別子を使用し、ログやデータベースをチェックして同じイベントが複数回処理されないようにします。

3. 環境変数を使用する

  • 環境変数はLambda関数を構成する安全で便利な方法です:
  • 機密情報を保存する

APIキー、データベース接続文字列、その他の機密情報を環境変数として保存します。AWS Lambdaはこれらの変数を安全に暗号化し、実行時に復号化します。

追加のセキュリティを確保するために、AWS Secrets ManagerやSystems Manager Parameter Storeを使用して動的にシークレットを管理します。

構成管理を簡素化します

環境変数を使用してログレベル、リージョン設定、サードパーティサービスのURLなどの設定を管理します。これによりハードコードされた値が不要となり、関数が環境間(たとえば、開発、ステージング、本番)でより移植性が向上します。

結論

Source:
https://www.datacamp.com/tutorial/aws-lambda