Мне нужно создать таблицы в моем 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