本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。

最新の情報については、AWS 公式ドキュメントをご参照ください。

サーバーをプロビジョニングまたは管理せずにコードを実行できるようにするコンピューティングサービスです。FaaS(Function as a Service:ファース、エフアース)に分類されるサービスです。

【AWS Black Belt Online Seminar】AWS Lambda Part1(YouTube)(1:02:22)

AWS Lambda Part1

【AWS Black Belt Online Seminar】AWS Lambda Part2(YouTube)(1:01:17)

AWS Lambda Part2

【AWS Black Belt Online Seminar】AWS Lambda Part3(YouTube)(1:01:15)

AWS Lambda Part3

【AWS Black Belt Online Seminar】AWS Lambda Part4(YouTube)(56:28)

AWS Lambda Part4

チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出すチュートリアル: API Gateway で Lambda を使用するチュートリアル: スケジュールされたイベントでの AWS Lambda の使用

AWS Lambda サービス概要

AWS Lambda ドキュメント

AWS Lambda よくある質問

AWS Lambda 料金

Lambda は Lambda サービスが所有する VPC 内で実行されています。 lambda-eni.png

Lambda を自 VPC に接続すると、Lambda サービスの VPC と自 VPC を接続するために Hyperplane ENI(Elastic Network Interface)を作成し、関数に割り当てます。

lambda-eni.png

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtime-environment.html

安全で分離されたランタイムを実行するための環境で、実行環境のライフサイクルは次のようになっています。

コールドスタート問題

生成された Lambda 関数インスタンスは、一定時間後に消失します。消失するまでの間は実行環境が再利用されることがありますが、そうでない場合は、初期化から開始します。

実行頻度が低い関数の実行時に毎回起動時間がかかってしまうことです。

SnapStart for Java

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 の使用に追加コストは発生しませんが、利用するには以下の制約があります。

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 など)を使用する場合に指定します。

IAM ロールとリソースベースのポリシーとの相違点

Key

IAM ポリシー

リソースポリシー

Resource

適用対象のリソースの ARN

適用対象のリソースの ARN

Action

オペレーション

オペレーション

Effect

Allow or Deny

Allow or Deny

Principal

×

権限を受け取りたいエンティティ(サービス、アカウント、ユーザ)

Pull モデルと Push モデルがあります。

Pull モデル

Pull モデルは、ポーリング型の実行です。Lambda のイベントソースマッピングで指定されたイベントソースをポーリングして読み取りを行うものです。イベントが一度ストリームまたはキューに格納されるので、処理順序が保証されています。 以下のサービスとの連携が対象です。

Push モデル

Push モデルは、イベント駆動型の実行です。Lambda がイベントソースから直接呼び出されるものです。発生したイベントの実行順序は保証されていません。発生したイベントの順番に処理される場合もありますし、タイミングによっては前後する場合もあります。 イベントソースとなるサービスによって、Lmabda の呼び出しタイプ(同期、非同期)が決まっています。

主に以下のようなサービスがあります。

AWS SDK や CLI から実行する際に、InvocationType を指定することでコントロールできます。

ランタイムの非推奨化は、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

lambda-console

CloudFormation

CLoudFormation で関数をデプロイするには、次の方法があります。

AWS CDK

    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 SAM

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

lambda-alias

関数を呼び出す場合のバージョン(my-function:1)やエイリアス(my-function:BLUE)を指定できます。 エイリアス作成時にWeighted alias (加重エイリアス)を指定することで、リクエストの振り分けに重みをつけることができます。 ほとんどのトラフィックを既存バージョンに振り分けて一部のトラフィックを新しいバージョンに振り分けるといったことができます。これにより、新しいバージョンを展開するリスクを軽減できます。

5-8-AWS-Lambda-function-versions-and-aliases-1024x637.png

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-urls.html

lambda-alias

関数を呼び出すための 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

monitoring-320.jpg

監視するメトリクスとしては次のようなものがあります。

その他、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

主なベストプラクティスは次の通りです。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html

主に、同時実行数を引き上げたいなど。

lambda