16
2

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 Managed Instances を試してみた

Last updated at Posted at 2025-12-01

はじめに

re:Invent真っ最中のリリース。ざっくり、「LambdaをEC2で動かせる」ということらしいですが、これだけだと何がうれしいのかわかりません。上記リリースを読んでわかる普通のLambdaとの違いは:

  • 広帯域のネットワーキング
  • インスタンスが揮発しないので、共有リソースが長生き
  • ワークロードに適切なハードウェアを選べる(GPUが利用できるかはわからない)
  • 1つのインスタンスが複数の処理を並行で実行できる(通常のLambdaは1つのインスタンスは同時に1つの処理しかしない)

ユースケースに思いを馳せてみると、(WebAPIとして使ってるとして)コンテナを使っている場合はECSを使えばいいので、それ以外のランタイムで動かしていることが前提となるんだろうと思います。個人的に、Lambdaはコストとインフラのことをあまり考えずともスケールするシンプルさが好きなので、さてManaged Instanceはどうかな…という気持ちです。

ということで検証してみます。なお執筆時点(2025-12-01)ではap-northeast-1には降ってきていなかったのでus-east-1で検証しています。

Capacity Providerを定義

Lambdaを動かすEC2を定義する部分はCapacity Providerと呼ばれます。Lambdaに計算資源を供給するもの、ということでよいでしょう。

Screenshot 2025-12-01 at 19.44.13.png

設定できる項目:

Infrastructure operator roleを作成する

ドキュメントによれば、AWSLambdaManagedEC2ResourceOperatorなるマネージドポリシーを利用するといいらしい。てきとうに作っておく。

Screenshot 2025-12-01 at 20.02.26.png

このIAMロールを使うことにして、他はデフォルトっぽい設定で。

作成されたCapacity Provider

Screenshot 2025-12-01 at 20.03.41.png

Capacity Provider自体をモニタリングできる。

関数を作成する

Screenshot 2025-12-01 at 20.05.25.png

Capacity ProviderとLambdaでCPUアーキテクチャが違ったら何が起きるんだろうという悪戯心は見ないふりをして、もろもろ設定。なんだかvCPUとRAMの比率を設定できるらしい。この辺の設定ってCapacity Provider側にあってもいい感じがするんだけど、AWSムズカシイ。雑に動作検証するために関数URLを利用。

concurrencyがどんな感じかわかればとsleepと、負荷をかけるためにちょっとCPUを回す処理を入れてみる。

// index.mjs
function heavyCalculation() {
  let sum = 0;
  for (let i = 0; i < 50_000_000; i++) {
    sum += i;
  }
  return sum;
}

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

export const handler = async (event) => {
  const start = Date.now();

  console.log('Request received:', {
    path: event.rawPath,
    method: event.requestContext?.http?.method,
  });

  const calcResult = heavyCalculation();

  await sleep(2000);

  const end = Date.now();

  const responseBody = {
    message: 'Hello from Lambda Function URL!',
    calcResult,
    elapsedMs: end - start,
  };

  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(responseBody),
  };
};

k6で負荷検証してみると、この関数だと秒間50リクエストを超えたあたりからエラーが発生するようになった(スロットリングが発生しているようす)。vCPUあたりの同時実行数のチューニングが必要なのだろうか?わからない。

なおこんな感じにCapacity Providerのメトリクスを見ることができる。

Screenshot 2025-12-01 at 20.37.53.png

ふとEC2を見てみると…

ちょっと気になってEC2を見てみるとー

Screenshot 2025-12-01 at 20.14.20.png

なんか強いインスタンスが2つ作られている…。これらはそのまま課金されてしまうのか…?こわい…。

Capacity Providerを削除するとー

Screenshot 2025-12-01 at 20.35.48.png

消えた。つまりCapacity Providerを作るとEC2が自動的に作成される(今回のリリースの中身からしてそれはそう)。

Screenshot 2025-12-01 at 20.41.34.png

全部デフォルト設定にしてたけど台数やインスタンスタイプが制御できないのは、実際の運用例などでコスト感がわかるまでは怖い感じがする。たぶんそれでもコストメリットが出るような大規模なケースを想定した機能なのではないかと思いました。Lambdaを大規模に動かしていてコストがかかっている場合に、Managed InstanceとSaving Planなどを組み合わせると安くなることがあるのかもしれません。既存のLambdaコードに大きく手を入れなくて済みそうなのもうれしそうです。

16
2
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
16
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?