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
}
}
]'
aws dynamodb create-table
: DynamoDB에서 테이블을 생성하는 CLI 명령어입니다.-table-name users
: 생성할 테이블의 이름을 지정합니다. 이 경우 "users"라는 이름의 테이블을 생성합니다.-attribute-definitions
: 테이블의 속성(필드)을 정의합니다. 이 경우 "id"라는 이름의 숫자형(AttributeType=N) 속성과 "email"이라는 문자열형(AttributeType=S) 속성을 정의합니다.-key-schema
: 테이블의 주요 키(Primary Key) 스키마를 정의합니다. 이 경우 "id" 속성을 해시 키(KeyType=HASH)로 사용하여 주요 키를 구성합니다.-provisioned-throughput
: 테이블에 대한 처리량(Throughput)을 정의합니다. 이 경우 읽기 처리량(ReadCapacityUnits)과 쓰기 처리량(WriteCapacityUnits) 모두 5로 설정합니다. Provisioned Throughput은 DynamoDB에서 테이블에 대한 처리량을 관리하는 데 사용됩니다.-global-secondary-indexes
: 테이블에 글로벌 보조 인덱스(Global Secondary Index)를 생성합니다. 이 경우 "email-index"라는 인덱스를 생성합니다. 인덱스의 KeySchema는 "email" 속성을 해시 키로 사용하여 구성됩니다. Projection은 "ALL"로 설정되어 모든 속성을 포함합니다. ProvisionedThroughput은 읽기 처리량과 쓰기 처리량 모두 5로 설정됩니다.위의 명령어를 실행하면 "users"라는 이름의 DynamoDB 테이블이 생성되고, "id" 속성을 주요 키로 사용하며, "email-index"라는 글로벌 보조 인덱스가 생성됩니다. 이 테이블은 읽기 및 쓰기 처리량이 모두 5로 설정된 상태로 생성됩니다.
"email-index"는 DynamoDB의 "users" 테이블에 생성된 글로벌 보조 인덱스(GSI)입니다. 글로벌 보조 인덱스를 사용하면 기본 키 이외의 속성을 기반으로 데이터를 효율적으로 쿼리하기 위한 대체 키 스키마를 정의할 수 있습니다.
이 경우 "email" 속성을 기반으로 효율적인 쿼리 기능을 제공하기 위해 "email-index"가 생성됩니다. 인덱스의 구성 요소를 분석해 보겠습니다.
IndexName
: 인덱스의 이름을 지정합니다. 이 경우 "email-index"입니다.KeySchema
: 인덱스에 대한 키 스키마를 정의합니다. 키 스키마는 인덱스 키로 사용할 속성을 지정합니다. 이 경우 "email" 속성은 HASH 키로 지정되며 이는 인덱스 내에서 데이터 분할을 결정하는 데 사용됨을 의미합니다.Projection
: 기본 테이블의 어떤 속성이 인덱스에 투영되는지 결정합니다. 이 예에서 "ProjectionType"은 "ALL"로 설정되며 이는 기본 테이블(사용자)의 모든 특성이 인덱스에 포함됨을 의미합니다. 이를 통해 기본 테이블에서 데이터를 가져올 필요 없이 인덱스에서 직접 사용자 속성을 검색할 수 있습니다.ProvisionedThroughput
: 기본 테이블에 대한 프로비저닝된 처리량 설정과 유사하게 인덱스에 대해 프로비저닝된 처리량 설정을 지정합니다. 이 경우 인덱스의 읽기 용량은 5이고 쓰기 용량은 5입니다."email-index"를 생성하면 이제 "email" 속성을 검색 기준으로 사용하여 "users" 테이블에 대해 빠르고 효율적인 쿼리를 수행할 수 있습니다. 이 인덱스를 사용하면 전체 테이블을 스캔할 필요 없이 이메일 주소를 기반으로 사용자 레코드를 검색할 수 있습니다. 인덱스는 지정된 대체 키(이 경우 이메일 속성)를 기반으로 데이터에 대한 직접 액세스를 허용하여 쿼리 성능을 향상시킵니다.
aws dynamodb put-item \
--table-name users \
--item '{
"id": {"N": "1"},
"email": {"S": "john@example.com"},
"name": {"S": "John Doe"}
}'
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"인 사용자를 반환합니다.
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"}
}'
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에 데이터를 넣는 test 코드를 띄워서 접근을 시도했으나
권한 부분의 에러가 발생하였다.
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');
}
});
});
ecsTaskExecutionRole
을 찾고 해당 역할을 선택합니다.정책은 ReadOnlyAccess가 아닌 다른 필요한 정책들이 더있다면 추가할 수 있다.