レイヤーを使用して JavaScript 用 AWS SDK の最新バージョンを Node.js Lambda 関数に統合する方法を教えてください。

所要時間3分
0

AWS Lambda ランタイム環境には、最新版 AWS SDK の特定の特微量がありません。JavaScript 用 AWS SDK の最新バージョンを Node.js Lambda 関数に統合したいと思います。

簡単な説明

AWS SDK の最新バージョンを自分の Lambda 関数のデプロイパッケージに統合するにはLambda レイヤーを作成します。次に、そのレイヤーを自分の関数に追加します。Lambda レイヤーを作成して自分の関数に追加するには、AWS コマンドラインインターフェイス (AWS CLI)Lambda コンソールのいずれかを使用します。

注: Node.js 16 バージョン以前の Lambda Node.js ランタイムには、AWS SDK for JavaScript バージョン 2 が含まれていました。Node.js 18 バージョン以降の Lambda Node.js ランタイムには、AWS SDK for JavaScript バージョン 3 が含まれています。詳細については、「AWS Lambda で Node.js 18.x ランタイムが利用可能になりました」を参照してください。

Lambda が使用するランタイムと AWS SDK バージョンの完全なリストについては、「Lambda ランタイム」を参照してください。

注: 次の解決策では、関数のデプロイパッケージのサイズが増大します。Lambda ストレージクォータの詳細については、「Lambda クォータ」を参照してください。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行時にエラーが発生する場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、使用している AWS CLI が最新バージョンであることを確認してください。

(オプション) 関数で使用する AWS SDK のバージョンの確認

関数で使用する AWS SDK のバージョンを確認するには、次の手順を実行します:

注: この方法は、Node.js バージョン 16 以前にのみ使用してください。

  1. Lambda コンソールで関数を作成する

  2. 関数のコードを更新し、関数を呼び出す際に関数で使用する AWS SDK のバージョンを返します:

    const AWS = require('aws-sdk')   
    exports.handler = async (event) => {  
    return AWS.VERSION;  
    };
  3. 関数を呼び出す

  4. 関数で返った AWS SDK のバージョンと AWS SDK ドキュメントに記載されている AWS SDK の最新バージョンを比較します。

AWS SDK の最新バージョンのインストールとパッケージ化

注: デプロイパッケージは、使用する Lambda ランタイムと互換性があることとします。ランタイムには、Lambda ランタイムで指定されているのと同じオペレーティングシステム (OS) を使用するのがベストプラクティスです。例えば、互換性のある Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを起動します。

ローカルでは、Lambda と互換性のある開発環境で、次の手順を実行します:

  1. 次のコマンドを実行して作業ディレクトリを作成します:

    mkdir -p aws-sdk-layer/nodejs
  2. 次のコマンドを実行して作業ディレクトリに変更します:

    cd aws-sdk-layer/nodejs
  3. お使いの Node.js ランタイムバージョンの AWS SDK をインストールします:
    Node.js 16 以前 (AWS SDK バージョン 2)
    AWS SDK バージョン 2 の最新バージョンをインストールするには、Amazon Linux 2 と互換性のあるインスタンスを使用して次のコマンドを実行します:

    npm install aws-sdk

    詳細については、「チュートリアル: Amazon EC2 インスタンスに Node.js を設定する」を参照してください。

    **注:**Lambda リソースを開発する際は、Amazon Linux 2 環境を使用するのがベストプラクティスです。

    \ - または -

    開発に Windows または macOS OS を使用している場合は、Docker を使用して次のコマンドを実行します:

    docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/nodejs:<version>" /bin/sh -c "npm install aws-sdk; exit"

    **注:**このコマンドの実行前には、Docker ウェブサイトで使用しているのが Docker の最新バージョンであることを確認してください。

    Node.js 18 以降 (AWS SDK バージョン 3)

    SDK for JavaScript のインストール」を参照してください。

    Lambda に埋め込まれている SDK バージョンには存在しない AWS SDK コマンドをインポートすると、次のエラーが表示される場合があります:

    「Runtime.UserCodeSyntaxError「名前付きエクスポートが見つかりません」要求されたモジュールは CommonJS モジュールです」

    この場合、自分の関数内で使用できるように特定のパッケージをインストールします。例えば、次のインポートステートメントを使用します:

    import {DeleteQueueCommand} from "@aws-sdk/client-connect";

    この場合、その関数内で特定のパッケージを使用できるように更新済みのクライアントをインストールします。

    例えば、Node.js バージョン 18 以降の Lambda 関数では、次のインポートステートメントを使用します:

    import {DeleteQueueCommand} from "@aws-sdk/client-connect";

    このパッケージが現在の AWS SDK バージョンに含まれていない場合、ログには次のエラーが表示されます:

    ""errorType": "Runtime.UserCodeSyntaxError",
    "errorMessage": "SyntaxError: 名前付きエクスポート「DeleteQueueCommand」が見つかりません。リクエストされたモジュール '@aws-sdk/client-connect' は、CommonJS モジュールであり、すべての module.exports を名前付きエクスポートとしてサポートしているとは限りません。\nCommonJS モジュールは、たとえば :\n\nimport pkg from '@aws-sdk/client-connect';\nconst {DeleteQueueCommand} = pkg;\n"," の \n\nimport pkg を使用すると、デフォルトのエクスポート経由でいつでもインポートできます。

    DeleteQueueCommand パッケージ取り込んでこのエラーを解決するには、最新バージョンのクライアントをインストールします:

    npm install @aws-sdk/client-connect  
    
  4. .zip ファイルを作成して Lambda レイヤーにアップロードします:

    zip -r ../package.zip ../
  5. (オプション) インストールした AWS SDK のバージョンを確認します:

    cat package-lock.json

    次の例のような出力が表示されます:

    {  "requires": true,  
      "lockfileVersion": 1,  
      "dependencies": {  
        "aws-sdk": {  
          "version": "2.888.0",  
    ...

AWS CLI を使用して Lambda レイヤーを作成し、関数に追加する

  1. 使用したい AWS SDK の最新バージョンがある Lambda レイヤーを新たに作成するには、次の publish-layer-version コマンドを実行します:

    **注:**node_sdk を自分のレイヤーの名前に置き換え、My layer をそのレイヤーの説明に置き換えます。また、互換性のあるランタイムの値を、使用するランタイムに置き換え、リージョンを、使用している関数とレイヤーが置かれている AWS リージョンに置き換えます。

    aws lambda publish-layer-version --layer-name node_sdk --description "My layer" --license-info "MIT" --compatible-runtimes --zip-file fileb://../package.zip --region

    次のステップで使用するために、コマンド出力にある LayerVersionArn 値を書き留めておきます。

  2. レイヤーを関数に追加するには、次の update-function-configuration コマンドを実行します:

    **注:**my-function を関数の名前に置き換え、arn:aws:lambda:us-east-2:123456789012:layer:node_sdk:1 を出力の LayerVersionArn 値に置き換え、リージョンをリージョンに置き換えます。

    aws lambda update-function-configuration --function-name my-function --layers arn:aws:lambda:us-east-2:123456789012:layer:node_sdk:1 --region

    詳細については、「Lambda レイヤーの操作」を参照してください。

Lambda コンソールを使用して Lambda レイヤーを作成し、関数に追加します

  1. Lambda コンソールの [レイヤー] ページを開きます。
  2. **[レイヤーの作成]**を選択します。その後、以下の値を入力します:
    [名前] に、新しいレイヤーの名前を入力します。
    (オプション) [説明 - オプション] に、レイヤーの説明を入力します。
    **[.zip ファイルをアップロード]**を選択します。
    **[アップロード]**を選択します。次に、デプロイパッケージの .zip ファイル名を選択します。
    (オプション) [互換性のあるランタイム - オプション] では、互換性のあるランタイムを 1 つ以上選択します。
    (オプション) [ライセンス - オプション] には、レイヤーに該当するソフトウェアライセンス情報を入力します。
  3. [作成] を選択します。
  4. Lambda コンソールで [関数] ページを開き、レイヤーを追加する関数の名前を選択します。
  5. [機能の概要] で、**[レイヤー]**を選択します。
  6. [レイヤーの追加] を選択します。
  7. [レイヤーの選択] で、[カスタムレイヤー] を選択します。そして、次の値を選択します:
    レイヤーの名前
    レイヤーのバージョン
  8. [追加] を選択します。

(オプション) セットアップテスト

(オプション) 自分の関数で使用する AWS SDK のバージョンを確認する」セクションの手順を実行し、自分の関数を呼び出します。この関数は、使用している AWS SDK のバージョンを返します。

使用している AWS SDK の CHANGELOG ファイルにある AWS SDK の最新バージョンを確認することもできます。詳細については、GitHub ウェブサイトの「AWS SDK for JavaScript の Changelog」または「AWS SDK V3 for Javascript の Changelog」を参照してください。

関連情報

Lambda プログラミングモデル

AWS Lambda 関数を使用する際のベストプラクティス

Node.js 用の Lambda デプロイパッケージを作成する方法を教えてください。

AWS公式
AWS公式更新しました 7ヶ月前
コメントはありません

関連するコンテンツ