Skip to content

Map state machines in DISTRIBUTED mode bug #542

@ParsonsProjects

Description

@ParsonsProjects

This is a Bug Report

Description

What went wrong?

When using the DISTRIBUTED mode for a Map state the following error is thrown from compileIamRole.js.

What did you expect should have happened?

Serverless file deploys correctly.

What was the config you used?

Type: Map ItemProcessor: ProcessorConfig: Mode: DISTRIBUTED ExecutionType: STANDARD StartAt: Lambda States: Lambda: Type: Task Resource: "arn:aws:states:::lambda:invoke" Parameters: "Payload.$": "$" FunctionName: "Fn::GetAtt": [AssetLambdaFunction, Arn] End: true Retry: - ErrorEquals: - States.TaskFailed IntervalSeconds: 1 MaxAttempts: 2 BackoffRate: 2.0 Next: Done Label: FileAnalysis MaxConcurrency: 1000 ItemBatcher: MaxItemsPerBatch: 1 ItemReader: Resource: "arn:aws:states:::s3:getObject" ReaderConfig: InputType: "JSON" Parameters: Bucket.$: $.object.bucket Key.$: $.object.key 

What stacktrace or error message from your provider did you see?

TypeError: Cannot read property 'States' of undefined at C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless-step-functions\lib\deploy\stepFunctions\compileIamRole.js:22:42 at C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\lodash\lodash.js:3585:27 at C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\lodash\lodash.js:4967:15 at baseForOwn (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\lodash\lodash.js:3032:24) at C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\lodash\lodash.js:4936:18 at baseMap (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\lodash\lodash.js:3584:7) at map (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\lodash\lodash.js:9622:14) at Function.flatMap (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\lodash\lodash.js:9325:26) at getTaskStates (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless-step-functions\lib\deploy\stepFunctions\compileIamRole.js:12:12) at C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless-step-functions\lib\deploy\stepFunctions\compileIamRole.js:576:26 at Array.forEach (<anonymous>) at ServerlessStepFunctions.compileIamRole (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless-step-functions\lib\deploy\stepFunctions\compileIamRole.js:566:32) at processImmediate (internal/timers.js:464:21) From previous event: at package:compileFunctions (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless-step-functions\lib\index.js:122:10) at PluginManager.runHooks (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless\lib\classes\plugin-manager.js:530:15) at async PluginManager.invoke (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless\lib\classes\plugin-manager.js:564:9) at async PluginManager.spawn (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless\lib\classes\plugin-manager.js:585:5) at async before:deploy:deploy (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless\lib\plugins\deploy.js:40:11) at async PluginManager.runHooks (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless\lib\classes\plugin-manager.js:530:9) at async PluginManager.invoke (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless\lib\classes\plugin-manager.js:563:9) at async PluginManager.run (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless\lib\classes\plugin-manager.js:604:7) at async Serverless.run (C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless\lib\serverless.js:170:5) at async C:\Users\alan_\Work\Projects\craftsman-serverless-api\node_modules\serverless\scripts\serverless.js:787:9 child_process.js:790 err = new Error(msg); ^ Error: Command failed: npx cross-env NODE_ENV=development bash bin/deploy.sh -o encoder at checkExecSyncError (child_process.js:790:11) at execSync (child_process.js:863:15) at file:///C:/Users/alan_/Work/Projects/craftsman-serverless-api/scripts/deploy.mjs:30:3 at ModuleJob.run (internal/modules/esm/module_job.js:183:25) at async Loader.import (internal/modules/esm/loader.js:178:24) at async Object.loadESM (internal/process/esm_loader.js:68:5) at async handleMainPromise (internal/modules/run_main.js:59:12) { status: 1, signal: null, output: [ null, null, null ], pid: 28572, stdout: null, stderr: null } 

Additional Data

  • 3.21.0:
  • 3.11.1:
  • Windows:

Solution

There is a very simple solution for this, updating the switch case for Map to use either Iterator or ItemProcessor

function getTaskStates(states) { return _.flatMap(states, (state) => { switch (state.Type) { case 'Task': { return [state]; } case 'Parallel': { const parallelStates = _.flatMap(state.Branches, branch => _.values(branch.States)); return getTaskStates(parallelStates); } case 'Map': { const mapStates = state?.Iterator?.States || state?.ItemProcessor?.States; return getTaskStates(mapStates); } default: { return []; } } }); } 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions