2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS LambdaとAWS Lambda マネージドインスタンスを使ってみる

2
Last updated at Posted at 2026-02-14

AWS Lambda マネージドインスタンス

2025年11月末にAWS Lambda Managed Instances(Lambda マネージドインスタンス)が発表されました。
Amazon EC2上でAWS Lambda関数を実行できる機能だそうです。
https://aws.amazon.com/jp/blogs/news/introducing-aws-lambda-managed-instances-serverless-simplicity-with-ec2-flexibility/

Lambdaの特性について今一度確認したうえで、移行メリットを確認します。
※2026/02/14に確認しましたが、無料枠ではLambda マネージドインスタンスは使用できない可能性があります。

そもそもAWS Lambdaとは

サーバーレスで関数(コード)を実行できるAWSのコンピューティングサービスです。
※サーバーレス(=自身がサーバーを管理しないという意味)
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html

よくサーバレスAPIとして次項の構成が挙げられるため、まずはこちらを用いてLambdaの特性を確認します。

Lambda × API Gateway

Lambda

Lambda>関数>関数を作成
一から作成を選んで作成。

image.png

サンプルコードを下記のように変更してデプロイします。
※わざとステートレスではない(=状態を持つ)コードを書いてみます。

let counter = 0;

export const handler = async (event) => {
  counter++;
  console.log("current counter:", counter);

  return {
    statusCode: 200,
    body: JSON.stringify({
      counter
    }),
  };
};

API Gateway

API>APIを作成>REST APIを作成

image.png

作成したLambdaをGETで呼び出すようにメソッドを設定します。

image.png

デプロイするとAPI エンドポイントが発行されます。

image.png

エンドポイントを叩くとLambdaが動きます。
今回のものは叩く毎にカウンタが+1され、その値が出力される仕組みになっています。
無題.png
無題.png

サーバーに一切触れることなく、コードの実行を完遂できました。

Lambdaの特性

コードはステートレスである必要がある

1時間放置後に同エンドポイントを叩くと、カウントがリセットされました。
無題.png

これはLambdaの特性によるものです。関数の呼び出し数や実行環境の数に応じて自動でスケーリングが行われるので、同じ実行環境が用意される保証はありません。ゆえにステートレスである必要があります。
https://aws.amazon.com/jp/builders-flash/202308/learn-lambda-function-execution/

初期化が重いとコールドスタートが遅延する

※コールドスタート=コードのロード+実行環境の準備時間の和。実行環境立ち上げ時に発生します。

Lambdaはイベント駆動=トリガー時に都度関数が実行される作りになっているので、利用頻度が低い場合は都度コールドスタートの分だけロスすることになります。
頻度が高くても不意に遭遇することもあります。

長時間処理、常駐処理に向いていない

LambdaのタイムアウトがMAX15分です。
加えてAPI Gatewayのタイムアウトも基本29秒ですので、冒頭の構成だと思い処理は任せられません。

コンテナイメージ実行環境の性能カスタマイズに限界がある

添付画像のような設定はできますが、EC2ほどの豊富さではありません。
image.png

検証

LambdaからLambda マネージドインスタンスに乗せ換えると早くなるのか、確認してみます。

利用するソースコードは以下の通り。わざと初期化に時間がかかるようにしています。

import json, time, os

INIT_TS = time.time()
COLD = True
_boot = sum(i*i for i in range(200_000))

def lambda_handler(event, context):
    global COLD
    t0 = time.time()

    work = sum(i*i for i in range(50_000))

    body = {
        "cold_start": COLD,
        "uptime_ms": int((time.time() - INIT_TS) * 1000),
        "handler_ms": int((time.time() - t0) * 1000),
        "region": os.environ.get("AWS_REGION"),
        "work": work,
    }
    COLD = False
    return {"statusCode": 200, "headers": {"content-type": "application/json"}, "body": json.dumps(body)}

Lambdaに負荷をかける

前述のソースコードでLambda関数を作成して、関数URLを発行します。
後述のLambda マネージドインスタンスがメモリ2GBからなので、こちらも設定で2GBにしておきます。
image.png

また、API Gatewayを使用せずLambdaに直接エンドポイントを付与できる関数URLを使用します。
LambdaとLambda マネージドインスタンスの性能差を直接見るためです。
image.png

heyで負荷をかけます。

xxx:~$ $HOME/go/bin/hey -n 50 -c 5 https://{Lambda関数URL}.lambda-url.ap-northeast-1.on.aws/

Summary:
  Total:        0.8530 secs
  Slowest:      0.6190 secs
  Fastest:      0.0227 secs
  Average:      0.0833 secs
  Requests/sec: 58.6162

  Total data:   5381 bytes
  Size/request: 107 bytes

Response time histogram:
  0.023 [1]     |■
  0.082 [44]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.142 [0]     |
  0.202 [0]     |
  0.261 [0]     |
  0.321 [0]     |
  0.380 [0]     |
  0.440 [0]     |
  0.500 [0]     |
  0.559 [1]     |■
  0.619 [4]     |■■■■


Latency distribution:
  10%% in 0.0244 secs
  25%% in 0.0260 secs
  50%% in 0.0270 secs
  75%% in 0.0294 secs
  90%% in 0.5530 secs
  95%% in 0.5938 secs
  0%% in 0.0000 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0232 secs, 0.0000 secs, 0.2331 secs
  DNS-lookup:   0.0214 secs, 0.0000 secs, 0.2136 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0001 secs
  resp wait:    0.0599 secs, 0.0225 secs, 0.3872 secs
  resp read:    0.0001 secs, 0.0000 secs, 0.0003 secs

Status code distribution:
  [200] 50 responses

CloudWatchに5つのログストリームが作成され、それぞれにInitのログが出ていました。
少なくとも5つの実行環境が新規に起動しており、それぞれで初回実行(コールドスタート)が発生していたことが確認できました。

INIT_START Runtime Version: python:3.14.v35	Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:xxx...

image.png

Lambda マネージドインスタンスに負荷をかける

比較用にLambda マネージドインスタンスの方でも同じ負荷を流します。
まずは公式ブログに従ってLambda マネージドインスタンスを設定してみます。
https://aws.amazon.com/jp/blogs/news/introducing-aws-lambda-managed-instances-serverless-simplicity-with-ec2-flexibility/

はじめにキャパシティプロバイダーを作成します。
※作成時にインフラストラクチャ運用者のロールに「ec2:...」が無くエラーになる場合は、別途追加する必要があります。

無題.png

続いてLambda関数を作成します。
その他の設定でLambda マネージドインスタンスにキャパシティプロバイダーの選択肢が追加されているので、これを設定します。

無題.png

関数URLをONにして作成し、通常Lambdaと同じコードをデプロイします。

heyで負荷をかけます。

xxx:~$ $HOME/go/bin/hey -n 50 -c 5 https://{Lambdaマネージドインスタンス関数URL}lambda-url.ap-northeast-1.on.aws/

Summary:
  Total:        0.4861 secs
  Slowest:      0.2045 secs
  Fastest:      0.0199 secs
  Average:      0.0461 secs
  Requests/sec: 102.8568

  Total data:   6207 bytes
  Size/request: 124 bytes

Response time histogram:
  0.020 [1]     |■
  0.038 [44]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.057 [0]     |
  0.075 [0]     |
  0.094 [0]     |
  0.112 [0]     |
  0.131 [0]     |
  0.149 [0]     |
  0.168 [0]     |
  0.186 [1]     |■
  0.205 [4]     |■■■■


Latency distribution:
  10%% in 0.0243 secs
  25%% in 0.0265 secs
  50%% in 0.0297 secs
  75%% in 0.0348 secs
  90%% in 0.1855 secs
  95%% in 0.2039 secs
  0%% in 0.0000 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0139 secs, 0.0000 secs, 0.1394 secs
  DNS-lookup:   0.0119 secs, 0.0000 secs, 0.1192 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0001 secs
  resp wait:    0.0320 secs, 0.0196 secs, 0.0653 secs
  resp read:    0.0001 secs, 0.0000 secs, 0.0003 secs

Status code distribution:
  [200] 50 responses

数値比較

p50は大差なしでしたが、平均値は明らかに後者の方が早いです。p90ではLambda マネージドインスタンスの方が早く、遅いリクエストが出にくいようでした。

項目 Lambda (2GB) Lambda マネージドインスタンス
Average 83.3 ms 46.1 ms
p50 27.0 ms 29.7 ms
p90 553.0 ms 185.5 ms

AWS Lambda マネージドインスタンスを選ぶ理由はあるか

本題のAWS Lambda マネージドインスタンスは冒頭にもある通り、Amazon EC2上でAWS Lambda関数を実行できる機能です。
公式ドキュメントを確認して実際に触ってみましたが、やはりEC2のパワーを借りられるLambdaであり、LambdaとEC2の境界線を揺るがす第三の選択肢というわけではありませんでした。

個人的見解は以下の通りです。
・呼び出し頻度が高い、あるいは処理速度が求められる場合はLambda マネージドインスタンスを選ぶメリットあり
・日中にポツポツと呼ばれるような軽量な処理であれば、従来のLambdaのままでも良い

「既存のLambdaでは性能面に不満があるが、EC2を運用するほどでもない」という状況があるなら、採用を考えても良いのだと思います。

おまけ:無料プランだとLambda マネージドインスタンスが使えない可能性がある

2026/02/14現在、無料プランだと下記のエラーが発生し、Lambda マネージドインスタンスを設定したLambda関数を新規作成できませんでした。
image.png

作成に失敗したものについて、CloudTrailのイベントレコードに以下の記載がありました。

 "errorMessage": "The specified instance type is not eligible for Free Tier. For a list of Free Tier instance types, run 'describe-instance-types' with the filter 'free-tier-eligible=true'.",
  (省略)
  "instanceType": "m7i.xlarge",

Lambdaマネージドインスタンスは作成時に2GB以上のメモリを選択しなければならず、それを見てAWS側がm7i.xlargeを提供しようとしているようです。
これは無料プランでは選べないインスタンスなのでエラーになってしまいます。潔く有料プランへアップグレードして課金するしかありません。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?