Localstack + Jest: DynamoDB выбрасывает исключение ResourceNotFoundException в deleteTable для существующей таблицы - PullRequest
1 голос
/ 09 июля 2020

Я использую 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 выдает указанное исключение:

Jest fail

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

И теперь лучшая часть. Несмотря на то, что генерируется исключение, таблица удаляется: enter image description here enter image description here

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, что означает, что это может быть проблемой здесь.

...