AWSのDynamoDBにCRUD処理を行う方法（基礎編）

# AWSのDynamoDBにCRUD事始
AWSのDynamoDBにCRUD処理を行うために備忘録です。
初心者の方の参考になるかと思います。
今回は、自分のPCからAWSのDynamoDBに対してCRUD処理を行います。

# AWS側の処理
CURD処理を行うためにIAMで処理可能な権限を持つユーザーを作成します。

## IAMでやること
① IAMに行きユーザーを作成する

② 「アクセスキー・プログラムによるアクセス」をチェックし次へ
[![Image from Gyazo](https://i.gyazo.com/cb4b795f7db7d37d7b09f85d4fdd683c.png)](https://gyazo.com/cb4b795f7db7d37d7b09f85d4fdd683c)

③　作成したユーザーのDynamoDBにFull Accessできるポリシーを割り当てる
[![Image from Gyazo](https://i.gyazo.com/330720dd31e121db2f4d0560d532de37.png)](https://gyazo.com/330720dd31e121db2f4d0560d532de37)

④ タグの設定は現状行わない
[![Image from Gyazo](https://i.gyazo.com/bc368e8e11f6626c9af4edd1826d0b20.png)](https://gyazo.com/bc368e8e11f6626c9af4edd1826d0b20)

⑤ ユーザーを作成
[![Image from Gyazo](https://i.gyazo.com/1b133f8ebbca0dffa73180949aa4eba6.png)](https://gyazo.com/1b133f8ebbca0dffa73180949aa4eba6)

⑥ アクセスキーIDとシークレットアクセスキーを忘れずにメモする
[![Image from Gyazo](https://i.gyazo.com/e11c336a024218c0408704201f77dc91.png)](https://gyazo.com/e11c336a024218c0408704201f77dc91)

## DynamoDBで行うこと
① テーブルを作成
[![Image from Gyazo](https://i.gyazo.com/b367820fb4eb12d0794e2d2bf5a75b55.png)](https://gyazo.com/b367820fb4eb12d0794e2d2bf5a75b55)

② パーテーションキーとソートキーを作成。今回はid(文字列)とpass(数値)に指定
[![Image from Gyazo](https://i.gyazo.com/5703ccdac82030cde52a94658e3b4d0f.png)](https://gyazo.com/5703ccdac82030cde52a94658e3b4d0f)

③ 作成したテーブルがアクティブになることを確認
[![Image from Gyazo](https://i.gyazo.com/65847b8208ddc46d751847af94d07b0f.png)](https://gyazo.com/65847b8208ddc46d751847af94d07b0f)


# MyPC 側の処理
自分のPCからCRUD処理を行うために、まずは、AWS-sdkをインストールします。

```
npm i aws-sdk 
```
その上で次の処理をおこなっていきます。

## Create

putを使用して、データをDynamoDBに送リます。

```javascript:create.js
const AWS = require ("aws-sdk");
const client = new AWS.DynamoDB.DocumentClient({
    region : "自分のリージョンを設定",
    credentials : {
        secretAccessKey : "自分のシークレットキー",
        accessKeyId : "自分のアクセスキー"
    }
});


const data1 = {
    id : "test",
    pass : 1 ,
    url : "https://hogehoge"
}

 async function create(data){
    const result = await client.put({
        TableName : "CRUDtest", 
        Item : data
    }).promise();

    console.log(result);
}


Promise.resolve()
  .then(() => {
    return create(data1);
  })
  .then(() => {
    console.log("complete");
  })
  .catch((e) => {
    console.log("Error発生", e);
  });
```
コンソール上で、実行。
```
node create.js
```
するとDynamoDB上にデータが入る
[![Image from Gyazo](https://i.gyazo.com/5a2848a0e31aa07d8d436306b49cf112.png)](https://gyazo.com/5a2848a0e31aa07d8d436306b49cf112)


## Read

getで欲しい情報のidとpassを指定して、情報をDynamoDBから取得します。
```javascript:read.js
const AWS = require ("aws-sdk");
const client = new AWS.DynamoDB.DocumentClient({
    region : "自分のリージョンを設定",
    credentials : {
        secretAccessKey : "自分のシークレットキー",
        accessKeyId : "自分のアクセスキー"
    }
});

 async function read(){
    const result = await client.get({
        TableName : "CRUDtest", 
        Key : {
            id : "test",
            pass : 1
    }}).promise();

    console.log(result.Item.url);
}


Promise.resolve()
  .then(() => {
    return read();
  })
  .then(() => {
    console.log("complete");
  })
  .catch((e) => {
    console.log("Error発生", e);
  });
```
コンソール上で、実行。
```
node read.js
```
結果が取得できます。
[![Image from Gyazo](https://i.gyazo.com/41806abdc08291105e26719237388b09.png)](https://gyazo.com/41806abdc08291105e26719237388b09)

## Update
今回はsetを使用してデータを更新します。
```
const AWS = require ("aws-sdk");
const client = new AWS.DynamoDB.DocumentClient({
    region : "自分のリージョンを設定",
    credentials : {
        secretAccessKey : "自分のシークレットキー",
        accessKeyId : "自分のアクセスキー"
    }
});

 async function update(){
    const result = await client.update({
        TableName : "CRUDtest", 
        Key : {
            id : "test",
            pass : 1
        },
        UpdateExpression: 'set #a = :x',
        ExpressionAttributeNames: {'#a' : 'detail'},
        ExpressionAttributeValues: {
        ':x' : "test"
        }
    }).promise();

    console.log(result);
}


Promise.resolve()
  .then(() => {
    return update();
  })
  .then(() => {
    console.log("complete");
  })
  .catch((e) => {
    console.log("Error発生", e);
  });
```
コンソール上で、実行。
```
node update.js
```
結果が取得できます。
今回は、detailという項目が追加され、そこにtestという文字データが追加されました。
[![Image from Gyazo](https://i.gyazo.com/d898a4ed1cc43592868a94ccc1e6881a.png)](https://gyazo.com/d898a4ed1cc43592868a94ccc1e6881a)

## delete

```
const AWS = require ("aws-sdk");
const client = new AWS.DynamoDB.DocumentClient({
    region : "自分のリージョンを設定",
    credentials : {
        secretAccessKey : "自分のシークレットキー",
        accessKeyId : "自分のアクセスキー"
    }
});

 async function del(){
    const result = await client.delete({
        TableName : "CRUDtest", 
        Key : {
            id : "test",
            pass : 1
        }
    }).promise();

    console.log(result);
}


Promise.resolve()
  .then(() => {
    return del();
  })
  .then(() => {
    console.log("complete");
  })
  .catch((e) => {
    console.log("Error発生", e);
  });
```

コンソール上で、実行。
```
node delete.js
```
指定したデータが消去されます。
[![Image from Gyazo](https://i.gyazo.com/7fdada12458a322845b4f24beab62db5.png)](https://gyazo.com/7fdada12458a322845b4f24beab62db5)