taiPyの開発ブログ

開発を面白く、生産的に

【Node.js】AWS SDK v3でLambda連携!開発環境構築からJSON取得まで

はじめに

AWS SDK for JavaScript v3 (以下、SDK v3) を使ってLambdaと連携してみたい。そう思ったのが、この記事を書き始めるきっかけでした。

しかし、実際にSDK v3を触ってみると、今まで使っていたSDK v2とは全く異なるAPIに戸惑うばかり。公式ドキュメントやチュートリアルを参考にしながら進めてみても、なかなかスムーズにはいきません。

特に、Lambdaとの連携部分では、いくつかのエラーに遭遇し、解決に時間を要しました。

そこで、この記事では、私が実際にSDK v3とLambdaを連携させる中で詰まった点や、その解決策を、チュートリアル形式でまとめました。

同じようにSDK v3に苦戦している方や、これからSDK v3に挑戦しようと思っている方の参考になれば幸いです。

この記事で得られること

  • AWS SDK for JavaScript v3の基本的な使い方
  • Lambdaとの連携方法
  • 詰まった点とその解決策
  • 実践的なサンプルコード

対象読者

  • AWS SDK for JavaScript v3に興味がある方
  • Lambdaとの連携に興味がある方
  • JavaScriptのスキルアップを目指している方

目次

チュートリアル

全体像の説明

コードを書き始める前に、全体の流れを把握することで、学習効果が格段に向上します。このチュートリアルでは、以下のステップでAWS SDK for JavaScript v3とLambdaの連携を実践していきます。


ゴール:Lambda関数を起動し、期待通りの結果をJSON形式で取得する

  1. ローカル環境でのLambda関数作成: まずは、あなたのPC上でLambda関数のコードを記述します。
  2. AWS環境へのデプロイ: 作成したLambda関数をAWS Lambdaサービスにアップロードします。
  3. SDK v3によるLambda関数呼び出し: AWS SDK for JavaScript v3を使用して、アップロードしたLambda関数を呼び出します。
  4. レスポンスの確認: Lambda関数から返されるレスポンス(JSON形式)が、期待通りのものであることを確認します。

事前準備

このチュートリアルを実行するには、以下の準備が必要です。

  • AWS アカウント
  • AWS CLI のインストールと設定
  • Node.js (バージョン14以上推奨)
  • AWS SDK のインストール

(注意点)筆者端末はMac端末

事前準備でも結構手こずるのでここにメモします。

AWSアカウントとAWS CLIは問題ないかと存じます。しかし、端末にツールやコードをインストールするとき、バージョン管理ツールを使用するのが一般的です。このチュートリアルを始める際、この観点が抜けていたので、後で少し手間取りました。そのためご注意ください。

nvmをインストールし、Node.js、そしてnpmが使用できるようにしましょう。こちらのサイトにまとめられていますので、ご確認ください。Homebrewからのインストールしないのかと疑問思う方もいらっしゃるかもしれませんが、この記事でHomebrewを使ったインストールはサポート範囲外と紹介されています。

nvm(Node Version Manager)を使ってNode.jsをインストールする手順 #Node.js - Qiita

なお、Node.jsのバージョン管理をするソフトはnvm以外にも存在しますが記事を見た限り、nvmを使用するのが得策かと存じます。

プロジェクトの作成

先ほど紹介した4点が終わっていることを前提としてプロジェクトを作っていきましょう。

今回のチュートリアル用のディレクトリ(フォルダ)を作成してください。私は以下のディレクトリを作成しました。なお、user_nameの部分はご自身のユーザー名に置き換えてください。

/Users/user_name/documents/blog_sdk_js

また今回のプロジェクトの初期化を行います。

設定の入力を求められると思いますが、デフォルトのままで大丈夫です。

npm init

ファイル構成が次のようになっていたらOKです。

.
├── node_modules
├── package-lock.json
└── package.json

Lambda 関数の作成

まず、先ほど作ったディレクトリ内で簡単な Lambda 関数を作成します。

1. Lambda 関数の JavaScript スクリプト

lambda_function.js というファイルを作成し、以下のコードを記述します。

exports.handler = async (event) => {
    return {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!')
    };
};

2. ZIP ファイルの作成

Lambda にアップロードするために ZIP 圧縮します。

ZIPに圧縮する理由は、アップロードサイズの制限、効率的なデプロイのためです。ZIP圧縮によりコードサイズを小さくし、Lambdaが効率的に処理できる形でコードをまとめることができます。

コマンドは次のとおりです。

zip function.zip lambda_function.js

コマンドの各部分の説明:

zip:

これは、ファイルをZIPアーカイブに圧縮するためのコマンドラインユーティリティです。

function.zip:

これは、作成されるZIPアーカイブの名前です。ここに圧縮されたlambda_function.jsが格納されます。

lambda_function.js:

これは、圧縮されるファイルの名前です。これは、AWS Lambda関数のコードを含むJavaScriptファイルです。

3. Lambda 関数の作成 (AWS CLI)

自分の環境にアクセスできるようにAWS CLIの設定を行っておきましょう。具体的には次のとおりです。

IAMユーザーの作成とアクセスキーの発行

AWS CLIでAWSリソースにアクセスするには、IAMユーザーのアクセスキーが必要です。まだIAMユーザーを作成していない場合は、AWSマネジメントコンソールで作成し、アクセスキーを発行します。

  • IAMユーザーには、必要な権限を付与してください。
  • アクセスキーは、アクセスキーIDとシークレットアクセスキーの2つから構成されます。シークレットアクセスキーは、発行時にのみ表示されるため、安全に保管してください。

AWS CLIの設定

ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行します。

aws configure

コマンドを実行すると、以下の情報を順番に入力するように求められます。

  • AWS Access Key ID: IAMユーザーのアクセスキーIDを入力します。
  • AWS Secret Access Key: IAMユーザーのシークレットアクセスキーを入力します。
  • Default region name: デフォルトのリージョン名を入力します(例:ap-northeast-1)。ご自身が今回使用するリージョンを選択してください。
  • Default output format: デフォルトの出力形式を入力します(例:json)。ここではjsonと入力してください。

これらの情報を入力すると、AWS CLIの設定が完了します。

設定の確認

以下のコマンドを実行して、設定が正しく行われたことを確認します。

aws sts get-caller-identity

このコマンドを実行して、IAMユーザーの情報が表示されれば、設定は成功です。

補足

  • 複数のAWSアカウントやIAMユーザーを使用する場合は、プロファイルを設定すると便利です。プロファイルを使用すると、aws configureコマンドを複数回実行することなく、異なる設定を切り替えることができます。

Lambda関数をAWSへアップロード

次にAWS CLI を使用して Lambda 関数を作成します。

aws lambda create-function --function-name MyLambdaFunction --runtime nodejs22.x --role your_iam_role --handler lambda_function.handler --zip-file fileb://function.zip
  • aws lambda create-function
    • AWS Lambda関数を作成するためのAWS CLIコマンドです。
  • -function-name MyLambdaFunction
    • 作成するLambda関数の名前を指定します。この例では、「MyLambdaFunction」という名前の関数が作成されます。
  • -runtime nodejs22.x
    • Lambda関数が実行されるランタイム環境を指定します。この例では、Node.js 22.xランタイムが使用されます。AWS Lambdaは、さまざまなプログラミング言語とランタイムをサポートしています。
    • 参考文献:Lambda ランタイム - AWS Lambda
  • -role your_iam_role
    • Lambda関数に付与するIAMロールのARN(Amazon Resource Name)を指定します。IAMロールは、Lambda関数がAWSリソースにアクセスするための権限を定義します。適切な権限を持つIAMロールを指定する必要があります。
    • 今回は特別、Lambda関数で他のAWSリソースにアクセスしないのでAWSLambdaExecute以上のポリシーを割り当てた適当なIAMロールをご利用ください。
    • IAMロールの作り方はこちらです。参考までに。実行ロールを使用した Lambda 関数のアクセス許可の定義 - AWS Lambda なお、ARN形式で割り当てるということも忘れないでください。IAMのページから確認可能です。
  • -handler lambda_function.handler
    • Lambda関数が実行を開始するハンドラー関数を指定します。この例では、「lambda_function.js」ファイルの「handler」関数がハンドラーとして使用されます。
  • -zip-file fileb://function.zip
    • Lambda関数のコードを含むZIPファイルの場所を指定します。この例では、「function.zip」という名前のZIPファイルが使用されます。「fileb://」プレフィックスは、ファイルをバイナリモードでアップロードすることを示します。

AWS SDK を使用した Lambda の実行

次に、AWS SDK を使用して Lambda 関数を実行する JavaScript スクリプトを作成します。このコードはAWS Lambda関数をプログラムから呼び出し、その結果をJSON形式で取得・表示するものです。

1. AWS SDK を使用した実行スクリプト作成

invoke_lambda.js を作成し、以下のコードを記述します。説明は当記事の一番最後にコメント付きで残しているのでご確認ください。

const { LambdaClient, InvokeCommand } = require("@aws-sdk/client-lambda");

const invokeLambda = async () => {
  const client = new LambdaClient();
  const command = new InvokeCommand({
    FunctionName: "MyLambdaFunction",
    InvocationType: "RequestResponse",
  });

  try {
    const response = await client.send(command);
    //Payloadの内容をログに出力
    console.log("Payload:", response.Payload);

    const payloadString = Buffer.from(response.Payload).toString();
    const parsedPayload = JSON.parse(payloadString);
    console.log(parsedPayload); // JSONオブジェクトを出力
  } catch (error) {
    console.error("Error invoking Lambda:", error);
  }
};

invokeLambda();

2. スクリプト実行の事前準備

実行前に必要なパッケージをインストールしましょう。

npm install @aws-sdk/client-lambda

3. スクリプト実行

インストールが完了した後、以下のコマンドを実行して Lambda 関数を呼び出します。

node invoke_lambda.js

4. 実行結果の確認

正常に実行されると、以下のような出力が得られます。

Payload: Uint8ArrayBlobAdapter(50) [Uint8Array] [
  123,  456, 
  // などの数字が続きます.
]
{ statusCode: 200, body: '"Hello from Lambda!"' }

コードの説明

invoke_lambda.js

// AWS SDK for JavaScript v3からLambdaクライアントとInvokeCommandをインポート
const { LambdaClient, InvokeCommand } = require("@aws-sdk/client-lambda");

// 非同期関数invokeLambdaを定義
const invokeLambda = async () => {
  // Lambdaクライアントを初期化
  const client = new LambdaClient();
  // InvokeCommandを作成し、Lambda関数の名前と呼び出しタイプを設定
  const command = new InvokeCommand({
    FunctionName: "MyLambdaFunction", // 呼び出すLambda関数の名前
    InvocationType: "RequestResponse", // 同期的に呼び出す設定
  });

  // try-catchブロックでLambda関数の呼び出しとエラーハンドリング
  try {
    // Lambda関数を呼び出し、レスポンスを待機
    const response = await client.send(command);
    // レスポンスのPayloadをログに出力(バイナリデータ)
    console.log("Payload:", response.Payload);

    // Payload(バイナリデータ)を文字列に変換
    const payloadString = Buffer.from(response.Payload).toString();
    // 文字列をJSONオブジェクトにパース
    const parsedPayload = JSON.parse(payloadString);
    // パースしたJSONオブジェクトをログに出力
    console.log(parsedPayload); // JSONオブジェクトを出力
  } catch (error) {
    // エラーが発生した場合、エラーメッセージをログに出力
    console.error("Error invoking Lambda:", error);
  }
};

// invokeLambda関数を呼び出し、Lambda関数の実行を開始
invokeLambda();

まとめ

この記事では、AWS SDK for JavaScript v3とLambdaの連携について、開発環境の構築から実際のコード実行、そして遭遇したエラーとその解決策まで、実践的なチュートリアル形式で解説しました。

SDK v3の導入は、従来のSDK v2からの移行に戸惑う方も多いかもしれません。しかし、この記事で紹介した手順と解決策を参考にすれば、あなたもスムーズにSDK v3とLambdaの連携を実現できるはずです。

特に、開発環境の構築やIAMロールの設定なども解説しました。また、実際に遭遇したエラーとその解決策を共有することで、同じような問題に直面した方の助けになれば幸いです。

この記事が、あなたのAWS Lambda開発の一助となれば、そして、あなたの開発がよりスムーズで楽しいものになることを心から願っています。

参考文献

AWS SDK for JavaScript v3

SDK の をセットアップする JavaScript - AWS SDK for JavaScript

AWS SDK for JavaScriptはV2とV3の2種類あるぞ! | DevelopersIO