

 AWS Cloud9 は新規顧客には利用できなくなりました。 AWS Cloud9 の既存のお客様は、通常どおりサービスを引き続き使用できます。[詳細はこちら](https://aws.amazon.com/blogs/devops/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/)

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

# の Amazon DynamoDB チュートリアル AWS Cloud9
<a name="sample-dynamodb"></a>

このチュートリアルでは、Amazon DynamoDB と連携する AWS Cloud9 開発環境を設定できます。

DynamoDB は、フルマネージド型の NoSQL データベースサービスです。DynamoDB を使用して、任意の量のデータを保存および取得できるデータベーステーブルを作成し、任意のレベルのリクエストトラフィックを処理できます。DynamoDB によって自動的に、そのテーブルのデータとトラフィックが多数のサーバーに分散されます。サーバーの数は、指定のリクエスト容量と保存されているデータを処理するのに十分であるように選択されます。このような分散処理の間も、パフォーマンスは一定で、高速です。詳細については、 AWS ウェブサイトの[「Amazon DynamoDB](https://aws.amazon.com/dynamodb/)」を参照してください。

このサンプルを作成すると、 AWS アカウントに料金が発生する可能性があります。これには、Amazon EC2 や DynamoDB などのサービスで発生する可能性がある料金も含まれます。詳細については、「[Amazon EC2 料金表](https://aws.amazon.com/ec2/pricing/)」および「[Amazon DynamoDB 料金表](https://aws.amazon.com/dynamodb/pricing/)」を参照してください。

その他の AWS データベースサービスの詳細については、 AWS ウェブサイトの[Amazon Relational Database Service (RDS)](https://aws.amazon.com/rds/)」、[Amazon ElastiCache](https://aws.amazon.com/elasticache/)」、および[「Amazon Redshift](https://aws.amazon.com/redshift/)」を参照してください。 AWS ウェブサイトで[AWS Database Migration Service](https://aws.amazon.com/dms/)も参照してください。
+  [前提条件](#sample-dynamodb-prereqs) 
+  [ステップ 1: AWS CLI、 AWS CloudShell、またはその両方を環境にインストールして設定する](#sample-dynamodb-cli-setup) 
+  [ステップ 2: テーブルを作成する](#sample-dynamodb-create-table) 
+  [ステップ 3: テーブルに 1 つの項目を追加する](#sample-dynamodb-add-item) 
+  [ステップ 4: テーブルに複数の項目を追加する](#sample-dynamodb-add-items) 
+  [ステップ 5: グローバルセカンダリインデックスを作成する](#sample-dynamodb-create-index) 
+  [ステップ 6: テーブルから項目を取得する](#sample-dynamodb-get-items) 
+  [ステップ 7: クリーンアップする](#sample-dynamodb-clean-up) 

## 前提条件
<a name="sample-dynamodb-prereqs"></a>

このサンプルを使用する前に、設定が次の要件を満たしていることを確認します。
+ **既存の AWS Cloud9 EC2 開発環境が必要です。**このサンプルは、Amazon Linux または Ubuntu Server を実行する Amazon EC2 インスタンスに接続された EC2 環境が既にあることを前提としています。別のタイプの環境またはオペレーティングシステムがある場合、このサンプルの指示を関連ツールを設定する必要がある場合があります。詳細については、「[での環境の作成 AWS Cloud9](create-environment.md)」を参照してください。
+ **既存の環境の AWS Cloud9 IDE が既に開いている。**環境を開くと、 はウェブブラウザでその環境の IDE AWS Cloud9 を開きます。詳細については、「[で環境を開く AWS Cloud9](open-environment.md)」を参照してください。

## ステップ 1: 環境に AWS CLI、 AWS CloudShell、またはその両方をインストールして設定する
<a name="sample-dynamodb-cli-setup"></a>

このステップでは、IDE AWS Cloud9 を使用して AWS CLI、、またはその両方を環境にインストールして設定し AWS CloudShell、コマンドを実行して DynamoDB とやり取りできるようにします。次に、 AWS CLI を使用してベーシックな DynamoDB コマンドを実行し、インストールと設定をテストします。

1.  AWS CLI または の認証情報管理をセットアップ AWS CloudShell し AWS CLI、、 AWS CloudShell、またはその両方を環境にインストールするには、「」および[AWS CLIAWS CloudShell 「サンプル](sample-aws-cli.md)」のステップ 1 と 2 に従って、このトピックに戻ります。環境に AWS CLI、、 AWS CloudShellまたはその両方を既にインストールして設定している場合は、再度実行する必要はありません。

1. 、aws-shell、またはその両方のインストールと設定をテストするには AWS CLI、環境のターミナルセッションから DynamoDB** `list-tables` ** コマンドを実行して、既存の DynamoDB テーブルがある場合は一覧表示します。新しいターミナルセッションを開始するには、メニューバーで、[**Windows (ウィンドウ)**]、[**New Terminal (新しいターミナル)**] の順に選択します。

   ```
   aws dynamodb list-tables # For the AWS CLI.
   dynamodb list-tables     # For the aws-shell.
   ```
**注記**  
このサンプルでは、aws-shell を使用している場合に `aws` で始まる各コマンドの `aws` を省略します。aws-shell を開始するには、**`aws-shell`** コマンドを実行します。aws-shell の使用を停止するには、**`.exit`** コマンドまたは **`.quit`** コマンドを実行します。

   このコマンドが正常に実行されると、既存の DynamoDB テーブル (ある場合) のリストが `TableNames` 配列として出力されます。まだ DynamoDB テーブルがない場合、`TableNames` 配列は空になります。

   ```
   {
     "TableNames": []
   }
   ```

   DynamoDB テーブルがある場合は、`TableNames` 配列にテーブル名のリストが表示されます。

## ステップ 2: テーブルを作成する
<a name="sample-dynamodb-create-table"></a>

このステップでは、DynamoDB でテーブルを作成してテーブルの名前、レイアウト、シンプルプライマリキー、データスループット設定を指定します。

`Weather` というこのサンプルテーブルには、アメリカのいくつかの都市の天気予報に関する情報が含まれています。このテーブルには、以下のタイプの情報 (DynamoDB では個々の情報は*属性*と呼ばれます) が保持されます。
+ 必須の一意の都市 ID (`CityID`)
+ 必須の予報日 (`Date`)
+ 都市名 (`City`)
+ 州名 (`State`)
+ 予測天気 (`Conditions`)
+ 予測温度 (`Temperatures`)
  + 予測最高気温、華氏 (`HighF`)
  + 予測最低気温、華氏 (`LowF`)

テーブルを作成するには、IDE AWS Cloud9 のターミナルセッションで DynamoDB** `create-table` ** コマンドを実行します。

```
aws dynamodb create-table \
--table-name Weather \
--attribute-definitions \
  AttributeName=CityID,AttributeType=N AttributeName=Date,AttributeType=S \
--key-schema \
  AttributeName=CityID,KeyType=HASH AttributeName=Date,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
```

このコマンドで:
+  `--table-name` はテーブル名を表します (このサンプルでは `Weather`)。テーブル名は、アカウント AWS 内の各 AWS リージョン内で一意である必要があります。
+  `--attribute-definitions` はテーブル項目を一意に識別するために使用する属性を表します。このテーブルの各項目は、ISO-8601 形式の文字列として表される数字の `ID` 属性と `Date` 属性の組み合わせで一意に識別されます。
+  `--key-schema` はテーブルのキースキーマを表します。このテーブルには `CityID` と `Date` の複合プライマリキーがあります。つまり、テーブルの各項目は `CityID` 属性値と `Date` 属性値を持つ必要がありますが、テーブル内で `CityID` 属性値と `Date` 属性値が両方とも同じ 2 つの項目が存在することはできません。
+  `--provisioned-throughput` はテーブルの読み取り/書き込み容量を表します。DynamoDB では、サイズが 4 KB までの項目について 1 秒あたり最大 5 つの強力な整合性のある読み込み、またはサイズが 4 KB までの項目について 1 秒あたり最大 5 つの結果整合性のある読み込みが許可されます。また、DynamoDB ではサイズが 1 KB までの項目について 1 秒あたり最大 5 回の書き込みが許可されます。
**注記**  
プロビジョニングされたスループットを高く設定すると、 AWS アカウントに追加料金が発生する可能性があります。  
この件および他の DynamoDB のコマンドの詳細については、*AWS CLI コマンドリファレンス*の「[dynamodb](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/index.html)」を参照してください。

このコマンドが成功した場合、作成する新しいテーブルに関する概要情報が表示されます。テーブルが正常に作成されたことを確認するには、テーブルの名前 (`--table-name`) を指定して DynamoDB** `describe-table` ** コマンドを実行します。

```
aws dynamodb describe-table --table-name Weather
```

テーブルが正常に作成されると、`TableStatus` の値が `CREATING` から `ACTIVE` に変わります。テーブルが正常に作成されてからこのステップの先に進んでください。

## ステップ 3: テーブルに 1 つの項目を追加する
<a name="sample-dynamodb-add-item"></a>

このステップでは、作成したテーブルに項目を追加します。

1. `weather-item.json` という名前のファイルを作成し、次の内容を記述します。新規ファイルを作成するには、メニューバーで [**File (ファイル)**]、[**New File (新規ファイル)**] の順に選択します。ファイルを保存するには、［**File (ファイル)**］、［**Save (保存)**］の順に選択します。

   ```
   {
     "CityID": { "N": "1" },
     "Date": { "S": "2017-04-12" },
     "City": { "S": "Seattle" },
     "State": { "S": "WA" },
     "Conditions": { "S": "Rain" },
     "Temperatures": { "M": {
         "HighF": { "N": "59" },
         "LowF": { "N": "46" }
       }
     }
   }
   ```

   このコードでは、`N` は数値である属性値です。`S` は文字列の属性値です。`M` はマップ属性であり、一連の属性と値のペアです。項目を操作する場合は常に属性のデータ型を指定する必要があります。その他の使用可能な属性のデータ型については、[データ型](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes)の*Amazon DynamoDB デベロッパーガイド*のデータ型を参照してください。

1. テーブル名 (`--table-name`) と JSON 形式の項目のパス (`--item`) を指定して DynamoDB** `put-item` ** コマンドを実行します。

   ```
   aws dynamodb put-item \
   --table-name Weather \
   --item file://weather-item.json
   ```

   コマンドが成功すると、エラーなしで実行され、確認メッセージは表示されません。

1. テーブルの現在のコンテンツを確認するには、テーブルの名前 (`--table-name`) を指定して DynamoDB** `scan` ** コマンドを実行します。

   ```
   aws dynamodb scan --table-name Weather
   ```

   コマンドが成功した場合は、テーブルおよび追加した項目に関する概要情報が表示されます。

## ステップ 4: テーブルに複数の項目を追加する
<a name="sample-dynamodb-add-items"></a>

このステップでは、`Weather` テーブルに複数の項目を追加します。

1. `more-weather-items.json` という名前のファイルを作成し、次の内容を記述します。

   ```
   {
     "Weather": [
       {
         "PutRequest": {
           "Item": {
             "CityID": { "N": "1" },
             "Date": { "S": "2017-04-13" },
             "City": { "S": "Seattle" },
             "State": { "S": "WA" },
             "Conditions": { "S": "Rain" },
             "Temperatures": { "M": {
                 "HighF": { "N": "52" },
                 "LowF": { "N": "43" }
               }
             }
           }
         }
       },
       {
         "PutRequest": {
           "Item": {
             "CityID": { "N": "1" },
             "Date": { "S": "2017-04-14" },
             "City": { "S": "Seattle" },
             "State": { "S": "WA" },
             "Conditions": { "S": "Rain" },
             "Temperatures": { "M": {
                 "HighF": { "N": "49" },
                 "LowF": { "N": "43" }
               }
             }
           }
         }
       },
       {
         "PutRequest": {
           "Item": {
             "CityID": { "N": "2" },
             "Date": { "S": "2017-04-12" },
             "City": { "S": "Portland" },
             "State": { "S": "OR" },
             "Conditions": { "S": "Thunderstorms" },
             "Temperatures": { "M": {
                 "HighF": { "N": "59" },
                 "LowF": { "N": "43" }
               }
             }
           }
         }
       },
       {
         "PutRequest": {
           "Item": {
             "CityID": { "N": "2" },
             "Date": { "S": "2017-04-13" },
             "City": { "S": "Portland" },
             "State": { "S": "OR" },
             "Conditions": { "S": "Rain" },
             "Temperatures": { "M": {
                 "HighF": { "N": "51" },
                 "LowF": { "N": "41" }
               }
             }
           }
         }
       },
       {
         "PutRequest": {
           "Item": {
             "CityID": { "N": "2" },
             "Date": { "S": "2017-04-14" },
             "City": { "S": "Portland" },
             "State": { "S": "OR" },
             "Conditions": { "S": "Rain Showers" },
             "Temperatures": { "M": {
                 "HighF": { "N": "49" },
                 "LowF": { "N": "39" }
               }
             }
           }
         }
       },
       {
         "PutRequest": {
           "Item": {
             "CityID": { "N": "3" },
             "Date": { "S": "2017-04-12" },
             "City": { "S": "Portland" },
             "State": { "S": "ME" },
             "Conditions": { "S": "Rain" },
             "Temperatures": { "M": {
                 "HighF": { "N": "59" },
                 "LowF": { "N": "40" }
               }
             }
           }
         }
       },
       {
         "PutRequest": {
           "Item": {
             "CityID": { "N": "3" },
             "Date": { "S": "2017-04-13" },
             "City": { "S": "Portland" },
             "State": { "S": "ME" },
             "Conditions": { "S": "Partly Sunny" },
             "Temperatures": { "M": {
                 "HighF": { "N": "54" },
                 "LowF": { "N": "37" }
               }
             }
           }
         }
       },
       {
         "PutRequest": {
           "Item": {
             "CityID": { "N": "3" },
             "Date": { "S": "2017-04-14" },
             "City": { "S": "Portland" },
             "State": { "S": "ME" },
             "Conditions": { "S": "Mostly Sunny" },
             "Temperatures": { "M": {
                 "HighF": { "N": "53" },
                 "LowF": { "N": "37" }
               }
             }
           }
         }
       }
     ]
   }
   ```

   このコードでは、前のステップで定義された単一の項目と同様に、8 つの `Item` オブジェクトがテーブルに追加する 8 つの項目を定義します。ただし、次のステップで DynamoDB**`batch-write-item`** コマンドを実行する際に、JSON 形式のオブジェクトを指定する必要があります。各 `Item` オブジェクトが `PutRequest` オブジェクトに含められます。次に、これらの `PutRequest` オブジェクトを、テーブルと同じ名前の親配列に含める必要があります。

1. 追加する JSON 形式の項目のパス (`--request-items`) を指定して DynamoDB** `batch-write-item` ** コマンドを実行します。

   ```
   aws dynamodb batch-write-item \
   --request-items file://more-weather-items.json
   ```

   コマンドが成功すると、次のメッセージが表示され、項目が正常に追加されたことを確認できます。

   ```
   {
     "UnprocessedItems": {}
   }
   ```

1. テーブルの現在のコンテンツを確認するには、DynamoDB** `scan` ** コマンドをもう一度実行します。

   ```
   aws dynamodb scan --table-name Weather
   ```

   コマンドが成功した場合は、9 件の項目が表示されます。

## ステップ 5: グローバルセカンダリインデックスを作成する
<a name="sample-dynamodb-create-index"></a>

DynamoDB** `scan` ** コマンドを実行して項目に関する情報を取得するには、特にテーブルのサイズが大きくなった場合や、取得する情報のタイプが複雑な場合は、時間がかかる場合があります。1 つ以上のセカンダリインデックスを作成して、処理速度を上げ情報を簡単に取得できるようにします。このステップでは、これを行うために DynamoDB がサポートしている 2 種類のセカンダリインデックスについて学習します。これらは、*ローカルセカンダリインデックス*および*グローバルセカンダリインデックス*と呼ばれます。ここではグローバルセカンダリインデックスを作成します。

これらのセカンダリインデックスの種類を理解するには、最初にテーブルの項目を一意に識別するプライマリキーの詳細について理解する必要があります。DynamoDB では、*シンプルプライマリキー*または*複合プライマリキー*がサポートされています。シンプルプライマリキーには単一の属性があり、その属性値はテーブルの項目ごとに一意である必要があります。この属性は、*パーティションキー* (または*ハッシュ属性*) とも呼ばれ、DynamoDB はこれを使用して項目をパーティション化し、アクセスを高速化します。また、テーブルで 2 つの属性を組み合わせた複合プライマリキーを持つこともできます。最初の属性はパーティションキーであり、2 番目の属性は*ソートキー* (*範囲属性*ともいいます) です。複合プライマリキーがあるテーブルの場合、2 つの項目が同じパーティションキー値を持つことはできますが、ソートキー値も同じにはできません。`Weather` テーブルには複合プライマリキーがあります。

ローカルセカンダリインデックスは、テーブル自体と同じパーティションキーを持ちますが、このインデックスタイプでは異なるソートキーを持つことができます。グローバルセカンダリインデックスは、テーブル自体とはどちらも異なるパーティションキーとソートキーを持つことができます。

たとえば、`Weather` 項目にアクセスするプライマリキーに `CityID` を既に使用しているとします。`Weather` 項目に `State` を使用してアクセスするには、パーティションキー `CityID` (テーブル自体と同じである必要があります) とソートキー `State` を持つローカルセカンダリインデックスを作成できます。`Weather` 項目に `City` を使用してアクセスするには、パーティションキー `City` とソートキー `Date` を持つグローバルセカンダリインデックスを作成できます。

ローカルセカンダリインデックスは、テーブルを作成するときにのみ作成できます。`Weather` テーブルが既に存在するため、そこにローカルセカンダリインデックスを追加することはできません。ただし、グローバルセカンダリインデックスを追加することはできます。1 つ追加してみましょう。

**注記**  
セカンダリインデックスを作成すると、 AWS アカウントに追加料金が発生する可能性があります。

1. `weather-global-index.json` という名前のファイルを作成し、次の内容を記述します。

   ```
   [
     {
       "Create": {
         "IndexName": "weather-global-index",
         "KeySchema": [
           {
             "AttributeName": "City",
             "KeyType": "HASH"
           },
           {
             "AttributeName": "Date",
             "KeyType": "RANGE"
           }
         ],
         "Projection": {
           "ProjectionType": "INCLUDE",
           "NonKeyAttributes": [
             "State",
             "Conditions",
             "Temperatures"
           ]
         },
         "ProvisionedThroughput": {
           "ReadCapacityUnits": 5,
           "WriteCapacityUnits": 5
         }
       }
     }
   ]
   ```

   このコードでは:
   + グローバルセカンダリインデックスの名前は `weather-global-index` です。
   + `City` 属性はパーティションキー (ハッシュ属性)、`Date` 属性はソートキー (範囲属性) です。
   +  `Projection` は、このインデックスを使用したテーブル検索に一致する各項目について、デフォルトで (ハッシュ属性と範囲属性に加えて) 取得する属性を定義します。このサンプルでは、`State`、`Conditions`、`HighF` (`Temperatures` の一部)、および `LowF` (`Temperatures` のい一部) 属性 (および `City` 属性と `Date` 属性) は、一致する項目ごとに取得されます。
   + テーブルと同様に、グローバルセカンダリインデックスではプロビジョニングされたスループット設定を定義する必要があります。
   + `IndexName`、`KeySchema`、`Projection`、および `ProvisionedThroughput` 設定が `Create` オブジェクトに含まれている必要があります。このオブジェクトは、次のステップで DynamoDB** `update-table` **コマンドを実行して作成するグローバルセカンダリインデックスを定義します。

1. DynamoDB ** `update-table` **コマンドを実行します。

   ```
   aws dynamodb update-table \
   --table-name Weather \
   --attribute-definitions \
     AttributeName=City,AttributeType=S AttributeName=Date,AttributeType=S \
   --global-secondary-index-updates file://weather-global-index.json
   ```

   このコマンドで:
   +  `--table-name` は更新するテーブルの名前です。
   +  `--attribute-definitions` はインデックスに含める属性です。パーティションキーは常にリストの最初に表示され、ソートキーは常にリストの 2 番目に表示されます。
   +  `--global-secondary-index-updates` はグローバルセカンダリインデックスを定義するファイルへのパスです。

   このコマンドが成功した場合、作成する新しいグローバルセカンダリインデックスに関する概要情報が表示されます。グローバルセカンダリインデックスが正常に作成されたことを確認するには、テーブルの名前 (`--table-name`) を指定して DynamoDB** `describe-table` ** コマンドを実行します。

   ```
   aws dynamodb describe-table --table-name Weather
   ```

   グローバルセカンダリインデックスが正常に作成された場合、`TableStatus` の値が `UPDATING` から `ACTIVE` に変わり、`IndexStatus` の値が `CREATING` から `ACTIVE` に変わります。グローバルセカンダリインデックスが正常に作成されてからこのステップの先に進んでください。これには数分間かかる場合があります。

## ステップ 6: テーブルから項目を取得する
<a name="sample-dynamodb-get-items"></a>

テーブルから項目を取得する方法は複数あります。このステップでは、テーブルのプライマリキー、テーブルのその他の属性、およびグローバルセカンダリインデックスをそれぞれ使用して項目を取得します。

### 項目のプライマリキーの値に基づいてテーブルから単一の項目を取得するには
<a name="w2aac31c21c25b5"></a>

項目のプライマリキーバリューがわかっている場合は、DynamoDB コマンド ** `get-item` **、** `scan` **、または ** `query` ** を実行して一致する項目を取得できます。各コマンドの主な相違点は次のとおりです。
+  **`get-item`** は、指定されたプライマリキーを持つ項目の属性のセットを返します。
+  **`scan`** は、テーブルまたはセカンダリインデックスの各項目にアクセスして、1 つ以上の項目または項目属性を返します。
+  **`query`** はプライマリキー値に基づいて項目を探します。複合プライマリキー (パーティションキーとソートキー) のあるテーブルまたはセカンダリインデックスをクエリできます。

このサンプルで、これらのコマンドをそれぞれ使用して、`CityID` 属性の値が `1`、`Date` 属性の値が `2017-04-12` の項目を取得する方法を説明します。

1. DynamoDB** `get-item` ** コマンドを実行するには、テーブルの名前 (`--table-name`)、プライマリキーバリュー (`--key`)、および表示する項目の属性値 (`--projection-expression`) を指定します。`Date` は DynamoDBで予約されたキーワードであるため、`Date` 属性値のエイリアス (`--expression-attribute-names`) も指定する必要があります (`State` も予約されたキーワードであり、このためのエイリアスは後のステップで指定します)。

   ```
   aws dynamodb get-item \
   --table-name Weather \
   --key '{ "CityID": { "N": "1" }, "Date": { "S": "2017-04-12" } }' \
   --projection-expression \
     "City, #D, Conditions, Temperatures.HighF, Temperatures.LowF" \
   --expression-attribute-names '{ "#D": "Date" }'
   ```

   このコマンドや他のコマンドで、項目の属性をすべて表示するには、`--projection-expression` を含めません。このサンプルでは、`--projection-expression` を含めていないため、`--expression-attribute-names` を含める必要もありません。

   ```
   aws dynamodb get-item \
   --table-name Weather \
   --key '{ "CityID": { "N": "1" }, "Date": { "S": "2017-04-12" } }'
   ```

1. DynamoDB** `scan` ** コマンドを実行するには、以下を指定します。
   + テーブルの名前 (`--table-name`)。
   + 実行する検索 (`--filter-expression`)。
   + 使用する検索基準 (`--expression-attribute-values`)。
   + 一致した項目で表示する属性の種類 (`--select`)。
   + 表示する項目の属性値 (`--projection-expression`)。
   + 属性に DynamoDB の予約済みキーワードが使用されている場合、その属性のエイリアス (`--expression-attribute-names`)。

   ```
   aws dynamodb scan \
   --table-name Weather \
   --filter-expression "(CityID = :cityID) and (#D = :date)" \
   --expression-attribute-values \
     '{ ":cityID": { "N": "1" }, ":date": { "S": "2017-04-12" } }' \
   --select SPECIFIC_ATTRIBUTES \
   --projection-expression \
     "City, #D, Conditions, Temperatures.HighF, Temperatures.LowF" \
   --expression-attribute-names '{ "#D": "Date" }'
   ```

1. DynamoDB** `query` ** コマンドを実行するには、以下を指定します。
   + テーブルの名前 (`--table-name`)。
   + 実行する検索 (`--key-condition-expression`)。
   + 検索で使用する属性値 (`--expression-attribute-values`)。
   + 一致した項目で表示する属性の種類 (`--select`)。
   + 表示する項目の属性値 (`--projection-expression`)。
   + 属性に DynamoDB の予約済みキーワードが使用されている場合、その属性のエイリアス (`--expression-attribute-names`)。

   ```
   aws dynamodb query \
   --table-name Weather \
   --key-condition-expression "(CityID = :cityID) and (#D = :date)" \
   --expression-attribute-values \
     '{ ":cityID": { "N": "1" }, ":date": { "S": "2017-04-12" } }' \
   --select SPECIFIC_ATTRIBUTES \
   --projection-expression \
     "City, #D, Conditions, Temperatures.HighF, Temperatures.LowF" \
   --expression-attribute-names '{ "#D": "Date" }'
   ```

   結果を取得するためにスキャンする必要がある項目数が、**`scan`** コマンドでは 9 項目すべてであるのに対して **`query`** コマンドでは 1 項目のみであることに注目してください。

### 項目のプライマリキーの値に基づいてテーブルから複数の項目を取得するには
<a name="w2aac31c21c25b7"></a>

項目のプライマリキーバリューがわかっている場合は、DynamoDB** `batch-get-item` ** コマンドを実行して一致する項目を取得できます。このサンプルで、`CityID` 属性の値が `3`、`Date` 属性の値が `2017-04-13` または `2017-04-14` の項目を取得する方法を説明します。

取得する項目を記述するファイルへのパス (`--request-items`) を指定して、DynamoDB ** `batch-get-item` ** コマンドを実行します。

```
aws dynamodb batch-get-item --request-items file://batch-get-item.json
```

このサンプルでは、`batch-get-item.json` ファイルのコードは、`Weather` テーブルで、`CityID` が `3` であり `Date` が `2017-04-13` または `2017-04-14` である項目を検索するように指定します。検出された各項目について、`City`、`State`、`Date`、および `HighF` (`Temperatures` の一部) の属性値が表示されます (存在する場合)。

```
{
  "Weather" : {
    "Keys": [
      {
        "CityID": { "N": "3" },
        "Date": { "S": "2017-04-13" }
      },
      {
        "CityID": { "N": "3" },
        "Date": { "S": "2017-04-14" }
      }
    ],
    "ProjectionExpression": "City, #S, #D, Temperatures.HighF",
    "ExpressionAttributeNames": { "#S": "State", "#D": "Date" }
  }
}
```

### 一致するすべての項目をテーブルから取得するには
<a name="w2aac31c21c25b9"></a>

テーブルの属性値について一部でもわかっていることがあれば、DynamoDB** `scan` ** コマンドを実行して一致する項目を取得できます。このサンプルで、`Conditions` 属性の値に `Sunny` が含まれ、`HighF` 属性の値 (`Temperatures` の一部) が `53` より大きい日を取得する方法を説明します。

DynamoDB ** `scan` **コマンドを実行し、以下を指定します。
+ テーブルの名前 (`--table-name`)。
+ 実行する検索 (`--filter-expression`)。
+ 使用する検索基準 (`--expression-attribute-values`)。
+ 一致した項目で表示する属性の種類 (`--select`)。
+ 表示する項目の属性値 (`--projection-expression`)。
+ 属性に DynamoDB の予約済みキーワードが使用されている場合、その属性のエイリアス (`--expression-attribute-names`)。

```
aws dynamodb scan \
--table-name Weather \
--filter-expression \
  "(contains (Conditions, :sun)) and (Temperatures.HighF > :h)" \
--expression-attribute-values \
  '{ ":sun": { "S" : "Sunny" }, ":h": { "N" : "53" } }' \
--select SPECIFIC_ATTRIBUTES \
--projection-expression "City, #S, #D, Conditions, Temperatures.HighF" \
--expression-attribute-names '{ "#S": "State", "#D": "Date" }'
```

### 一致するすべての項目をグローバルセカンダリインデックスから取得するには
<a name="w2aac31c21c25c11"></a>

グローバルセカンダリインデックスを使用して検索するには、DynamoDB**`query`** コマンドを使用します。このサンプルで、`weather-global-index` セカンダリインデックスを使用して、日付が `Portland` および `2017-04-13` の、`2017-04-14` という名前の都市の予測天気を取得する方法を説明します。

DynamoDB ** `query` **コマンドを実行し、以下を指定します。
+ テーブルの名前 (`--table-name`)。
+ グローバルセカンダリインデックスの名前 (`--index-name`)。
+ 実行する検索 (`--key-condition-expression`)。
+ 検索で使用する属性値 (`--expression-attribute-values`)。
+ 一致した項目で表示する属性の種類 (`--select`)。
+ 属性に DynamoDB の予約済みキーワードが使用されている場合、その属性のエイリアス (`--expression-attribute-names`)。

```
aws dynamodb query \
--table-name Weather \
--index-name weather-global-index \
--key-condition-expression "(City = :city) and (#D between :date1 and :date2)" \
--expression-attribute-values \
  '{ ":city": { "S" : "Portland" }, ":date1": { "S": "2017-04-13" }, ":date2": { "S": "2017-04-14" } }' \
--select SPECIFIC_ATTRIBUTES \
--projection-expression "City, #S, #D, Conditions, Temperatures.HighF" \
--expression-attribute-names '{ "#S": "State", "#D": "Date" }'
```

## ステップ 7: クリーンアップする
<a name="sample-dynamodb-clean-up"></a>

このサンプルの使用が完了したら、 AWS アカウントへの継続的な課金を防ぐには、 テーブルを削除する必要があります。テーブルを削除すると、グローバルセカンダリインデックスも削除されます。環境も削除する必要があります。

テーブルを削除するには、テーブルの名前 (**) を指定して DynamoDB`delete-table` ** `--table-name` コマンドを実行します。

```
aws dynamodb delete-table --table-name Weather
```

コマンドが成功した場合は、テーブルに関する情報が表示され、そこで `TableStatus` 値が `DELETING` になっています。

テーブルが正常に削除されたことを確認するには、 DynamoDB** `describe-table` ** コマンドを実行して、テーブルの名前 (`--table-name`) を指定してます。

```
aws dynamodb describe-table --table-name Weather
```

テーブルが正常に削除された場合は、`Requested resource not found` というフレーズを含むメッセージが表示されます。

環境を削除するには、「[環境の削除](delete-environment.md)」を参照してください。