You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS SDK for JavaScript测试CloudFront Function时出现内部错误

问题描述

我有一个CloudFront Function,正尝试使用AWS SDK for JavaScript对其进行测试,代码如下:

const client = new CloudFrontClient(); // configured using env variables
const eventObject = require("./my_event.json");
const input = {
  Name: "my-function",
  IfMatch: etag, // I get this value from describe-function
  EventObject: Uint8Array.from(eventObject)
};
const command = new TestFunctionCommand(input);
const response = await client.send(command);
console.log(response);

运行代码时,我收到了服务器错误:

{
  '$fault': 'client',
  '$metadata': {
    httpStatusCode: 500,
    requestId: '...',
    extendedRequestId: undefined,
    cfId: undefined,
    attempts: 3,
    totalRetryDelay: 234
  },
  Type: 'Receiver',
  Code: 'InternalError'
}

my_event.json格式合法,但使用AWS CLI执行相同命令时却能正常运行:

$ aws cloudfront test-function --name my_function --if-match whatever --event-object fileb://my_event.json

请问我哪里操作有误?该如何进行调试?

问题原因与解决方案

核心错误点

你代码里的Uint8Array.from(eventObject)是错误操作。require("./my_event.json")会直接把JSON文件解析成JavaScript对象,而Uint8Array.from()无法将JS对象转换为CloudFront期望的原始字节流。AWS CLI用fileb://是直接读取文件的原始二进制内容,两者的输入格式完全不匹配。

正确实现方式

需要直接读取JSON文件的原始二进制内容,而非先解析成JS对象,用Node.js的fs模块即可实现:

同步读取方式

const fs = require('fs');
const client = new CloudFrontClient(); // configured using env variables
const eventObjectBuffer = fs.readFileSync("./my_event.json");
const input = {
  Name: "my-function",
  IfMatch: etag, // 从describe-function获取的正确ETag
  EventObject: eventObjectBuffer
};
const command = new TestFunctionCommand(input);
const response = await client.send(command);
console.log(response);

异步读取方式(适配async/await场景)

const fs = require('fs').promises;
const client = new CloudFrontClient(); // configured using env variables
const eventObjectBuffer = await fs.readFile("./my_event.json");
const input = {
  Name: "my-function",
  IfMatch: etag, // 从describe-function获取的正确ETag
  EventObject: eventObjectBuffer
};
const command = new TestFunctionCommand(input);
const response = await client.send(command);
console.log(response);

调试建议

  • 对比请求内容:开启AWS SDK的调试日志,查看发送的请求字节流和CLI请求是否一致,初始化客户端时添加日志配置:
    const client = new CloudFrontClient({
      logger: console,
      logLevel: 'debug'
    });
    
  • 验证ETag准确性:确保etag变量的值和describe-function返回的ETag完全一致(包括外层引号,比如"abc123"而非abc123)。
  • 检查凭证一致性:确认SDK使用的AWS凭证和CLI的是同一套,避免因权限差异导致隐性错误。
  • 手动构造字节流:如果仍有问题,可以尝试将解析后的JS对象重新序列化为UTF-8编码的Buffer:Buffer.from(JSON.stringify(eventObject), 'utf8'),但优先推荐直接读取文件原始内容。

内容的提问来源于stack exchange,提问作者Héctor Valls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:22:21