javascript - Hur man anropar en lambda-funktion i aws-sdk v3
Hur kan jag anropa en lambda-funktion med Javascript (TypeScript) aws-sdk v3?
Jag använder följande kod som inte verkar fungera:
// the payload (input) to the "my-lambda-func" is a JSON as follows:
const input = {
name: 'fake-name',
serial: 'fake-serial',
userId: 'fake-user-id'
};
// Payload of InvokeCommandInput is of type Uint8Array
const params: InvokeCommandInput = {
FunctionName: 'my-lambda-func-name',
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: input as unknown as Uint8Array, // <---- payload is of type Uint8Array
};
console.log('params: ', params); // <---- so far so good.
const result = await lambda.invoke(params);
console.log('result: ', result); // <---- it never gets to this line for some reason.
Jag ser detta felmeddelande i CloudWatch, är inte säker på om det är relevant för mitt problem dock:
Det första argumentet måste vara av typen sträng eller en instans av Buffer, ArrayBuffer, eller Array eller ett Array-likt objekt. Fick en instans av Object
Fråga:
Är koden ovan för att anropa en lambda-funktion korrekt? Eller finns det några bättre sätt?
Svar #1
Som ett alternativ till exemplet ovan kan du undvika att använda ett extra AWS-bibliotek och istället använda den inbyggda Node-funktionen Buffer.from.
Importera först det du behöver:
import { InvokeCommand, InvokeCommandInput, InvokeCommandOutput } from '@aws-sdk/client-lambda';
Definiera sedan din funktion
export class LambdaService {
async invokeFunction(name: string): Promise<void> {
try {
const payload = { name: name };
const input: InvokeCommandInput = {
FunctionName: "my-lambda-func-name",
InvocationType: "Event",
Payload: Buffer.from(JSON.stringify(payload), "utf8"),
};
const command = new InvokeCommand(input);
const res : InvokeCommandOutput = await lambdaClient.send(command);
} catch (e) {
logger.error("error triggering function", e as Error);
}
}
}
Anropa det sedan med:
const lambdaService = new LambdaService();
await lambdaService.invokeFunction("name");
Om du missar await är det möjligt att funktionen börjar köras men aldrig når den sista raden.
Svar #2
Det ser ut som att ditt anrop till lambda.invoke() orsakar ett TypeError eftersom den payload som du skickar till det är ett objekt när det behöver vara en Uint8Array-buffer.
Du kan ändra din kod på följande sätt för att skicka med payloaden:
// import { fromUtf8 } from "@aws-sdk/util-utf8-node";
const { fromUtf8 } = require("@aws-sdk/util-utf8-node");
// the payload (input) to the "my-lambda-func" is a JSON as follows:
const input = {
name: 'fake-name',
serial: 'fake-serial',
userId: 'fake-user-id'
};
// Payload of InvokeCommandInput is of type Uint8Array
const params: InvokeCommandInput = {
FunctionName: 'my-lambda-func-name',
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: fromUtf8(JSON.stringify(input)),
};
