AWS Лямбда настраиваемого ресурса CloudFormation застряла в состоянии создания, когда обработчик лямбда является асинхронным - PullRequest
0 голосов
/ 04 августа 2020

Мне нужно создать таблицы в моем RDS Postgres. Я собираюсь сделать это через пользовательские ресурсы. Но по некоторым причинам лямбда, отвечающая за создание таблицы, застревает. Не могли бы вы подсказать, что может быть причиной root?

Стек:

export class RdsMigrationStack extends NestedStack {
    readonly rdsMigrationResource: RdsMigrationResource

    constructor(scope: Construct, id: string, props?: NestedStackProps) {
        super(scope, id, props);
        
        this.rdsMigrationResource = new RdsMigrationResource(this, id + '-rds-migration', props);
    }
}

Пользовательский ресурс:

export class RdsMigrationResource extends Construct {
    const rdsMigrationHandler: IFunction;
    constructor(scope: Construct, id: string, props?: NestedStackProps) {
        super(scope, id);

        this.rdsMigrationHandler = new lambda.Function(this, id + '-rds-migration', {
            functionName: env("ENV_NAME") + "-rds-migration",
            runtime: lambda.Runtime.NODEJS_12_X,
            timeout: Duration.seconds(60),
            code: lambda.Code.fromAsset(codeLocation),
            handler: 'rds-migration/index.handler',
            environment: {
                DATABASE_URL: <some databaseUrl>
            },
            layers: [sharedLayer]
        });

        new CustomResource(this, id + '-rds-migration', {
            provider: CustomResourceProvider.lambda(this.rdsMigrationHandler),
        });
    }
}

Лямбда:

import { Context } from 'aws-lambda';
import { send, SUCCESS, FAILED } from 'cfn-response';
import { resolve } from 'path'

const marv = require('marv/api/promise')
const driver = require('marv-pg-driver')

export async function handler(event: any, context: Context) {
    console.log("Received event", JSON.stringify(event, null, 3))

    try {
        if (event.RequestType === "Create") {
            const directory = resolve("./rds-migration/migrations")
            const connection = {
                connectionString: process.env.DATABASE_URL
            }
            const migrations = await marv.scan(directory)
            await marv.migrate(migrations, driver({connection}))
        }

        await send(event, context, SUCCESS);
    } catch (error) {
        console.error(error)
        send(event, context, FAILED);
    }
}

Я полагаю, это может быть связано с тем, что обработчик asyn c. Когда я делаю его syn c, развертывание начинает работать, но это не вариант, потому что мне нужно вызвать «await migrateDB ();» и сделать обработчик asyn c любым способом

import { Context } from 'aws-lambda';
import { send, SUCCESS, FAILED } from 'cfn-response';
import { resolve } from 'path'

const marv = require('marv/api/promise')
const driver = require('marv-pg-driver')

export function handler(event: any, context: Context) {
    console.log("Received event", JSON.stringify(event, null, 3))

    try {
        if (event.RequestType === "Create") {
            migrateDB();
        }

        send(event, context, SUCCESS);
    } catch (error) {
        console.error(error)
        send(event, context, FAILED);
    }
}

async function migrateDB() {
    const directory = resolve("./rds-migration/migrations")
    const connection = {
        connectionString: process.env.DATABASE_URL
    }
    const migrations = await marv.scan(directory)
    await marv.migrate(migrations, driver({connection}))
}

Но я хотел бы знать, что не так с asyn c handler

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...