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

stepfunctions-local未加载MockConfigFile,调用Lambda时报错

本地运行AWS Step Functions Local时MockConfigFile未生效,调用Lambda报安全令牌错误

问题详情

使用amazon/aws-stepfunctions-local镜像本地运行AWS Step Functions,无论是在jest测试中通过testcontainers启动容器,还是直接通过docker cli启动容器,均遇到问题:使用MockConfigFile创建并执行状态机时,调用Lambda的步骤报错「请求中包含的安全令牌无效」。

错误日志

2023-07-13 20:09:27.708: arn:aws:states:us-east-1:123456789012:execution:createApp:5cc02245-ce24-4e28-a3de-25edd6a81ce7 : {"Type":"TaskFailed","PreviousEventId":4,"TaskFailedEventDetails":{"ResourceType":"lambda","Resource":"invoke","Error":"Lambda.AWSLambdaException","Cause":"The security token included in the request is invalid. (Service: AWSLambda; Status Code: 403; Error Code: UnrecognizedClientException; Request ID: 4cc1f11b-cc78-4092-8733-c77397823ee2; Proxy: null)"}}

容器启动代码

const mockFileContainerPath = '/home/stepfunctionslocal/MockConfigFile.json';
let container;
let host;
let port;
const exposedPort = 8083;
process.env.TESTCONTAINERS_RYUK_DISABLED = true;
jest.setTimeout(90000);
beforeAll(async () => {
  container = await new GenericContainer('amazon/aws-stepfunctions-local')
    .withExposedPorts(exposedPort)
    .withLogConsumer(stream => {
      stream.on("data", line => console.info(line));
      stream.on("err", line => console.error(line));
      stream.on("end", () => console.info("Stream closed"));
    })
    .withBindMounts([{
      source: path.resolve('./step-function-tests/assets/MockConfigFile.json'),
      target: mockFileContainerPath,
      mode: "ro"
    }])
    .withEnvironment({
      SFN_MOCK_CONFIG: mockFileContainerPath},
      AWS_ACCESS_KEY_ID: "blahblah",
      AWS_SECRET_ACCESS_KEY: "supersecret"
    })
    .withWaitStrategy(
      Wait.forLogMessage(RegExp(`.*Starting server on port ${exposedPort}.*`))
    ).start();
  host = container.getHost();
  port = container.getMappedPort(exposedPort);
});

MockConfigFile内容

{
  "StateMachines": {
    "createApp": {
      "TestCases": {
        "HappyPath": {
          "Create application": "MockedCreateApplicationSuccess"
        }
      }
    }
  },
  "MockedResponses": {
    "MockedCreateApplicationSuccess": {
      "0": {
        "Return": {
          "StatusCode": 200,
          "Payload": {
            "hello": "world"
          }
        }
      }
    }
  }
}

注:「Create application」是调用Lambda函数的状态名称。


问题解答

1. MockConfigFile加载是否有日志提示?

有。Step Functions Local启动时,如果成功加载mock配置文件,会输出类似如下日志:

Loaded mock config from /home/stepfunctionslocal/MockConfigFile.json

如果文件路径错误、权限不足或JSON格式非法,会输出加载失败的错误日志(比如文件找不到、解析错误等)。

2. Mock未生效的原因及修复方案

核心问题:环境变量配置格式错误

你的withEnvironment参数格式写错了——将环境变量拆成了两个独立对象,导致SFN_MOCK_CONFIG未被正确传入容器,Step Functions Local根本没有读取到mock配置,因此会尝试真实调用Lambda,进而触发令牌无效错误。

修复后的环境变量配置:

.withEnvironment({
  SFN_MOCK_CONFIG: mockFileContainerPath,
  AWS_ACCESS_KEY_ID: "blahblah",
  AWS_SECRET_ACCESS_KEY: "supersecret"
})

额外验证点

  • 执行状态机时必须指定测试用例:启动状态机执行时,需要在请求中指定testCase参数(比如在StartExecution的input中加入"__test_case__": "HappyPath"),否则Step Functions Local不会启用mock逻辑。
  • 匹配规则严格一致:确保状态机名称(createApp)、任务状态名称(「Create application」)与mock配置中的内容完全匹配(大小写、空格、符号都不能出错)。

内容的提问来源于stack exchange,提问作者Kevin Alcozar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:55:34