

 [AWS SDK for JavaScript V3 API リファレンスガイド](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/)では、 AWS SDK for JavaScript バージョン3 (V3) のすべての API オペレーションについて詳しく説明します。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# API Gateway を使用した Lambdaを呼び出し
<a name="api-gateway-invoking-lambda-example"></a>

Lambda 関数を呼び出すには、Amazon API Gateway を使用します。これは、REST、HTTP、WebSocket APIsに作成、公開、保守、モニタリング、保護するための AWS サービスです。API デベロッパーは、 AWS または他のウェブサービス、および AWS クラウドに保存されているデータにアクセスする APIs を作成できます。API Gateway デベロッパーとして、独自のクライアントアプリケーションで使用するためのAPIを作成できます。詳細については、[[ What is Amazon API Gateway ]](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)( Amazon API Gatewayとは )を参照してください。

AWS Lambda は、サーバーのプロビジョニングや管理を行わずにコードを実行できるようにするコンピューティングサービスです。Lambda 関数は、さまざまなプログラミング言語で作成できます。詳細については AWS Lambda、[「 とは AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)」を参照してください。

この例では、Lambda JavaScript ランタイム API を使用して Lambda 関数を作成します。この例では、さまざまな AWS サービスを呼び出して、特定のユースケースを実行します。例えば、次の図に示すように、組織が 1 周年記念日に従業員を祝福するモバイルテキストメッセージを送信するとします。

![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picPhone.png)


この例は完了までに約 20 分かかります。

この例では、JavaScript ロジックを使用して、このユースケースを実行するソリューションを作成する方法を示しています。例えば、データベースを読み取り、1 年記念日になった従業員を特定する方法、データを処理する方法、およびテキストメッセージを送信する方法について全てLambda 関数を使用して説明します。次に、API Gateway を使用して Rest エンドポイントを使用してこの AWS Lambda 関数を呼び出す方法について説明します。例えば、この curl コマンドを使用して Lambda 関数を呼び出すことができます。:

```
curl -XGET "https://xxxxqjko1o3.execute-api.us-east-1.amazonaws.com/cronstage/employee" 
```

この AWS チュートリアルでは、これらのフィールドを含む Employee という名前の Amazon DynamoDB テーブルを使用します。
+ **id** - 表のプライマリキー。
+ **名前** - 従業員のファーストネーム。
+ **電話** - 従業員の電話番号。
+ **開始日** - 従業員の入社日。

![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/pic00.png)


**重要**  
完了コスト: このドキュメントに含まれる AWS サービスは、 AWS 無料利用枠に含まれています。ただし、この例を完了したら必ずすべてのリソースを終了して料金が発生しないようにしてください。

**アプリケーションを構築するには、**

1. [前提条件を満たします](#api-gateway-invoking-lambda-provision-resources)

1. [AWS リソースを作成する ](#api-gateway-invoking-lambda-provision-resources)

1. [ブラウザスクリプトを準備](#api-gateway-invoking-lambda-browser-script)

1. [Lambda 関数の作成とアップロード](#api-gateway-invoking-lambda-browser-script)

1. [Lambda 関数をデプロイします](#api-gateway-invoking-lambda-deploy-function)

1. [アプリを実行](#api-gateway-invoking-lambda-run)

1. [リソースを削除します](#api-gateway-invoking-lambda-destroy)

## 前提条件タスク
<a name="api-gateway-invoking-lambda-prerequisites"></a>

この例をセットアップして実行するには、まず次のタスクを完了する必要があります。
+ これらの Node TypeScript の例を実行するようにプロジェクト環境を設定し、必要な AWS SDK for JavaScript モジュールとサードパーティーモジュールをインストールします。「[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cross-services/lambda-api-gateway/README.md)」の指示に従います。　
+ ユーザーの認証情報を使用して、共有設定ファイルを作成します。共有認証情報ファイルの提供の詳細については、「AWS SDK とツールのリファレンスガイド」の「[共有設定ファイルおよび認証情報ファイル](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)」を参照してください。

## AWS リソースを作成する
<a name="api-gateway-invoking-lambda-provision-resources"></a>

このチュートリアルでは、以下のリソースが必要です。
+ `Id` という名前のキーと前の図に示されているフィールドを持つ `Employee` という Amazon DynamoDB テーブル。このユースケースでテストする有効な携帯番号を含め、正しいデータを入力してください。詳細については、[テーブルの作成](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)を参照してください。
+ Lambda関数を実行するためのアクセス許可が付与されたIAMロール。
+ Lambda 関数をホストするAmazon S3 バケット。

これらのリソースは手動で作成できますが、このチュートリアルで説明されている CloudFormation ように、 を使用してこれらのリソースをプロビジョニングすることをお勧めします。

### を使用して AWS リソースを作成する CloudFormation
<a name="api-gateway-invoking-lambda-resources-cli"></a>

CloudFormation を使用すると、 AWS インフラストラクチャのデプロイを予測どおりに繰り返し作成およびプロビジョニングできます。詳細については CloudFormation、[AWS CloudFormation 「 ユーザーガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/)」を参照してください。

を使用して CloudFormation スタックを作成するには AWS CLI:

1. [AWS CLI 「 ユーザーガイド](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) AWS CLI 」の手順に従って、 をインストールして設定します。

1. プロジェクトフォルダのルートディレクトリで、`setup.yaml` という名前のファイルを作成し、それに[この GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/setup.yaml) にコンテンツをコピーします。
**注記**  
 CloudFormation テンプレートは、 AWS CDK [GitHub にある ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/resources/cdk/lambda_using_api_gateway)を使用して生成されました。の詳細については AWS CDK、 [AWS Cloud Development Kit (AWS CDK) デベロッパーガイド](https://docs.aws.amazon.com/cdk/latest/guide/)を参照してください。

1. コマンドラインから以下のコマンドを実行し、「*STACK\$1NAME*」をスタックの一意の名前に置き換えます。
**重要**  
スタック名は、 AWS リージョンと AWS アカウント内で一意である必要があります。最大 128 文字まで指定でき、数字とハイフンを使用できます。

   ```
   aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM
   ```

   `create-stack` コマンドパラメータの詳細については、 [AWS CLI Command Reference guide](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) (コマンドリファレンスガイド）および「[CloudFormation ユーザーガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html)」を参照してください。

1. 次に、[表に入力します](#api-gateway-invoking-lambda-resources-create-table) の手順に従ってテーブルに入力します。

### 表に入力します
<a name="api-gateway-invoking-lambda-resources-create-table"></a>

テーブルにデータを入力するには、まず `libs` という名前のディレクトリを作成し、そこに `dynamoClient.js` という名前のファイルを作成し、それに以下の内容を貼り付けます。

```
const { DynamoDBClient } = require ( "@aws-sdk/client-dynamodb" );
// Set the AWS Region.
const REGION = "REGION"; // e.g. "us-east-1"
 // Create an Amazon Lambda service client object.
const dynamoClient = new DynamoDBClient({region:REGION});
module.exports = { dynamoClient };
```

 このコードは[このGitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/libs/dynamoClient.js)で利用できます。

次に、`populate-table.js` というファイルをプロジェクトフォルダのルートディレクトリに作成し、[この GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/populate-table.js) にコンテンツをコピーします。項目の1つについて、`phone` のプロパティの値をE.164形式の有効な携帯電話番号に置き換え、`startDate` の値を今日の日付に置き換えます。

コマンドラインから、以下のコマンドを実行します。

```
node populate-table.js
```

```
const { BatchWriteItemCommand } = require ( "aws-sdk/client-dynamodb" );
const {dynamoClient} = require ( "./libs/dynamoClient" );

// Set the parameters.
export const params = {
  RequestItems: {
    Employees: [
      {
        PutRequest: {
          Item: {
            id: { N: "1" },
            firstName: { S: "Bob" },
            phone: { N: "155555555555654" },
            startDate: { S: "2019-12-20" },
          },
        },
      },
      {
        PutRequest: {
          Item: {
            id: { N: "2" },
            firstName: { S: "Xing" },
            phone: { N: "155555555555653" },
            startDate: { S: "2019-12-17" },
          },
        },
      },
      {
        PutRequest: {
          Item: {
            id: { N: "55" },
            firstName: { S: "Harriette" },
            phone: { N: "155555555555652" },
            startDate: { S: "2019-12-19" },
          },
        },
      },
    ],
  },
};

export const run = async () => {
  try {
    const data = await dbclient.send(new BatchWriteItemCommand(params));
    console.log("Success", data);
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

 このコードは[このGitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/populate-table.js)で利用できます。

## AWS Lambda 関数の作成
<a name="api-gateway-invoking-lambda-browser-script"></a>

### SDK の設定
<a name="api-gateway-invoking-lambda-configure-sdk"></a>

`libs` のディレクトリで `snsClient.js` と `lambdaClient.js` という名前のファイルを作成し、これらのファイルに以下の内容をそれぞれ貼り付けます。

```
const { SNSClient } = require("@aws-sdk/client-sns");
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create an Amazon SNS service client object.
const snsClient = new SNSClient({ region: REGION });
module.exports = { snsClient };
```

 *REGION* を AWS リージョンに置き換えます。このコードは[このGitHubに](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/libs/snsClient.js)で利用できます。

```
const { LambdaClient } = require("@aws-sdk/client-lambda");
// Set the AWS Region.
const REGION = "REGION"; //e.g. "us-east-1"
// Create an Amazon Lambda service client object.
const lambdaClient = new LambdaClient({ region: REGION });
module.exports = { lambdaClient };
```

*REGION* を AWS リージョンに置き換えます。このコードは[このGitHubに](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/libs/lambdaClient.js)で利用できます。

まず、必要な AWS SDK for JavaScript (v3) モジュールとコマンドをインポートします。次に、今日の日付を計算し、パラメータに割り当てます。3 番目に、`ScanCommand` のパラメータを作成します。*TABLE\$1NAME* を、この例の「[AWS リソースを作成する](#api-gateway-invoking-lambda-provision-resources)」セクションで作成したテーブルの名前に置き換えます。

以下のコードスニペットは、このステップを示しています (詳細な例については、[Lambda 関数をバンドルします](#api-gateway-invoking-lambda-full) を参照してください)。

```
const { ScanCommand } = require("@aws-sdk/client-dynamodb");
const { PublishCommand } = require("@aws-sdk/client-sns");
const { snsClient } = require("./libs/snsClient");
const { dynamoClient } = require("./libs/dynamoClient");

// Get today's date.
const today = new Date();
const dd = String(today.getDate()).padStart(2, "0");
const mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0!
const yyyy = today.getFullYear();
const date = `${yyyy}-${mm}-${dd}`;

// Set the parameters for the ScanCommand method.
const params = {
  // Specify which items in the results are returned.
  FilterExpression: "startDate = :topic",
  // Define the expression attribute value, which are substitutes for the values you want to compare.
  ExpressionAttributeValues: {
    ":topic": { S: date },
  },
  // Set the projection expression, which are the attributes that you want.
  ProjectionExpression: "firstName, phone",
  TableName: "Employees",
};
```

### DynamoDB テーブルをスキャンします
<a name="api-gateway-invoking-lambda-scan-table"></a>

まず、Amazon SNS `PublishCommand` を使用してテキストメッセージを公開するために `sendText` と呼ばれる非同期/待機関数を作成します。次に、今日が勤務記念日である従業員の DynamoDB テーブルをスキャンし、`sendText` 関数を呼び出してこれらの従業員にテキストメッセージを送信する `try` ブロックパターンを追加します。エラーが発生した場合は、`catch` ブロックされます。

以下のコードスニペットは、このステップを示しています (詳細な例については、[Lambda 関数をバンドルします](#api-gateway-invoking-lambda-full) を参照してください)。

```
// Helper function to send message using Amazon SNS.
exports.handler = async () => {
  // Helper function to send message using Amazon SNS.
  async function sendText(textParams) {
    try {
      await snsClient.send(new PublishCommand(textParams));
      console.log("Message sent");
    } catch (err) {
      console.log("Error, message not sent ", err);
    }
  }
  try {
    // Scan the table to identify employees with work anniversary today.
    const data = await dynamoClient.send(new ScanCommand(params));
    for (const element of data.Items) {
      const textParams = {
        PhoneNumber: element.phone.N,
        Message: `Hi ${element.firstName.S}; congratulations on your work anniversary!`,
      };
      // Send message using Amazon SNS.
      sendText(textParams);
    }
  } catch (err) {
    console.log("Error, could not scan table ", err);
  }
};
```

### Lambda 関数をバンドルします
<a name="api-gateway-invoking-lambda-full"></a>

このトピックでは、 `mylambdafunction.ts`とこの例に必要な AWS SDK for JavaScript モジュールを というバンドルされたファイルにバンドルする方法について説明します`index.js`。

1. まだの場合は、この例の[前提条件タスク](#api-gateway-invoking-lambda-prerequisites)に従ってwebpackをインストールしてください。
**注記**  
*Webpack* の詳細については、「[Webpack でアプリケーションをバンドルする](webpack.md)」を参照してください。

1. コマンドラインで以下を実行して、この例の JavaScript を `<index.js>` というファイルにバンドルします。

   ```
   webpack mylambdafunction.ts --mode development --target node --devtool false --output-library-target umd -o index.js
   ```
**重要**  
出力の名前が`index.js`であることに注意してください。Lambda関数が機能するには`index.js`ハンドラーが必要です。

1. バンドルされた出力ファイル `index.js` を、`mylambdafunction.zip`という名前の ZIP ファイルに圧縮します。

1. このチュートリアルの[AWS リソースを作成する](#api-gateway-invoking-lambda-provision-resources)トピックで作成したAmazonS3バケットに`mylambdafunction.zip`をアップロードします。

## Lambda 関数をデプロイします
<a name="api-gateway-invoking-lambda-deploy-function"></a>

プロジェクトのルートで、`lambda-function-setup.ts` ファイルを作成し、それに以下の内容をペーストします。

*BUCKET\$1NAME* を Lambda 関数の ZIP バージョンをアップロードした Amazon S3 バケットの名前に置き換えます。*ZIP\$1FILE\$1NAME*を、Lambda関数のZIPバージョンの名前に置き換えます。*ROLE*をこのチュートリアルの[AWS リソースを作成する](#api-gateway-invoking-lambda-provision-resources)トピックで作成した IAM ロールのAmazonリソースナンバー (ARN)に置き換えます。*LAMBDA\$1FUNCTION\$1NAME*をLambda関数名に置き換えます。

```
// Load the required Lambda client and commands.
const {
  CreateFunctionCommand
} = require ( "@aws-sdk/client-lambda" );
const { lambdaClient} = require ( "./libs/lambdaClient.js );

// Set the parameters.
const params = {
  Code: {
    S3Bucket: "BUCKET_NAME", // BUCKET_NAME
    S3Key: "ZIP_FILE_NAME", // ZIP_FILE_NAME
  },
  FunctionName: "LAMBDA_FUNCTION_NAME",
  Handler: "index.handler",
  Role: "IAM_ROLE_ARN", // IAM_ROLE_ARN; e.g., arn:aws:iam::650138640062:role/v3-lambda-tutorial-lambda-role
  Runtime: "nodejs12.x",
  Description:
    "Scans a DynamoDB table of employee details and using Amazon Simple Notification Services (Amazon SNS) to " +
    "send employees an email on each anniversary of their start-date.",
};

const run = async () => {
  try {
    const data = await lambdaClient.send(new CreateFunctionCommand(params));
    console.log("Success", data); // successful response
  } catch (err) {
    console.log("Error", err); // an error occurred
  }
};
run();
```

コマンドラインで次を入力して、Lambda 関数をデプロイします。

```
node lambda-function-setup.ts
```

このコード例は[このGitHubに](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascriptv3/example_code/cross-services/lambda-api-gateway/src/helper-functions/lambda-function-setup.js)で利用可能です。

## Lambda 関数を呼び出すために API Gatewayを設定します
<a name="api-gateway-invoking-lambda-run"></a>

**アプリを構築するには**

1. [rest API を作成する](#api-gateway-invoking-lambda-run-create)

1. [API Gateway メソッドをテストする](#api-gateway-invoking-lambda-run-test)

1. [API Gateway メソッドをデプロイする](#api-gateway-invoking-lambda-run-deploy)

### rest API を作成する
<a name="api-gateway-invoking-lambda-run-create"></a>

API Gateway コンソールを使用して、Lambda 関数のrestエンドポイントを作成できます。完了したら、restful 呼び出しを使用して Lambda 関数を呼び出すことができます。



1. [[ Amazon API Gateway console ]](https://console.aws.amazon.com/apigateway)( Amazon API Gateway コンソール )にサインインします。

1. REST APIで、** [ Build ]**（ 構築 ）を選択します。

1. **[ New API ]**（ 新規API )を選択します。  
![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/PicNewAPI.png)

1. **[ Employee ]**をAPI 名として指定し、説明を入力します。  
![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picEmployeeAPI.png)

1. **[API の作成]** を選択します。

1. **Employee**セクションの**[Resources]**を選択します。  
![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picResources.png)

1. 名前フィールドの **employees**を指定します。

1. **[Create Resources]** (リソースの作成) を選択します。

1. **[ Actions ]** ( アクション )のドロップダウンから **[ Create Resource ]** ( リソースの作成 )を選択します。  
![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picCreateResources.png)

1. **[ /employees ]**を選択し、**[Create Method]** から**[Actions]**を選択し、**[GET]**を**[/employees]**下のドロップダウンメニューから選択します。チェックマークアイコンを選択します。  
![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picGet.png)

1. **Lambda function**を選択し、Lambda 関数名として**mylambdafunction**と入力します。**[保存]** を選択します。

### API Gateway メソッドをテストする
<a name="api-gateway-invoking-lambda-run-test"></a>

チュートリアルのこの時点で、**mylambdafunction**のLambda 関数を呼び出す API Gateway メソッドをテストできます。メソッドをテストするには、次の図に示す**[ Test ]**を選びます。

![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picTest.png)


Lambda 関数が呼び出されると、ログファイルを表示して成功したメッセージを表示できます。

### API Gateway メソッドをデプロイする
<a name="api-gateway-invoking-lambda-run-deploy"></a>

テストが成功したら、 [Amazon API Gateway コンソール](https://console.aws.amazon.com/apigateway)から、メソッドをデプロイできます。

1. **[ GET ]**（ 取得する ）を選択します。  
![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picGetDeploy.png)

1. **[ Actions ]** （アクション）ドロップダウンから**[ Deploy API ]**( デプロイAPI ）を選択します。  
![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picDeployMethod.png)

1. **[ Deploy API ]**フォームに入力し、**[ Deploy ]**を選択します。  
![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picDeployMethod.png)

1.  **[Save changes]** (変更の保存) をクリックします。

1.  **Get**をもう一度選択し、URL が変更されることに注意します。これは、Lambda 関数の呼び出しに使用できるURLです。  
![\[DynamoDB テーブル\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/images/apigateway_example/picURL2.png)

## リソースを削除します
<a name="api-gateway-invoking-lambda-destroy"></a>

お疲れ様でした。 AWS SDK for JavaScriptを使用してAmazon API Gateway を介しLambda 関数を呼び出します。このチュートリアルの冒頭で説明したように、このチュートリアルを進めたうえで、作成したすべてのリソースを終了して、料金が発生しないようにしてください。これを行うには、このチュートリアルの [AWS リソースを作成する](#api-gateway-invoking-lambda-provision-resources)トピックで作成した CloudFormation スタックを次のように削除します。

1. [CloudFormationAWS マネジメントコンソールで ]( https://console.aws.amazon.com/cloudformation/home)を開きます。

1. 「**スタック**」ページを開き、スタックを選択します。

1. **[Delete]** (削除) をクリックします。