107 lines
2.6 KiB
TypeScript
107 lines
2.6 KiB
TypeScript
import * as dynamodb from '@aws-sdk/client-dynamodb'
|
|
import util from 'util'
|
|
|
|
const format = (x: any): string => util.inspect(x, { depth: null, colors: true })
|
|
|
|
const getEnv = (envName: string): string => {
|
|
const envValue = process.env[envName]
|
|
if (!envValue) {
|
|
throw new Error(`${envName} is required`)
|
|
}
|
|
return envValue
|
|
}
|
|
|
|
const endpoint = getEnv('endpoint')
|
|
const table_name = getEnv('table_name')
|
|
const partition_key = getEnv('partition_key')
|
|
const sort_key = getEnv('sort_key')
|
|
const index_name = getEnv('index_name')
|
|
const index_sort_key = getEnv('index_sort_key')
|
|
|
|
console.info(`### endpoint=${endpoint} ###`)
|
|
console.info(`### table_name=${table_name} ###`)
|
|
console.info(`### partition_key=${partition_key} ###`)
|
|
console.info(`### sort_key=${sort_key} ###`)
|
|
console.info(`### index_name=${index_name} ###`)
|
|
console.info(`### index_sort_key=${index_sort_key} ###`)
|
|
|
|
const main = async () => {
|
|
const ddbClient = new dynamodb.DynamoDBClient({
|
|
endpoint,
|
|
})
|
|
|
|
const listTablesCmd = new dynamodb.ListTablesCommand({})
|
|
const listTablesRes = await ddbClient.send(listTablesCmd)
|
|
if (listTablesRes.TableNames?.includes(table_name)) {
|
|
console.info(`Table ${table_name} already exists. Skipping creation.`)
|
|
return
|
|
}
|
|
|
|
const createTableCmd = new dynamodb.CreateTableCommand({
|
|
TableName: table_name,
|
|
AttributeDefinitions: [
|
|
{
|
|
AttributeName: partition_key,
|
|
AttributeType: 'S',
|
|
},
|
|
{
|
|
AttributeName: sort_key,
|
|
AttributeType: 'S',
|
|
},
|
|
{
|
|
AttributeName: index_sort_key,
|
|
AttributeType: 'S',
|
|
},
|
|
],
|
|
KeySchema: [
|
|
{
|
|
AttributeName: partition_key,
|
|
KeyType: 'HASH',
|
|
},
|
|
{
|
|
AttributeName: sort_key,
|
|
KeyType: 'RANGE',
|
|
},
|
|
],
|
|
BillingMode: 'PAY_PER_REQUEST',
|
|
LocalSecondaryIndexes: [
|
|
{
|
|
IndexName: index_name,
|
|
KeySchema: [
|
|
{
|
|
AttributeName: partition_key,
|
|
KeyType: 'HASH',
|
|
},
|
|
{
|
|
AttributeName: index_sort_key,
|
|
KeyType: 'RANGE',
|
|
},
|
|
],
|
|
Projection: {
|
|
ProjectionType: 'KEYS_ONLY',
|
|
},
|
|
},
|
|
],
|
|
})
|
|
|
|
await ddbClient.send(createTableCmd)
|
|
|
|
const describeTableCmd = new dynamodb.DescribeTableCommand({
|
|
TableName: table_name,
|
|
})
|
|
|
|
const describeTableRes = await ddbClient.send(describeTableCmd)
|
|
|
|
console.info('### Table Description ###')
|
|
console.info(format(describeTableRes.Table))
|
|
}
|
|
|
|
void main()
|
|
.then(() => {
|
|
process.exit(0)
|
|
})
|
|
.catch((err) => {
|
|
console.error(err)
|
|
process.exit(1)
|
|
})
|