DynamoDB 사용해보기

문한성·2023년 6월 18일
0

부트캠프

목록 보기
111/123
post-thumbnail

DynamoDB AWS CLI로 테이블 생성

명령어와 설명


aws dynamodb create-table \
  --table-name users \
  --attribute-definitions \
    AttributeName=id,AttributeType=N \
    AttributeName=email,AttributeType=S \
  --key-schema \
    AttributeName=id,KeyType=HASH \
  --provisioned-throughput \
    ReadCapacityUnits=5,WriteCapacityUnits=5 \
  --global-secondary-indexes \
    '[
      {
        "IndexName": "email-index",
        "KeySchema": [
          {
            "AttributeName": "email",
            "KeyType": "HASH"
          }
        ],
        "Projection": {
          "ProjectionType": "ALL"
        },
        "ProvisionedThroughput": {
          "ReadCapacityUnits": 5,
          "WriteCapacityUnits": 5
        }
      }
    ]'
  1. aws dynamodb create-table: DynamoDB에서 테이블을 생성하는 CLI 명령어입니다.
  2. -table-name users: 생성할 테이블의 이름을 지정합니다. 이 경우 "users"라는 이름의 테이블을 생성합니다.
  3. -attribute-definitions: 테이블의 속성(필드)을 정의합니다. 이 경우 "id"라는 이름의 숫자형(AttributeType=N) 속성과 "email"이라는 문자열형(AttributeType=S) 속성을 정의합니다.
  4. -key-schema: 테이블의 주요 키(Primary Key) 스키마를 정의합니다. 이 경우 "id" 속성을 해시 키(KeyType=HASH)로 사용하여 주요 키를 구성합니다.
  5. -provisioned-throughput: 테이블에 대한 처리량(Throughput)을 정의합니다. 이 경우 읽기 처리량(ReadCapacityUnits)과 쓰기 처리량(WriteCapacityUnits) 모두 5로 설정합니다. Provisioned Throughput은 DynamoDB에서 테이블에 대한 처리량을 관리하는 데 사용됩니다.
  6. -global-secondary-indexes: 테이블에 글로벌 보조 인덱스(Global Secondary Index)를 생성합니다. 이 경우 "email-index"라는 인덱스를 생성합니다. 인덱스의 KeySchema는 "email" 속성을 해시 키로 사용하여 구성됩니다. Projection은 "ALL"로 설정되어 모든 속성을 포함합니다. ProvisionedThroughput은 읽기 처리량과 쓰기 처리량 모두 5로 설정됩니다.

위의 명령어를 실행하면 "users"라는 이름의 DynamoDB 테이블이 생성되고, "id" 속성을 주요 키로 사용하며, "email-index"라는 글로벌 보조 인덱스가 생성됩니다. 이 테이블은 읽기 및 쓰기 처리량이 모두 5로 설정된 상태로 생성됩니다.

email-index

"email-index"는 DynamoDB의 "users" 테이블에 생성된 글로벌 보조 인덱스(GSI)입니다. 글로벌 보조 인덱스를 사용하면 기본 키 이외의 속성을 기반으로 데이터를 효율적으로 쿼리하기 위한 대체 키 스키마를 정의할 수 있습니다.

이 경우 "email" 속성을 기반으로 효율적인 쿼리 기능을 제공하기 위해 "email-index"가 생성됩니다. 인덱스의 구성 요소를 분석해 보겠습니다.

  • IndexName: 인덱스의 이름을 지정합니다. 이 경우 "email-index"입니다.
  • KeySchema: 인덱스에 대한 키 스키마를 정의합니다. 키 스키마는 인덱스 키로 사용할 속성을 지정합니다. 이 경우 "email" 속성은 HASH 키로 지정되며 이는 인덱스 내에서 데이터 분할을 결정하는 데 사용됨을 의미합니다.
  • Projection: 기본 테이블의 어떤 속성이 인덱스에 투영되는지 결정합니다. 이 예에서 "ProjectionType"은 "ALL"로 설정되며 이는 기본 테이블(사용자)의 모든 특성이 인덱스에 포함됨을 의미합니다. 이를 통해 기본 테이블에서 데이터를 가져올 필요 없이 인덱스에서 직접 사용자 속성을 검색할 수 있습니다.
  • ProvisionedThroughput: 기본 테이블에 대한 프로비저닝된 처리량 설정과 유사하게 인덱스에 대해 프로비저닝된 처리량 설정을 지정합니다. 이 경우 인덱스의 읽기 용량은 5이고 쓰기 용량은 5입니다.

"email-index"를 생성하면 이제 "email" 속성을 검색 기준으로 사용하여 "users" 테이블에 대해 빠르고 효율적인 쿼리를 수행할 수 있습니다. 이 인덱스를 사용하면 전체 테이블을 스캔할 필요 없이 이메일 주소를 기반으로 사용자 레코드를 검색할 수 있습니다. 인덱스는 지정된 대체 키(이 경우 이메일 속성)를 기반으로 데이터에 대한 직접 액세스를 허용하여 쿼리 성능을 향상시킵니다.

  1. 데이터 삽입:
    먼저 "users" 테이블에 몇 가지 샘플 데이터를 삽입해 보겠습니다.
aws dynamodb put-item \
  --table-name users \
  --item '{
    "id": {"N": "1"},
    "email": {"S": "john@example.com"},
    "name": {"S": "John Doe"}
  }'
  1. 이메일로 문의하기:
    이제 "email-index"를 사용하여 email 속성을 기반으로 "users" 테이블을 쿼리할 수 있습니다.
aws dynamodb query \
  --table-name users \
  --index-name email-index \
  --key-condition-expression "email = :email" \
  --expression-attribute-values '{
    ":email": {"S": "john@example.com"}
  }'

이 쿼리는 "email-index"를 사용하여 "users" 테이블에서 "john@example.com" 이메일이 있는 사용자를 검색합니다. --index-name 플래그는 사용할 인덱스의 이름을 지정하고 --key-condition-expression은 쿼리 조건을 정의합니다. 이 경우 이메일 속성에 대한 정확한 일치를 쿼리하고 있습니다.

응답에는 쿼리 기준과 일치하는 사용자 데이터가 포함됩니다. 이 예에서는 이름이 "John Doe"이고 이메일이 "john@example.com"인 사용자를 반환합니다.

DynamoDB에 데이터 넣어보기

username : hansung
birth : 991002
email : test@gmail.com
password : 1234
profile_img_url : testURL
role : 1
created_at : 2023-06-17

aws dynamodb put-item \
--table-name users \
--item '{
"id": {"N": "1"},
"email": {"S": "[test@gmail.com](mailto:test@gmail.com)"},
"username": {"S": "hansung"},
"birth": {"S": "991002"},
"password": {"S": "1234"},
"profile_img_url": {"S": "testURL"},
"role": {"N": "1"},
"created_at": {"S": "2023-06-17"}
}'

ECS에서 DynamoDB에서 데이터 가져오기

로그인을 위한 DynamoDB 조회

const express = require('express');
const app = express();
const AWS = require('aws-sdk');
const jwt = require('jsonwebtoken');

AWS.config.update({
  region: 'ap-northeast-2', 
  accessKeyId: 'accessKeyId',
  secretAccessKey: 'secretAccessKey'
}); // Replace with your desired AWS region

const dynamodb = new AWS.DynamoDB.DocumentClient();
const tableName = 'users';

app.use(express.json()); // Parse JSON request bodies

// Route for login
app.post('/login', (req, res) => {
  const { email, password } = req.body;

  const params = {
    TableName: "users",
    FilterExpression: "email = :email",
    ExpressionAttributeValues: {
        ":email": email
    }
  };
  
  dynamodb.scan(params, (err, data) => {
    if (err) {
      console.error('Error while querying DynamoDB:', err);
      res.status(500).json({ error: 'An error occurred while verifying the login.' });
    } else {
      const user = data.Items[0];
      if (user && user.password === password) {
        // Generate JWT token
        const token = jwt.sign({ username: email }, 'your-secret-key', { expiresIn: '1h' });
        res.json({ token });
      } else {
        res.status(401).json({ error: 'Invalid username or password.' });
      }
    }
  });
});

app.get('/', async (req, res) => {

  res.status(200).json({ message: 'Healthy check success!' });

});

// Start the server
const port = 3000; // Change to your desired port number
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

ECS로 DynamoDB접근중 권한 에러 발생

에러

ECS로 DynamoDB에 데이터를 넣는 test 코드를 띄워서 접근을 시도했으나
권한 부분의 에러가 발생하였다.

test code

const express = require('express');
const app = express();
const AWS = require('aws-sdk');

const dynamodb = new AWS.DynamoDB.DocumentClient();

app.get('/test', (req, res) => {
  const params = {
    TableName: 'users',
    Item: {
      id: 2,
      email: 'test2@gmail.com',
      username: 'hansung',
      birth: '991002',
      password: '1234',
      profile_img_url: 'testURL',
      role: 1,
      created_at: '2023-06-17',
    },
  };

  dynamodb.put(params, (err, data) => {
    if (err) {
      console.error('Error adding data to DynamoDB:', err);
      res.status(500).send('Error adding data to DynamoDB');
    } else {
      console.log('Data added to DynamoDB successfully:', data);
      res.send('Data added to DynamoDB successfully');
    }
  });
});

해결법

  1. AWS Management Console에서 AWS Identity and Access Management(IAM) 서비스로 이동합니다.
  2. 좌측 메뉴에서 "Roles"를 선택합니다.
  3. ecsTaskExecutionRole을 찾고 해당 역할을 선택합니다.
  4. "Permissions" 탭으로 이동합니다.
  5. "Attach policies" 버튼을 클릭하여 새로운 정책을 추가합니다.
  6. 정책 검색 상자에 "AmazonDynamoDBReadOnlyAccess"를 입력하고 해당 정책을 선택합니다.
  7. "Attach policy" 버튼을 클릭하여 정책을 역할에 추가합니다.
  8. 변경 사항을 저장합니다.

정책은 ReadOnlyAccess가 아닌 다른 필요한 정책들이 더있다면 추가할 수 있다.

profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글