AWS Lambdaの概要と機能を基礎から学ぼう!

eyecatch-aws-lambda-basic
目次

AWS Lambdaとは?

Lambdaの特徴

AWS Lambdaは、Amazon Web Services(AWS)によるサーバーレス・コンピューティングプラットフォームです。Lambdaを使えばインフラストラクチャの管理を気にせずにコードを実行でき(サーバーレス)、様々なイベントに反応するコードを簡単にデプロイすることができます。

Lambdaではコード実装とトリガーとなるイベントを設定するだけで必要に応じて自動的にコードを実行することができます(イベントモデル)。またLambdaはイベントドリブンなアーキテクチャを採用しているため、S3、DynamoDB、SNS、SQS、API Gateway、CloudWatchなど、他のAWSサービスからのイベントをトリガーとして使うことができます。さらにHTTPリクエストやスケジュールされたタスクによってもトリガー可能です。

なおイベントモデルにはプッシュモデル(同期、非同期)とストリームベースがありますが、概要を把握する上ではこれ以上踏み込まなくて大丈夫です!

Lambdaを利用するメリットは大きく2点あります。

  1. スケーリング - Lambdaは需要に応じて自動的にスケーリングするため、リクエストが増えると同時実行数を増やし、リクエストが減るとスケールダウンします。この特性によって、インフラのキャパシティを気にすることなく、アプリケーションを展開できるのが魅力です。また、Lambdaの料金は、実行時間とリソースの消費量に基づいているため、使用していないときのコストは発生しません。(同時実行数には制約あり)
  2. 多言語での開発 - Lambdaは複数のプログラミング言語をサポートしており、Node.js、Python、Ruby、Java、Go、.NET Coreなどを選択できます。このため、プロジェクトに最適な言語を選ぶことができる柔軟性も特徴です。(本記事ではPythonをベースに解説します)

よく比較されるサービスとしてはEC2やFargateのようなコンピューティングサービスがあります。これらは柔軟に実行環境をカスタマイズできますが、構築手順が煩雑化したりパッチ適用やスケーリングなどの運用タスクが発生します。

一方、Lambdaを利用することでそれらの課題を解決し迅速なアプリケーション実行が可能ですが、後述する制約を意識する必要があります。

そのためEC2やFargateは継続的に稼働する処理を実装する場合に利用し、Lambdaは必要に応じて一時的な処理(例えば夜間にデータを取り込みバッチ処理など)を実装する場合に有効といえます。

    実装時の注意点

    AWS Lambdaは多様なユースケースに適しておりサーバーレスアーキテクチャの基盤として広く利用されていますが、下記の注意点を踏まえて活用することが重要です。初めから理解する必要はありませんが、注意した方がいい項目は押さえておくとよいでしょう。

    • ランタイムと実行環境の制約
      Lambda関数には実行時間の上限があり、現時点では最大15分です。そのため、長時間実行が必要なタスクには不向きです。また、Lambda関数にはメモリやディスクスペースなどのリソースに制限があります。最適化がされていないと必要以上の料金がかかる場合があります。
    • 大規模開発が困難
      またLambdaでは関数をZIP形式でアーカイブファイルにまとめられるのですが、容量の制約があるため一定の規模を超えた開発が難しい場合があります。(その対策としてZIP形式ではなくコンテナ形式を採用することも可能ですが、それについては別の記事で説明をします)
    • 状態管理が必要
      Lambdaはステートレスであるため、状態を長期間保持する場合にはDynamoDBやS3などの外部ストレージを利用する必要があります。スタートアップ時間に関しては、初回実行や長時間の非使用時にコールドスタートが発生することがあり、スタートアップ時間が長くなることがあります。
    • デバッグやログの確認が煩雑
      Lambdaでは、Amazon CloudWatchを使用して行います。コードのデバッグはリモート環境で行うため、ローカルでのデバッグが難しくなります。そのためAWS SAMなどリモートデバッグツールやローカル環境のエミュレーションを活用する必要があります。
    • ネットワーク
      既定の実行環境にはパブリックなIPが割り当てられるため、VPC上にあるEC2やRDSインスタンスとは通信ができません。そのためこれらのサービスと連携するにはネットワークを設定する必要があります。

    実装の基礎

    それでは実際にLambdaで関数を作成し、その中身や簡単な使い方について理解をしていきましょう!ここで大事なのはlambda_handler(event, context)の2つの引数であるeventとcontextになります。

    Lambda関数の作成と設定

    作成手順についてはこちらを参照ください。2024年5月現在ではpythonのランタイムは3.12となっていますが、そちらを選んで頂いて問題ありません。作成まで完了しましたら次にお進みください。

    サンプルコードの理解(eventとcontext)

    関数が作成されるとlambda_function.pyに下記のサンプルコードが作成されているかと思います。ここに記載されているlambda_handlerがLambda起動時に始めにコールされるエントリポイント(main関数のようなもの)になります。

    import json
    
    def lambda_handler(event, context):
        # TODO implement
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from Lambda!')
        }

    このサンプルコードをは大変シンプルですが、理解すべきは引数のeventとcontextになります。Lambda実装の際はこの2つの情報を利用することが頻繁にあると思いますので、どのような情報を扱っているかを整理してみます。ちなみにこの2つの引数は名称を変更しても動作しますが、変更してしまうとメンテナンスがしづらくなってしまうのであまりおススメはしません。

    event – イベント情報

    eventパラメータは、Lambda関数がトリガーされた際に送信されるデータを含みます。これは関数を呼び出すさまざまなイベントソースからの入力データです。例えばS3のイベントでトリガーされる場合、下記のようなeventパラメータには下記のような情報が格納されています。

    {
        "Records": [
            {
                "eventVersion": "2.1",
                "eventSource": "aws:s3",
                "awsRegion": "us-east-1",
                "eventTime": "2019-09-03T19:37:27.192Z",
                "s3": {
                    "s3SchemaVersion": "1.0",
                    "configurationId": "testConfigRule",
                    "bucket": {
                        "name": "my-bucket",
                        "ownerIdentity": {
                            "principalId": "EXAMPLE"
                        },
                        "arn": "arn:aws:s3:::my-bucket"
                    },
                    "object": {
                        "key": "test/key",
                        "size": 1024,
                        "eTag": "0123456789abcdef0123456789abcdef",
                        "sequencer": "0A1B2C3D4E5F678901"
                    }
                }
            }
        ]
    }
    

    context – 実行情報

    contextパラメータは、Lambda関数の実行に関するメタデータを含むオブジェクトで、関数の実行環境やランタイムに関する情報を提供します。主要なプロパティには以下のものがあります。

    プロパティ説明
    aws_request_id現在の実行に関連する一意のリクエストIDe0b9b7a1-07e4-11e9-91d2-8325db64a7c9
    log_group_nameLambda関数がログを記録するロググループの名前/aws/lambda/my-function
    log_stream_name現在の実行のログストリームの名前2019/01/15/[$LATEST]e0b9b7a1-07e4-11e9-91d2-8325db64a7c9
    function_nameLambda関数の名前my-function
    memory_limit_in_mbLambda関数に割り当てられているメモリの上限(MB)128
    function_version実行されている関数のバージョン$LATEST
    invoked_function_arn呼び出された関数のAmazonリソースネーム(ARN)arn:aws:lambda:us-west-2:123456789012:function:my-function
    client_contextクライアントアプリケーションからのカスタム情報を含むオブジェクト{ "client": { "app_title": "My App" } }
    identityモバイルアプリケーションからのAWS認証情報を含むオブジェクト{ "cognitoIdentityId": "us-west-2:12345678-1234-1234-1234-123456789012" }

    まとめ

    この記事ではAWS Lambdaと実装のポイントについて説明しましたがいかがだったでしょうか?私も普段の開発でLambdaを利用していますが、100行に満たないコードでAWSの各種サービスを連携したり、バッチ処理を実装したりと大変使い勝手がいいサービスだと感じています!ぜひ実際に触ってみてLambdaの理解を深めてください!

    参考

    AWS Lambda実践ガイド 第2版

    よかったらシェアしてね!
    • URLをコピーしました!
    • URLをコピーしました!

    この記事を書いた人

    Hack Luck Labの管理人hakula(ハクラ)です。2012年にSIerに新卒入社し、SE、新規事業、情シスを担当。その後、ITコンサルを経て、現在はバックエンドエンジニア。過去にはC#、SQL Server、JavaScriptで開発を行い、現在はPython、Rest Framework、Postgresql、Linux、AWSなどを使用しています。ノーコードツールやDX関連も興味あり。「技術は価値を生むために使う」ことが信条で、顧客や組織への貢献を重視しています。

    目次