Skip to main content

A Step Function state machine construct focused on working well with the Workflow Studio

Project description

Workflow Studio compatible State Machine

View on Construct Hub

This is a Workflow Studio compatible AWS Step Function state machine construct.

The goal of this construct is to make it easy to build and maintain your state machines using the Workflow Studio but still leverage the AWS CDK as the source of truth for the state machine.

Read more about it here.

How to Use This Construct

Start by designing your initial state machine using the Workflow Studio. When done with your first draft, copy and paste the ASL definition to a local file.

Create a new instance of this construct, handing it a fully parsed version of the ASL. Then add overridden values. The fields in the overrides field should match the States field of the ASL.

Projen component

There is a projen component included in this library which will help you in using the construct. It works similar to the auto-discovery feature. To use it, first add the component to your projen project:

// ...
const { StepFunctionsAutoDiscover } = require('@matthewbonig/state-machine');

const project = new awscdk.AwsCdkTypeScriptApp({
  // ...,
  deps: [
    // ...,
    '@matthewbonig/state-machine',
  ]
});

new StepFunctionsAutoDiscover(project);

Now projen will look for any files with a suffix .workflow.json and generate new files beside the .json:

  • A typed overrides interface which is based on your workflow.
  • A construct derived from StateMachine that uses this override.

Instead of using the StateMachine construct directly you can now use the generated one:

.
├── MyFancyThing.workflow.json
└── MyFancyThing-statemachine.ts
export class SomeStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);
    const handler = new NodejsFunction(this, 'MyHandler');
    new SomeFancyThingStateMachine(this, 'MyFancyWorkflow', {
      overrides: {
        'My First State': {
          Parameters: {
            FunctionName: handler.functionName
          }
        }
      }
    })
  }
}

:warning: The interfaces and constructs generated here are NOT jsii compliant (they use Partials and Omits) and cannot be compiled by jsii into other languages. If you plan to distribute any libraries you cannot use this.

Examples

const secret = new Secret(stack, 'Secret', {});
new StateMachine(stack, 'Test', {
  stateMachineName: 'A nice state machine',
  definition: JSON.parse(fs.readFileSync(path.join(__dirname, 'sample.json'), 'utf8').toString()),
  overrides: {
    'Read database credentials secret': {
      Parameters: {
        SecretId: secret.secretArn,
      },
    },
  },
});

You can also override nested states in arrays, for example:

new StateMachine(stack, 'Test', {
    stateMachineName: 'A-nice-state-machine',
    overrides: {
      Branches: [{
        // pass an empty object too offset overrides
      }, {
        StartAt: 'StartInstances',
        States: {
          StartInstances: {
            Parameters: {
              InstanceIds: ['INSTANCE_ID'],
            },
          },
        },
      }],
    },
    stateMachineType: StateMachineType.STANDARD,
    definition: {
      States: {
        Branches: [
          {
            StartAt: 'ResumeCluster',
            States: {
              'Redshift Pass': {
                Type: 'Pass',
                End: true,
              },
            },
          },
          {
            StartAt: 'StartInstances',
            States: {
              'StartInstances': {
                Type: 'Task',
                Parameters: {
                  InstanceIds: [
                    'MyData',
                  ],
                },
                Resource: 'arn:aws:states:::aws-sdk:ec2:startInstances',
                Next: 'DescribeInstanceStatus',
              },
              'DescribeInstanceStatus': {
                Type: 'Task',
                Next: 'EC2 Pass',
                Parameters: {
                  InstanceIds: [
                    'MyData',
                  ],
                },
                Resource: 'arn:aws:states:::aws-sdk:ec2:describeInstanceStatus',
              },
              'EC2 Pass': {
                Type: 'Pass',
                End: true,
              },
            },
          },
        ],
      },
    },
  });

For Python, be sure to use a context manager when opening your JSON file.

  • You do not need to str() the dictionary object you supply as your definition prop.
  • Elements of your override path do need to be strings.
secret = Secret(stack, 'Secret')

with open('sample.json', 'r+', encoding='utf-8') as sample:
    sample_dict = json.load(sample)

state_machine = StateMachine(
    self,
    'Test',
    definition = sample_dict,
    overrides = {
    "Read database credentials secret": {
      "Parameters": {
        "SecretId": secret.secret_arn,
      },
    },
  })

In this example, the ASL has a state called 'Read database credentials secret' and the SecretId parameter is overridden with a CDK generated value. Future changes can be done by editing, debugging, and testing the state machine directly in the Workflow Studio. Once everything is working properly, copy and paste the ASL back to your local file.

Issues

Please open any issues you have on Github.

Contributing

Please submit PRs from forked repositories if you'd like to contribute.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mbonig.state-machine-0.0.20.tar.gz (74.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mbonig.state_machine-0.0.20-py3-none-any.whl (72.7 kB view details)

Uploaded Python 3

File details

Details for the file mbonig.state-machine-0.0.20.tar.gz.

File metadata

  • Download URL: mbonig.state-machine-0.0.20.tar.gz
  • Upload date:
  • Size: 74.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for mbonig.state-machine-0.0.20.tar.gz
Algorithm Hash digest
SHA256 0025558fff30b51f61cb4dff5d416cffa452c0e9a62058760fed1b3350b98bed
MD5 b8b223c09231f3882b937ab3d2838a65
BLAKE2b-256 81779a041cb35aaf717dd6fa68e1e5553a029f061cbeb46f12788c05d3882211

See more details on using hashes here.

File details

Details for the file mbonig.state_machine-0.0.20-py3-none-any.whl.

File metadata

File hashes

Hashes for mbonig.state_machine-0.0.20-py3-none-any.whl
Algorithm Hash digest
SHA256 40660c9dbe4efc2af6d54b84329adad6cd2fbdd3e64c2ac7ebde9070fd6a6302
MD5 09ab8d2df62c208827a54edac5afe3fc
BLAKE2b-256 e8fe32f4305bf7380c443bca3e11abc7252545a41b43e0e8547c09cf70d593f2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page