本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報については、AWS 公式ドキュメントをご参照ください。
サーバーをプロビジョニングまたは管理せずにコードを実行できるようにするコンピューティングサービスです。FaaS(Function as a Service:ファース、エフアース)に分類されるサービスです。
【AWS Black Belt Online Seminar】AWS Lambda Part1(YouTube)(1:02:22)
【AWS Black Belt Online Seminar】AWS Lambda Part2(YouTube)(1:01:17)
【AWS Black Belt Online Seminar】AWS Lambda Part3(YouTube)(1:01:15)
【AWS Black Belt Online Seminar】AWS Lambda Part4(YouTube)(56:28)
チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出すチュートリアル: API Gateway で Lambda を使用するチュートリアル: スケジュールされたイベントでの AWS Lambda の使用
Lambda は Lambda サービスが所有する VPC 内で実行されています。
Lambda を自 VPC に接続すると、Lambda サービスの VPC と自 VPC を接続するために Hyperplane ENI(Elastic Network Interface)を作成し、関数に割り当てます。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtime-environment.html
安全で分離されたランタイムを実行するための環境で、実行環境のライフサイクルは次のようになっています。
生成された Lambda 関数インスタンスは、一定時間後に消失します。消失するまでの間は実行環境が再利用されることがありますが、そうでない場合は、初期化から開始します。
実行頻度が低い関数の実行時に毎回起動時間がかかってしまうことです。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/snapstart.html
https://aws.amazon.com/jp/blogs/news/reducing-java-cold-starts-on-aws-lambda-functions-with-snapstart/
Lambda の起動時のレイテンシー(主に、コールドスタート時間)の最大要因は関数の初期化です。 それを解消するために、関数のバージョンを発行するときに関数を初期化し、その実行環境(メモリとディスク状態)のスナップショットをキャッシュさせ、キャッシュさせたスナップショットから実行環境を再開することで起動時のレイテンシーが短縮される機能です。
SnapStart の使用に追加コストは発生しませんが、利用するには以下の制約があります。
Java 11
のみhttps://docs.aws.amazon.com/ja_jp/lambda/latest/dg/foundation-arch.html
それぞれの違いは、このあたりを参考に。 ARM と x86:その違い:https://www.redhat.com/ja/topics/linux/ARM-vs-x86
Lambda のアクセス権限には、IAM ロール(=実行ロールと呼ばれます。ロールの中には、IAM ポリシーが含まれます)とリソースベースのポリシーがあります。
実行ロールでは、Lambda 関数が他のリソースにアクセスできる権限や実行をまかせるための信頼ポリシーを記述するロールで、Lambda 関数を作成する際には必ず付与します。
リソースポリシーでは、どのサービスやアカウントが Lambda 関数を呼び出せるかを記述します。後述する Push モデルのトリガー(S3, CloudWatch など)を使用する場合に指定します。
Key | IAM ポリシー | リソースポリシー |
Resource | 適用対象のリソースの ARN | 適用対象のリソースの ARN |
Action | オペレーション | オペレーション |
Effect | Allow or Deny | Allow or Deny |
Principal | × | 権限を受け取りたいエンティティ(サービス、アカウント、ユーザ) |
Pull モデルと Push モデルがあります。
Pull モデルは、ポーリング型の実行です。Lambda のイベントソースマッピングで指定されたイベントソースをポーリングして読み取りを行うものです。イベントが一度ストリームまたはキューに格納されるので、処理順序が保証されています。 以下のサービスとの連携が対象です。
Push モデルは、イベント駆動型の実行です。Lambda がイベントソースから直接呼び出されるものです。発生したイベントの実行順序は保証されていません。発生したイベントの順番に処理される場合もありますし、タイミングによっては前後する場合もあります。 イベントソースとなるサービスによって、Lmabda の呼び出しタイプ(同期、非同期)が決まっています。
主に以下のようなサービスがあります。
AWS SDK や CLI から実行する際に、InvocationType
を指定することでコントロールできます。
aws lambda invoke --function-name hoge-function \
--payload .... response.json
# Response
{
"StatusCode": 202,
"ExecutedVersion": "$LATEST",
"FunctionError": "...."
}
aws lambda invoke --function-name hoge-function \
--invocation-type Event --payload .... response.json
# Response
{
"StatusCode": 202
}
aws lambda invoke --function-name hoge-function \
--invocation-type DryRun --payload .... response.json
# Response
{
"StatusCode": 204,
"FunctionError": "...."
}
ランタイムの非推奨化は、2つのフェーズで発生します。
サポート終了がスケジュールされている場合、60 日以内なったら E メールで通知が来るようになります。 また、Trusted Advisor では、非推奨となる 120 日の前チェックが出来ます。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html
Lambda 関数で使用するライブラリとその他の依存関係をパッケージ化できる機能です。関数には最大で 5 つのレイヤーを含めることができます。 レイヤーを使用することで、デプロイパッケージのサイズを削減し、デプロイスピードを速めることができます。
関数をデプロイするには、関数コードと依存関係を含む .zip ファイルまたは、Open Container Initiative (OCI) の仕様に準拠したコンテナーイメージでデプロイできます。
Lambda 関数を作成するには、次の方法があります。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started.html
CLoudFormation で関数をデプロイするには、次の方法があります。
Resources:
Function1:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: !Ref S3Bucket
S3Key: !Ref S3Key
Environment:
Resources:
Function2:
Type: AWS::Lambda::Function
Properties:
Code:
ZipFile: |
import boto3
import json
import os
def lambda_handler(event, context):
:
Resources:
Function3:
Type: AWS::Lambda::Function
Properties:
Code:
ImageUri: !Ref ImageUri
const Function1 = new lambda.Function(
this,
'Function1',
{
functionName: "Function1",
description: 'comment....',
code: lambda.Code.fromAsset(
path.join(__dirname, `${srcLambdaDirBase}/hello_world`)
),
handler: 'index.lambda_handler',
runtime: lambda.Runtime.PYTHON_3_9,
timeout: cdk.<!-- Duration.seconds(300), -->
architecture: lambda.Architecture.ARM_64,
environment: {
LOG_LEVEL: props.lambdaLogLevel ?? 'INFO',
:
},
role: xxxx,
tracing: lambda.Tracing.ACTIVE,
}
);
AWS Serverless Application Model (AWS SAM) でデプロイするには次のようにします。
Function1:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.9
Architectures:
- arm64
AWS Lambda で最大 10 GB のエフェメラルストレージをサポート可能に https://aws.amazon.com/jp/blogs/news/aws-lambda-now-supports-up-to-10-gb-ephemeral-storage/
512 MB ~ 10 GB まで /tmp
領域を作成できます。
ある時点で実行されているリクエストの数のことです。 Lambda 関数の同時実行数は同一アカウントの同一リージョン内につき、1,000 に制限されています。 Lambda の同時実行数の計測は以下のように考えます。
同時実行=(1秒あたりの呼び出し数)x(平均実行時間(秒))
Lambda 関数が平均 10 秒かかり、1 秒あたり 100 個のイベントを発行すると Lambda 関数を 1000 同時に実行することになり、制限ぎりぎりとなります。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-aliases.html
関数を呼び出す場合のバージョン(my-function:1)やエイリアス(my-function:BLUE)を指定できます。 エイリアス作成時にWeighted alias (加重エイリアス)
を指定することで、リクエストの振り分けに重みをつけることができます。 ほとんどのトラフィックを既存バージョンに振り分けて一部のトラフィックを新しいバージョンに振り分けるといったことができます。これにより、新しいバージョンを展開するリスクを軽減できます。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-urls.html
関数を呼び出すための HTTPS エンドポイントが作成できます。
APIGateway を作成しなくても、HTTPS の URL を利用することができます。
https://<url-id>.lambda-url.<region>.on.aws
このエンドポイントには、IAM 認証も付けることができます。 IAM 認証を付けた場合は、AWS Signature Version 4 (SigV4)
による署名が必要です。詳しくは下記ドキュメントを参照してください。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/urls-invocation.html
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-monitoring.html
監視するメトリクスとしては次のようなものがあります。
その他、Lambda 関数のメモリをモニタリングするしたい場合は、次のドキュメントを参照します。 https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-function-memory-usage-monitoring/
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html
主なベストプラクティスは次の通りです。
lambda_handler
の中にロジックを全て記述しないで、メソッド分割する。https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html
主に、同時実行数を引き上げたいなど。