

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

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

# のバージョン 2.x から 3.x への移行 AWS SDK for JavaScript
<a name="migrating"></a>

 AWS SDK for JavaScript バージョン 3 はバージョン 2 の大幅な書き換えです。このセクションでは、2 つのバージョンの相違点と、SDK for JavaScript のバージョン 2 からバージョン 3 に移行する方法について説明します。

## codemod を使用してコードを SDK for JavaScript v3 に移行する
<a name="migrating-to-v3"></a>

AWS SDK for JavaScript バージョン 3 (v3) には、認証情報、Amazon S3 マルチパートアップロード、DynamoDB ドキュメントクライアント、ウェーターなど、クライアント設定とユーティリティ用のモダナイズされたインターフェイスが付属しています。v2 で何が変更されたか、および各変更の v3 に相当するものについては、[AWS SDK for JavaScript GitHub リポジトリの移行ガイド](https://github.com/aws/aws-sdk-js-v3/blob/main/UPGRADING.md)を参照してください。

v3 AWS SDK for JavaScript を最大限に活用するには、以下で説明する codemod スクリプトを使用することをお勧めします。

### codemod を使用して既存の v2 コードを移行する
<a name="using-codemod"></a>

[aws-sdk-js-codemod](https://www.npmjs.com/package/aws-sdk-js-codemod) の codemod スクリプトのコレクションは、既存の AWS SDK for JavaScript (v2) アプリケーションを v3 APIs を使用するように移行するのに役立ちます。次のように変換を実行できます。

```
$ npx aws-sdk-js-codemod -t v2-to-v3 PATH...
```

例えば、v2 から Amazon DynamoDB クライアントを作成し、`listTables` オペレーションを呼び出す次のコードがあるとします。

```
// example.ts
import AWS from "aws-sdk";

const region = "us-west-2";
const client = new AWS.DynamoDB({ region });
await client.listTables({}).promise()
  .then(console.log)
  .catch(console.error);
```

`example.ts` に対する `v2-to-v3` 変換は次のように実行できます。

```
$ npx aws-sdk-js-codemod -t v2-to-v3 example.ts
```

次のように、DynamoDB インポートを v3 に変換し、v3 クライアントを作成して、`listTables` オペレーションを呼び出します。

```
// example.ts
import { DynamoDB } from "@aws-sdk/client-dynamodb";

const region = "us-west-2";
const client = new DynamoDB({ region });
await client.listTables({})
  .then(console.log)
  .catch(console.error);
```

一般的なユースケースの変換を実装しました。コードが正しく変換されない場合は、入力コードの例と確認された/期待される出力コードを含む[バグレポート](https://github.com/awslabs/aws-sdk-js-codemod/issues/new?assignees=&labels=bug%2Ctriage&template=bug_report.yml&title=%5BBug%3F%5D%3A+)または[機能リクエスト](https://github.com/awslabs/aws-sdk-js-codemod/issues/new?assignees=&labels=enhancement&template=feature_request.yml&title=%5BFeature%5D%3A+)を作成してください。特定のユースケースが[既存の問題](https://github.com/awslabs/aws-sdk-js-codemod/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)ですでに報告されている場合は、賛成票を投じて支持を示してください。

## バージョン 3 の新機能とは
<a name="welcome_whats_new_v3"></a>

SDK for JavaScript (v3) のバージョン3 には、以下の新機能が含まれています。

モジュール化されたパッケージ  
ユーザーは、サービスごとに個別のパッケージを使用できます。

新しいミドルウェアスタック  
ユーザーはミドルウェアスタックを使用して、オペレーション呼び出しのライフサイクルを制御できます。

さらに、SDKはTypeScriptで記述されており、静的型付けなどの多くの利点があります。

**重要**  
このガイドの v3 のコード例は、ECMAScript 6 (ES6) で記述されています。ES6 は、コードをよりモダンで読みやすくし、より多くのことをおこなうための新しい構文と新機能を提供します。ES6 では Node.js バージョン 13.x 以降を使用する必要があります。Node.js の最新バージョンをダウンロードしてインストールするには、[Node.js downloads.](https://nodejs.org/en/download/)を参照してください。詳細については、「[JavaScript ES6/CommonJS 構文](sdk-example-javascript-syntax.md)」を参照してください。

## モジュール化されたパッケージ
<a name="welcome_whats_new_v3_modularized_packages"></a>

SDK for JavaScript (v2) のバージョン 2 では、次のように AWS SDK 全体を使用する必要があります。

```
var AWS = require("aws-sdk");
```

アプリケーションが多くの AWS サービスを使用している場合、SDK 全体をロードすることは問題ではありません。ただし、少数のサービスのみを使用する必要がある場合は AWS 、不要または使用しないコードでアプリケーションのサイズを増やすことを意味します。

v3 では、必要な個々の AWS サービスをロードして使用できます。これを次の例に示します。これにより、Amazon DynamoDB（DynamoDB）にアクセスできます。

```
import { DynamoDB } from "@aws-sdk/client-dynamodb";
```

個々の AWS サービスをロードして使用できるだけでなく、必要なサービスコマンドのみをロードして使用することもできます。これを次の例でDynamoDB クライアントと`ListTablesCommand`コマンドにアクセスできることを示しています。

```
import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";
```

**重要**  
サブモジュールをモジュールにインポートしないでください。例えば、次のコードはエラーになる可能性があります。  

```
import { CognitoIdentity } from "@aws-sdk/client-cognito-identity/CognitoIdentity";
```
正しいコードは、次のとおりです。  

```
import { CognitoIdentity } from "@aws-sdk/client-cognito-identity";
```

### コードサイズの比較
<a name="welcome_whats_new_v3_modularized_packages_code_size"></a>

バージョン 2 (v2) では、`us-west-2` リージョン内のすべての Amazon DynamoDB テーブルを一覧表示する簡単なコード例は次のようになります。

```
var AWS = require("aws-sdk");
// Set the Region
AWS.config.update({ region: "us-west-2" });
// Create DynamoDB service object
var ddb = new AWS.DynamoDB({ apiVersion: "2012-08-10" });

// Call DynamoDB to retrieve the list of tables
ddb.listTables({ Limit: 10 }, function (err, data) {
  if (err) {
    console.log("Error", err.code);
  } else {
    console.log("Tables names are ", data.TableNames);
  }
});
```

v3 では次のようになります。

```
import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";

const dbclient = new DynamoDBClient({ region: "us-west-2" });

try {
  const results = await dbclient.send(new ListTablesCommand);
  
  for (const item of results.TableNames) {
    console.log(item);
  }
} catch (err) {
  console.error(err)
}
```

`aws-sdk`のパッケージは、アプリケーションに約40MBを追加します。`var AWS = require("aws-sdk")`を`import {DynamoDB} from "@aws-sdk/client-dynamodb"`に置き換えることで、そのオーバーヘッドを約 3 MB に削減します。インポートを DynamoDB クライアントと`ListTablesCommand`のコマンドだけに限定することで、オーバーヘッドを 100 KB 以下に削減します。

```
// Load the DynamoDB client and ListTablesCommand command for Node.js
import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";
const dbclient = new DynamoDBClient({});
```

### v3 でのコマンドの呼び出し
<a name="welcome_whats_new_v3_function_examples"></a>

v2 または v3 コマンドを使用して v3 でオペレーションを実行できます。v3 コマンドを使用するには、コマンドと必要な AWS サービスパッケージクライアントをインポートし、非同期/待機パターンを使用して `.send`メソッドを使用して コマンドを実行します。

v2 コマンドを使用するには、必要な AWS サービスパッケージをインポートし、コールバックまたは非同期/待機パターンを使用してパッケージ内で v2 コマンドを直接実行します。

#### v3 コマンドの使用
<a name="using_v3_commands"></a>

v3 には、 AWS サービスパッケージごとに一連のコマンドが用意されており、その AWS サービスのオペレーションを実行できます。 AWS のサービスをインストールした後、`node-modules/@aws-sdk/client-{{PACKAGE_NAME}}/commands folder.`のプロジェクトで利用可能なコマンドを参照できます。

使用したいコマンドをインポートする必要があります。例えば、次のコードは DynamoDB サービスおよび`CreateTableCommand`のコマンドをロードします。

```
import { DynamoDB, CreateTableCommand } from "@aws-sdk/client-dynamodb";
```

これらのコマンドを推奨の非同期/待機パターンで呼び出すには、次の構文を使用します。

```
{{CLIENT}}.send(new {{XXX}}Command);
```

例えば、次の例では、推奨される非同期/待機 パターンを使用して DynamoDB テーブルを作成します。

```
import { DynamoDB, CreateTableCommand } from "@aws-sdk/client-dynamodb";
const dynamodb = new DynamoDB({ region: "us-west-2" });
const tableParams = {
  TableName: {{TABLE_NAME}}
};

try {
  const data = await dynamodb.send(new CreateTableCommand(tableParams));
  console.log("Success", data);
} catch (err) {
  console.log("Error", err);
};
```

#### v2 コマンドの使用
<a name="using_v2_commands"></a>

SDK for JavaScript で v2 コマンドを使用するには、次のコードに示すように、完全な AWS サービスパッケージをインポートします。

```
const { DynamoDB } = require('@aws-sdk/client-dynamodb');
```

 推奨される非同期/待機パターンで v2 コマンドを呼び出すには、次の構文を使用します。

```
{{client}}.{{command}}({{parameters}});
```

次の例では v2 の `createTable` コマンドで、推奨される非同期/待機パターンを使用して DynamoDB テーブルを作成します。

```
const { DynamoDB } = require('@aws-sdk/client-dynamodb');
const dynamoDB = new DynamoDB({ region: 'us-west-2' });
var tableParams = {
  TableName: {{TABLE_NAME}}
};
async function run() => {
  try {
    const data = await dynamoDB.createTable(tableParams);
    console.log("Success", data);
  }
  catch (err) {
    console.log("Error", err);
  }
};
run();
```

次の例では v2 の `createBucket` コマンドで、コールバックパターンを使用して Amazon S3 バケットを作成します。

```
const { S3 } = require('@aws-sdk/client-s3');
const s3 = new S3({ region: 'us-west-2' });
var bucketParams = {
  Bucket : {{BUCKET_NAME}}
};
function run() {
  s3.createBucket(bucketParams, function (err, data) {
    if (err) {
      console.log("Error", err);
    } else {
      console.log("Success", data.Location);
    }
  })
};
run();
```

## 新しいミドルウェアスタック
<a name="welcome_whats_new_v3_middleware_stack"></a>

SDK の v2 では、イベントリスナーをリクエストに添付することで、ライフサイクルの複数のステージを介してリクエストを変更できるようになりました。このアプローチでは、リクエストのライフサイクル中に問題が発生したことをデバッグすることが困難になる可能性があります。

v3 では、新しいミドルウェアスタックを使用して、オペレーション呼び出しのライフサイクルを制御できます。このアプローチには、いくつかの利点があります。スタック内の各ミドルウェアステージは、リクエストオブジェクトに変更を加えた後、次のミドルウェアステージを呼び出します。また、エラーに至るまでのミドルウェアステージが呼び出されたかを正確に確認できるため、スタック内の問題のデバッグがはるかに簡単になります。

次の例では、ミドルウェアを使用して (先ほど作成して示した) Amazon DynamoDB クライアントにカスタムヘッダーを追加します。最初の引数は呼び出すスタックの次のミドルウエアステージである`next`を受け入れる関数と、呼び出され操作に関する情報を含むオブジェクトである`context`を受け入れる関数です。この関数は、操作とリクエストに渡されるパラメータを含むオブジェクトの`args`を受け入れる関数を返します。次のミドルウェアを`args`で呼び出した結果を返します

```
dbclient.middlewareStack.add(
  (next, context) => args => {
    args.request.headers["Custom-Header"] = "value";
    return next(args);
  },
  {
    name: "my-middleware",
    override: true,
    step: "build"
  }
);

dbclient.send(new PutObjectCommand(params));
```