0
0

Azure Functionsのキュートリガーでキュートリガーが動くが関数が呼び出されないことを調べたメモ

Last updated at Posted at 2024-09-18

概要

下記のように、関数が何も実行されずポイズンキューに移動したことのみが表示される。


        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)"
  }
}

参考

host.json設定

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0