概要
下記のように、関数が何も実行されずポイズンキューに移動したことのみが表示される。
storageQueueTrigger1: queueTrigger
For detailed output, run func with --verbose flag.
[2024-09-18T23:34:50.594Z] Message has reached MaxDequeueCount of 2. Moving message to queue 'character-queue-poison'.
原因
トリガー側ではなく、キューに入れる側の問題。base64で入れなくてはならない。
分かりにくすぎる、、!
修正
base64エンコードする方法
/* eslint-disable @typescript-eslint/no-explicit-any */
import { ContainerClient } from '@azure/storage-blob';
import { QueueClient } from '@azure/storage-queue';
type SendQueueAndBlobArgs = {
containerClient: ContainerClient;
queueClient: QueueClient;
blobPath: string;
blobData: string;
messageTimeToLive: number;
logger: {
log: (...args: any[]) => void;
info: (...args: any[]) => void;
error: (...args: any[]) => void;
};
};
export const sendQueueAndBlobContainer = async (
args: SendQueueAndBlobArgs,
): Promise<void> => {
const {
containerClient,
queueClient,
blobPath,
blobData,
messageTimeToLive,
logger,
} = args;
const blobClient = containerClient.getBlockBlobClient(blobPath);
const blobResponse = await blobClient.upload(blobData, blobData.length);
logger.info(
`Uploaded blob "${blobPath}". Request Id: ${blobResponse.requestId}. Client Request Id: ${blobResponse.clientRequestId}. Container: ${containerClient.containerName}`,
);
const queueMessage = {
containerName: containerClient.containerName,
blobPath,
};
const queueResponse = await queueClient.sendMessage(
- JSON.stringify(queueMessage),
+ jsonToBase64(queueMessage),
{
messageTimeToLive,
},
);
logger.info(
`Sent message to queue "${queueClient.name}". Message Id: ${queueResponse.messageId}. Request Id: ${queueResponse.requestId}. Client Request Id: ${queueResponse.clientRequestId}`,
);
};
+ function jsonToBase64(jsonObj: unknown): string {
+ const jsonString = JSON.stringify(jsonObj);
+ return Buffer.from(jsonString).toString('base64');
+ }
参考
Azure Function Queue Trigger V2 がメッセージを読み取らない
別解: host.jsonを編集する方法
host.json
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"extensions": {
"http": {
"routePrefix": ""
},
"queues": {
"maxDequeueCount": 3,
+ "messageEncoding": "none"
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
参考