どうも、クラ本部の黒田です。
久しぶりに昨日現場出社してきました。
フルリモートから週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についてのアウトプットでした。
では、また!!