아마존 웹 서비스를 다루는 기술 30장 - 9. DynamoDB

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

AWS API, CLI 활용하기

이재홍 http://www.pyrasis.com 2014.03.24 ~ 2014.06.30

DynamoDB

DynamoDB 테이블에 아이템을 저장하는 방법은 다음과 같습니다.

  • Item: 저장할 아이템을 정의합니다. 각 속성의 자료형을 구분해줘야 합니다. 아이템이 있으면 내용을 업데이트하고, 없으면 새로 생성합니다.
    • S, SS: 문자열, 문자열 배열(String Set)입니다.
    • N, NS: 숫자, 숫자 배열(Number Set)입니다. 단, JavaScript 상에서는 문자열 형태로 값을 설정해야 합니다.
    • B, BS: 바이너리, 바이너리 배열(Binary Set)입니다. Buffer 형태로 설정합니다.
  • TableName: 아이템을 저장할 테이블 이름을 설정합니다.

DynamoDB를 사용하는 방법은 '14장 확장 가능한 NoSQL 분산 데이터베이스를 제공하는 DynamoDB'를 참조하기 바랍니다.

dynamodb_1.js
var AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');

dynamodb = new AWS.DynamoDB();

var params = {
  Item: { // 필수
    someKey1: {
      S: 'Hello String'
    },
    someKey2: {
      SS: [ 'Hello String 1', 'Hello String 2' ]
    },
    someKey3: {
      N: '1'
    },
    someKey4: {
      NS: [ '1', '2' ]
    },
    someKey5: {
      B: new Buffer([1, 2, 3])
    },
    someKey6: {
      BS: [ new Buffer([1, 2, 3]), new Buffer([4, 5, 6]) ]
    }
  },
  TableName: 'ExampleTable' // 필수
};

dynamodb.putItem(params, function (err, data) {
  if (err)
    console.log(err, err.stack);
  else
    console.log(data);
});

저장할 아이템을 JSON 형태로 작성합니다.

{
  "someKey1": {
    "S": "Hello String"
  },
  "someKey2": {
    "SS": [ "Hello String 1", "Hello String 2" ]
  },
  "someKey3": {
    "N": "1"
  },
  "someKey4": {
    "NS": [ "1", "2" ]
  }
}

--item 옵션에 작성한 JSON을 한 줄로 만들고 ' '(작은 따옴표)로 묶어서 설정합니다.

AWS CLI
$ aws dynamodb put-item --table-name ExampleTable --item '{ "someKey1": { "S": "Hello String" }, "someKey2": { "SS": [ "Hello String 1", "Hello String 2" ] }, "someKey3": { "N": "1" }, "someKey4": { "NS": [ "1", "2" ] } }'

DynamoDB 테이블에 아이템을 업데이트하는 방법은 다음과 같습니다.

  • Key: 업데이트할 아이템의 검색 키를 설정합니다. 문자열뿐만 아니라 문자열 배열, 숫자, 숫자 배열, 바이너리, 바이너리 배열도 설정할 수 있습니다.
  • TableName: 아이템을 업데이트할 테이블 이름을 설정합니다.
  • AttributeUpdates: 업데이트할 속성 및 값을 설정합니다.
    • Action: 속성 업데이트 동작입니다.
      • PUT: 아이템이 있으면 내용을 교체하고, 없으면 새로 생성합니다.
      • ADD: 숫자, 숫자 배열만 사용할 수 있습니다. 숫자이고 아이템이 있으면 값을 더합니다. 숫자 배열이고 아이템이 있으면 배열에 원소를 추가합니다. 아이템이 없으면 새로 생성합니다.
      • DELETE: 속성을 삭제합니다.
  • Value: 문자열, 문자열 배열, 숫자, 숫자 배열, 바이너리, 바이너리 배열을 사용할 수 있습니다.
dynamodb_2.js
var AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');

dynamodb = new AWS.DynamoDB();

var params = {
  Key: { // 필수
    someKey1: {
      S: 'Hello String'
    }
  },
  TableName: 'ExampleTable', // 필수
  AttributeUpdates: { // 필수
    someKey2: {
      Action: 'PUT',
      Value: {
        SS: [ 'Hello String 10', 'Hello String 20' ]
      }
    },
    someKey3: {
      Action: 'ADD',
      Value: {
        N: '10'
      }
    },
    someKey4: {
      Action: 'DELETE'
    },
    someKey5: {
      Action: 'PUT',
      Value: {
        B: new Buffer([10, 20, 30])
      }
    },
    someKey6: {
      Action: 'DELETE'
    }
  }
};

dynamodb.updateItem(params, function (err, data) {
  if (err)
    console.log(err, err.stack);
  else
    console.log(data);
});

검색할 키를 JSON 형태로 작성합니다.

{
  "someKey1": {
    "S": "Hello String"
  }
}

업데이트할 아이템을 JSON 형태로 작성합니다.

{
  "someKey2": {
    "Action": "PUT",
    "Value": {
      "SS": [ "Hello String 10", "Hello String 20" ]
    }
  },
  "someKey3": {
    "Action": "ADD",
    "Value": {
      "N": "10"
    }
  },
  "someKey4": {
    "Action": "DELETE"
  }
}

--key, --attribute-updates 옵션에 작성한 JSON을 한 줄로 만들고 ' '(작은 따옴표)로 묶어서 설정합니다.

AWS CLI
$ aws dynamodb update-item --table-name ExampleTable --key '{ "someKey1": { "S": "Hello String" } }' --attribute-updates '{ "someKey2": { "Action": "PUT", "Value": { "SS": [ "Hello String 10", "Hello String 20" ] } }, "someKey3": { "Action": "ADD", "Value": { "N": "10" } }, "someKey4": { "Action": "DELETE" } }'

DynamoDB 테이블에 여러 아이템 저장, 업데이트하는 방법은 다음과 같습니다.

  • RequestItems: 저장, 업데이트할 아이템 목록입니다. 테이블 이름을 키로 설정합니다.
    • DeleteRequest: 조건에 맞는 아이템을 삭제합니다.
      • Key: 삭제할 아이템의 검색 키입니다. 문자열뿐만 아니라 문자열 배열, 숫자, 숫자 배열, 바이너리, 바이너리 배열도 설정할 수 있습니다.
    • PutRequest: 아이템을 저장합니다. 키에 맞는 아이템이 있으면 업데이트하고, 없으면 새로 생성합니다.
      • Item: 저장할 아이템을 설정합니다. 문자열뿐만 아니라 문자열 배열, 숫자, 숫자 배열, 바이너리, 바이너리 배열도 설정할 수 있습니다.
dynamodb_3.js
var AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');

dynamodb = new AWS.DynamoDB();

var params = {
  RequestItems: { // 필수
    'ExampleTable': [
      {
        DeleteRequest: {
          Key: { // 필수
            someKey1: {
              S: 'Hello String'
            }
          }
        }
      },
      {
        PutRequest: {
          Item: { // 필수
            someKey1: {
              S: 'World String'
            }
          }
        }
      }
    ]
  }
};

dynamodb.batchWriteItem(params, function (err, data) {
  if (err)
    console.log(err, err.stack);
  else
    console.log(data);
});

저장, 업데이트할 아이템을 JSON 형태로 작성합니다.

{
  "ExampleTable": [
    {
      "DeleteRequest": {
        "Key": {
          "someKey1": {
            "S": "Hello String"
          }
        }
      }
    },
    {
      "PutRequest": {
        "Item": {
          "someKey1": {
            "S": "World String"
          }
        }
      }
    }
  ]
}

--request-items 옵션에 작성한 JSON을 한 줄로 만들고 ' '(작은 따옴표)로 묶어서 설정합니다.

AWS CLI
$ aws dynamodb batch-write-item --request-items '{ "ExampleTable": [ { "DeleteRequest": { "Key": { "someKey1": { "S": "Hello String" } } } }, { "PutRequest": { "Item": { "someKey1": { "S": "World String" } } } } ] }'

DynamoDB 테이블에서 아이템을 가져오는 방법은 다음과 같습니다.

  • Key: 가져올 아이템의 검색 키를 설정합니다. 문자열뿐만 아니라 문자열 배열, 숫자, 숫자 배열, 바이너리, 바이너리 배열도 설정할 수 있습니다.
  • TableName: 아이템을 가져올 테이블 이름을 설정합니다.
  • ConsistentRead: Strongly Consistent Read를 사용합니다. false로 설정하거나 이 옵션을 설정하지 않으면 Eventually Consistent Read를 사용합니다.
dynamodb_4.js
var AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');

dynamodb = new AWS.DynamoDB();

var params = {
  Key: { // 필수
    someKey1: {
      S: 'Hello String'
    }
  },
  TableName: 'ExampleTable', // 필수
  ConsistentRead: true
};

dynamodb.getItem(params, function (err, data) {
  if (err)
    console.log(err, err.stack);
  else
    console.log(data);
});

다음과 같이 가져올 아이템의 검색 키를 JSON 형태로 작성합니다.

{
  "someKey1": {
    "S": "Hello String"
  }
}

--key 옵션에 작성한 JSON을 한 줄로 만들고 ' '(작은 따옴표)로 묶어서 설정합니다.

AWS CLI
$  aws dynamodb get-item --table-name ExampleTable --key '{ "someKey1": { "S": "Hello String" } }' --no-consistent-read
$  aws dynamodb get-item --table-name ExampleTable --key '{ "someKey1": { "S": "Hello String" } }' --consistent-read

DynamoDB 테이블에서 여러 아이템을 가져오는 방법은 다음과 같습니다.

  • RequestItems: 가져올 아이템 목록입니다. 테이블 이름을 키로 설정합니다.
    • Keys: 가져올 아이템의 검색 키를 배열 형태로 설정합니다. 문자열뿐만 아니라 문자열 배열, 숫자, 숫자 배열, 바이너리, 바이너리 배열도 설정할 수 있습니다.
  • ConsistentRead: Strongly Consistent Read를 사용합니다. false로 설정하거나 이 옵션을 설정하지 않으면 Eventually Consistent Read를 사용합니다.
dynamodb_5.js
var AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');

dynamodb = new AWS.DynamoDB();

var params = {
  RequestItems: { // 필수
    'ExampleTable': {
      Keys: [ // 필수
        {
          someKey1: {
            S: 'Hello String'
          }
        },
        {
          someKey1: {
            S: 'World String'
          }
        }
      ],
      ConsistentRead: true  
    }
  }
};

dynamodb.batchGetItem(params, function (err, data) {
  if (err)
    console.log(err, err.stack);
  else
    console.log(data);
});

가져올 아이템의 검색 키 목록을 JSON 형태로 작성합니다.

{
  "ExampleTable": {
    "Keys": [
      {
        "someKey1": {
          "S": "Hello String"
        }
      },
      {
        "someKey1": {
          "S": "World String"
        }
      }
    ],
    "ConsistentRead": "true"
  }
}

--request-items 옵션에 작성한 JSON을 한 줄로 만들고 ' '(작은 따옴표)로 묶어서 설정합니다.

AWS CLI
$ aws dynamodb batch-get-item --request-items '{ "ExampleTable": { "Keys": [ { "someKey1": { "S": "Hello String" } }, { "someKey1": { "S": "World String" } } ], "ConsistentRead": "true" } }'

DynamoDB 테이블에 쿼리하는 방법은 다음과 같습니다.

  • KeyConditions: 검색할 키를 정의합니다.
    • ComparisonOperator: 검색 조건이며 EQ, NE, IN, LE, LT, GE, GT, BETWEEN, NOT_NULL, NULL, CONTAINS, NOT_CONTAINS, BEGINS_WITH이 있습니다. EQ를 제외한 다른 조건들은 범위 키(Range Key)에서 사용할 수 있습니다.
    • AttributeValueList: 검색할 키 목록을 배열 형태로 설정합니다.
  • TableName: 검색할 테이블의 이름을 설정합니다.
  • QueryFilter: 검색 결과를 설정한 조건대로 걸러내는 옵션입니다.
    • 검색 조건이며 EQ, NE, IN, LE, LT, GE, GT, BETWEEN, NOT_NULL, NULL, CONTAINS, NOT_CONTAINS, BEGINS_WITH이 있습니다.
    • AttributeValueList: 걸러낼 속성 목록을 배열 형태로 설정합니다.
  • ConsistentRead: Strongly Consistent Read를 사용합니다. false로 설정하거나 이 옵션을 설정하지 않으면 Eventually Consistent Read를 사용합니다.
dynamodb_6.js
var AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');

dynamodb = new AWS.DynamoDB();

var params = {
  KeyConditions: { // 필수
    someKey1: {
      ComparisonOperator: 'EQ',
      AttributeValueList: [
        {
          S: 'Hello String'
        }
      ]
    }
  },
  TableName: 'ExampleTable', // 필수
  QueryFilter: {
    someKey3: {
      ComparisonOperator: 'EQ',
      AttributeValueList: [
        {
          N: '1'
        }
      ]
    }
  },
  ConsistentRead: true
};

dynamodb.query(params, function (err, data) {
  if (err)
    console.log(err, err.stack);
  else
    console.log(data);
});

검색할 키를 JSON 형태로 작성합니다.

{
  "someKey1": {
    "ComparisonOperator": "EQ",
    "AttributeValueList": [
      {
        "S": "Hello String"
      }
    ]
  }
}

걸러낼 키를 JSON 형태로 작성합니다.

{
  "someKey3": {
  "ComparisonOperator": "EQ",
    "AttributeValueList": [
      {
        "N": "1"
      }
    ]
  }
}

--key-conditions, --query-filter 옵션에 작성한 JSON을 한 줄로 만들고 ' '(작은 따옴표)로 묶어서 설정합니다.

AWS CLI
$ aws dynamodb query --table-name ExampleTable --key-conditions '{ "someKey1": { "ComparisonOperator": "EQ", "AttributeValueList": [ { "S": "Hello String" } ] } }' --query-filter '{ "someKey3": { "ComparisonOperator": "EQ", "AttributeValueList": [ { "N": "1" } ] } }' --consistent-read

DynamoDB 테이블에서 스캔하는 방법은 다음과 같습니다.

  • TableName: 검색할 테이블의 이름을 설정합니다.
  • ScanFilter: 검색 결과를 설정한 조건대로 걸러내는 옵션입니다.
    • 검색 조건이며 EQ, NE, IN, LE, LT, GE, GT, BETWEEN, NOT_NULL, NULL, CONTAINS, NOT_CONTAINS, BEGINS_WITH이 있습니다.
    • AttributeValueList: 걸러낼 속성 목록을 배열 형태로 설정합니다.
dynamodb_7.js
var AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');

dynamodb = new AWS.DynamoDB();

var params = {
  TableName: 'ExampleTable', // 필수
  ScanFilter: {
    someKey3: {
      ComparisonOperator: 'EQ',
      AttributeValueList: [
        {
          N: '1'
        }
      ]
    }
  },
};

dynamodb.scan(params, function (err, data) {
  if (err)
    console.log(err, err.stack);
  else
    console.log(data);
});

걸러낼 키를 JSON 형태로 작성합니다.

{
  "someKey3": {
    "ComparisonOperator": "EQ",
    "AttributeValueList": [
      {
        "N": "1"
      }
    ]
  }
}

--scan-filter 옵션에 작성한 JSON을 한 줄로 만들고 ' '(작은 따옴표)로 묶어서 설정합니다.

AWS CLI
$ aws dynamodb scan --table-name ExampleTable --scan-filter '{ "someKey3": { "ComparisonOperator": "EQ", "AttributeValueList": [ { "N": "1" } ] } }'

다른 함수들의 사용 방법은 다음 링크를 참조하기 바랍니다.
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.