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
相关产品推荐
相关产品推荐

