[AWS CDK] Graviton2 プロセッサを使用する AWS Lambda 関数(Node.js)を構築する

2023.05.26

こんにちは、CX事業本部 Delivery部の若槻です。

2021年より arm64 ベースの AWS Graviton 2 プロセッサ が搭載された AWS Lambda 関数が利用可能になりました。

Graviton2 は最大 19% の性能向上と最大 20% のコスト削減が可能とのことです。

今回は、arm64 ベースの Lambda 関数(Node.js ランタイム)を AWS CDK で構築し、また x86 ベースの Lambda 関数と性能比較してみました。

やってみた

実装

AWS CDK では Architecture クラスを使って、Lambda 関数で利用するアーキテクチャを指定できます。

現在 Architecture クラスで指定可能なアーキテクチャは次の2つです。

  • ARM_64:ARM 命令セットの 64 bit アーキテクチャ
  • X86_64:x86 命令セットの 64 bit アーキテクチャ

Architecture クラスを aws_lambda_nodejs または aws_lambda コンストラクトクラスの architecture プロパティに指定することで、Lambda 関数で利用するアーキテクチャを指定できます。既定値は X86_64 です。

lib/cdk-sample-app.ts

import {
  aws_lambda_nodejs,
  aws_lambda,
  Duration,
  Stack,
  StackProps,
} from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    new aws_lambda_nodejs.NodejsFunction(this, 'hogeFunc', {
      timeout: Duration.seconds(30),
      // architecture: aws_lambda.Architecture.X86_64, // 既定値は x86
      architecture: aws_lambda.Architecture.ARM_64, // arm64 を利用する場合
    });
  }
}

比較用コード

両アーキテクチャの性能比較を行うため、1から10億までの整数の加算処理を行う以下の Node.js コード を利用します。

lib/cdk-sample-app.hogeFunc.ts

export const handler = async (): Promise<void> => {
  let sum = 0;
  for (let i = 0; i < 1000000000; i++) {
    sum += i;
  }
  console.log(sum);
};

比較してみる

前述のコードを両を実行し、実行時間を比較してみます。

  • x86 アーキテクチャ

x86

Duration: 18388.36 ms	Billed Duration: 18389 ms	Memory Size: 128 MB	Max Memory Used: 61 MB	Init Duration: 150.93 ms
  • arm64 アーキテクチャ

arm64

Duration: 16904.87 ms	Billed Duration: 16905 ms	Memory Size: 128 MB	Max Memory Used: 59 MB	Init Duration: 158.90 ms

(1 - 16904.87 / 18388.36) * 100 = 8.06754925398 となり、arm64 アーキテクチャの Lambda 関数は x86 アーキテクチャの Lambda 関数に比べて、約8%高速化されました。

AWS Graviton 3 プロセッサは?

2022年には、AWS Graviton3 プロセッサを搭載した Amazon EC2 C7g インスタンス の提供が開始されました。

この Graviton3 の arm64 アーキテクチャは Lambda 関数で利用できるようにならないのか気になりましたが、そもそも両者で向いているワークロードが違うようです。Graviton2 プロセッサはアプリケーションサーバーやマイクロサービスなどの Lambda 関数を利用して実装されることが多いワークロードに対しても適している対し、Graviton3 プロセッサは機械学習などメモリインテンシブなワークロードに最適化されているとのことです。

よって Lambda 関数での arm64 アーキテクチャの利用は、引き続き Graviton2 プロセッサを使うことになりそうです。

おわりに

AWS CDK で Graviton2 プロセッサを使用する AWS Lambda 関数(Node.js)を構築し、x86 との性能比較をしてみました。

Infrastructure as Code である AWS CDK でも Lambda 関数のアーキテクチャとして arm64 を指定できることですし、今後は性能向上やコスト削減が期待できる Graviton2 プロセッサを使用しない手は無いのではないでしょうか。

参考

以上