【初心者向け】サーバーレスAWS Lambdaについて

どうも、クラ本部の黒田です。
久しぶりに昨日現場出社してきました。
フルリモートから週2出社することになったらしく、
ちょっと疲れたけど、まあ~、、、たまにはいいでしょう。

さて、今日は、AWS Lambdaについて、アウトプットしていきます。

AWS Lambdaとは?

AWS Lambdaは、開発者がサーバーをプロビジョニングまたは管理することなくコードを実行できるサーバーレスコンピューティングサービスです。Lambdaは高可用性のコンピューティングインフラストラクチャでコードを実行し、サーバーおよびオペレーティングシステムのメンテナンス、容量のプロビジョニングおよび自動スケーリング、ログ記録などの管理を行います。開発者は、サポートされている言語ランタイムにコードを提供するだけで、Lambdaがすべての管理を引き受けます。

イベント駆動型アーキテクチャを構築するための汎用性が高く、AWS Lambdaは毎月10兆回以上の呼び出しを処理し、100万人以上の顧客が使用しています。IT自動化、データ処理パイプライン、マイクロサービスベースのアプリケーション、Webアプリケーション、機械学習ワークロードなど、さまざまなアプリケーションをサポートしています。

Lambdaの特徴

以下は、AWS Lambdaの主要な特徴をまとめました。

特徴 説明
自動スケーリング Lambdaは必要な場合にのみ関数を実行し、自動的にスケーリングします。コードが実行されていないときは料金が発生しません。
課金モデル 消費したコンピュート時間に対してのみ課金されるため、コスト効率が高いです。
環境変数 コードを更新せずに関数の動作を調整できます。
バージョン管理 関数の異なるバージョンを管理でき、本番環境に影響を与えずに新しい機能をテストできます。
コンテナイメージ 大量の依存関係を持つワークロードをデプロイするために、コンテナイメージを使用できます。
レイヤー ライブラリや依存関係をパッケージ化し、デプロイを簡素化します。
Lambda拡張機能 モニタリング、セキュリティ、ガバナンスなどのツールで関数を強化できます。
関数URL 関数に専用のHTTP(S)エンドポイントを追加できます。
レスポンスストリーミング レスポンスペイロードをクライアントにストリーミングで返し、パフォーマンスを向上させます。
同時実行とスケーリングの制御 スケーリングと応答性を細かく制御できます。
コード署名 信頼できるデベロッパーのみが関数を公開していることを検証できます。
プライベートネットワーク設定 プライベートネットワークリソースへのアクセスを提供します。
ファイルシステムへのアクセス Amazon EFSをローカルディレクトリにマウントし、安全にリソースを共有できます。
Lambda SnapStart for Java Javaランタイムの起動パフォーマンスを向上させます。

各機能が提供する利便性や管理の簡素化を理解することで、サーバーレスアーキテクチャの強力なツールとしてLambdaを活用できます。

Lambdaの使用シナリオ

Lambdaは迅速にスケールアップし、要求がないときはゼロにスケールダウンする必要があるアプリケーションシナリオに最適です。以下にLambdaを使用する具体例を示します。

ファイル処理

Amazon S3を使用して、ファイルのアップロード後にLambdaでデータ処理をリアルタイムでトリガーできます。

import json
import boto3

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']
        print(f'Received file {key} from bucket {bucket}')
    return {
        'statusCode': 200,
        'body': json.dumps('File processed')
    }

ストリーム処理

Amazon KinesisとLambdaを組み合わせて、リアルタイムでストリーミングデータを処理します。

import json

def lambda_handler(event, context):
    for record in event['Records']:
        payload = json.loads(record['kinesis']['data'])
        print(f'Processed record: {payload}')
    return {
        'statusCode': 200,
        'body': json.dumps('Stream processed')
    }

ウェブアプリケーション

Lambdaと他のAWSサービスを組み合わせて、スケーラブルなウェブアプリケーションを構築します。

import json

def lambda_handler(event, context):
    response = {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
    return response

IoTバックエンド

Lambdaを使用して、ウェブやモバイル、IoTデバイスからのリクエストを処理するサーバーレスバックエンドを構築します。

import json

def lambda_handler(event, context):
    print(f'Received IoT event: {event}')
    return {
        'statusCode': 200,
        'body': json.dumps('IoT event processed')
    }

モバイルバックエンド

LambdaとAmazon API Gatewayを組み合わせて、APIリクエストを処理するバックエンドを構築します。

import json

def lambda_handler(event, context):
    response = {
        'statusCode': 200,
        'body': json.dumps('Mobile request processed')
    }
    return response

Lambda関数の呼び出しモデル

Lambdaでサポートされている呼び出しモデルには、同期呼び出しと非同期呼び出しの2種類があります。

1. 同期呼び出し

同期呼び出しでは、呼び出し元がLambda関数を直接呼び出します。これは、AWS CLI、SDK、またはAPI Gatewayなどの他のサービスを使用して実行できます。

boto3ライブラリを使用してLambda関数を同期的に呼び出し、結果を表示しています。
以下は、Pythonでの簡単な同期呼び出しの例です。

import boto3

client = boto3.client('lambda')

response = client.invoke(
    FunctionName='my-function',
    InvocationType='RequestResponse',
    Payload=b'{"key": "value"}'
)

print(response['Payload'].read().decode())

2. 非同期呼び出し

非同期呼び出しでは、呼び出し元は関数の応答を待たずに、イベントを内部キューに入れて個別に処理します。

Lambda関数を非同期的に呼び出し、呼び出しの完了を待たずに次の処理に進みます。
以下は、Pythonでの非同期呼び出しの例です。

import boto3

client = boto3.client('lambda')

response = client.invoke(
    FunctionName='my-function',
    InvocationType='Event',
    Payload=b'{"key": "value"}'
)

print("Function invoked asynchronously")

Lambda関数の実行環境

呼び出しが発生すると、ウォームスタートまたはコールドスタートになります。

  • ウォームスタート: 既に実行中の環境がある場合、ペイロードがその環境に直接送信され、関数はすぐに実行されます。
  • コールドスタート: 新しい実行環境が作成され、ランタイムの初期化、関数コードのダウンロード、実行のための環境の準備が行われます。

他のAWSサービスとの組み合わせ

AWS Lambdaは他の多くのAWSサービスと統合され、強力なアーキテクチャを構築できます。以下に、API GatewayとDynamoDBを組み合わせた例を紹介します。

1. API GatewayとLambdaの統合

API Gatewayを使用してHTTPエンドポイントを作成し、Lambda関数を呼び出すことができます。
API Gatewayからのリクエストに応答して「Hello from Lambda!」というメッセージを返します。

import json

def lambda_handler(event, context):
    response = {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
    return response

2. DynamoDBとの連携

DynamoDBを使用してデータを保存し、Lambda関数で操作できます。
DynamoDBテーブルにアイテムを挿入するLambda関数

import json
import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('my-table')

def lambda_handler(event, context):
    table.put_item(
        Item={
            'id': '123',
            'name': 'John Doe'
        }
    )

    response = {
        'statusCode': 200,
        'body': json.dumps('Item inserted')
    }
    return response

まとめ

AWS Lambdaは、サーバーレスアーキテクチャの構築において非常に強力なツールです。同期呼び出しと非同期呼び出しの2つの呼び出しモデルをサポートし、他のAWSサービスと簡単に統合できます。上記の例を参考にして、Lambdaを活用したアプリケーションを構築してみてください。

以上、Lambdaについてのアウトプットでした。
では、また!!

Last modified: 2024-07-04

Author