Я использую localstack и awslocal
для запуска локальных служб AWS внутри контейнера docker.
Локальный стек настроен с файлом docker-compose.yml
.
Тесты написаны с использованием Jest и AWS Node JS sdk для DynamoDB.
'use strict';
const { dbClient, db } = require('../../adapters/dynamodb');
const dbSchema = {
TableName: 'DUMMY',
KeySchema: [
{
AttributeName: 'dummyId',
KeyType: 'HASH',
},
],
AttributeDefinitions: [
{
AttributeName: 'dummyId',
AttributeType: 'S',
},
],
ProvisionedThroughput: {
ReadCapacityUnits: 100,
WriteCapacityUnits: 100,
},
};
it('create DUMMY table', async () => {
const { TableNames } = await db.listTables().promise();
if (!TableNames.includes('DUMMY')) {
const { TableDescription } = await db.createTable(dbSchema).promise();
expect(TableDescription.TableName).toEqual('DUMMY');
}
});
it('write/read to DUMMY table', async () => {
await dbClient
.put({
TableName: 'DUMMY',
Item: {
dummyId: '123456',
selectedIds: ['1', '2', '3'],
},
})
.promise();
const { Item } = await dbClient
.get({
TableName: 'DUMMY',
Key: {
dummyId: '123456',
},
})
.promise();
expect(Item.dummyId).toEqual('123456');
expect(Item.selectedIds).toEqual(['1', '2', '3']);
});
it('delete DUMMY table', async () => {
const { TableNames } = await db.listTables().promise();
if (TableNames.includes('DUMMY')) {
const result = await db.deleteTable({ TableName: 'DUMMY' }).promise();
expect(result.TableDescription.TableName).toEqual('DUMMY');
}
}, 25000);
Ошибка Jest в последнем тесте, и dymanodb sdk выдает указанное исключение:
I tried using the awslocal
cli для репликации эта проблема не является шуткой, и происходит то же самое (используются официальные aws документы для примеров команд cli):
awslocal dynamodb create-table --table-name MusicCollection --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
-> работает!
awslocal dynamodb list-tables
-> работает! Выполняет выход из списка существующих таблиц: {"TableNames": ["MusicCollection"]}
awslocal dynamodb delete-table --table-name MusicCollection
... и я получаю то же исключение: An error occurred (ResourceNotFoundException) when calling the DeleteTable operation: Cannot do operations on a non-existent table
И теперь лучшая часть. Несмотря на то, что генерируется исключение, таблица удаляется:
Honestly, it's hard to come up with an explanation here, but I feel that there is something simple that I'm missing! Any help is appreciated <3</p>
UPDATE:
It's not 100% confirmed yet, but in DynamoDB docs только deleteItem
считается идемпотентным, но не deleteTable
, что означает, что это может быть проблемой здесь.