When defining AWS Step Function in AWS Serverless Application Model (SAM), it’s common to have a template like:

# sam.yaml
# ...

MyStepFunctionsStateMachine:
  Type: AWS::StepFunctions::StateMachine
  Properties:
    RoleArn: !GetAtt MyStepFunctionsRole.Arn
    DefinitionString: !Sub |-
      {
        "StartAt": "HelloWorld",
        "Comment": "Say hello world",
        "States": {
          "HelloWorld": {
            "Type": "Task",
            "Resource": "${HelloWorldFunction.Arn}",
            "Comment": "Run the HelloWorld Lambda function",
            "End": true
          }
        }
      }

# ...

The JSON provided to DefinitionString inline can easily get long and make it harder to maintain the CloudFormation template. Thankfully, as described in this GitHub issue, it’s possible to use the macro AWS::Include to include an external template file as the definition of Step Functions.

# sam.yaml
# ...

MyStepFunctionsStateMachine:
  Type: AWS::StepFunctions::StateMachine
  Properties:
    RoleArn: !GetAtt MyStepFunctionsRole.Arn
    Fn::Transform:
      Name: AWS::Include
      Parameters:
        Location:
          Fn::Sub: s3://${BucketName}/state-functions-definition.yaml

# ...
# state-functions-definition.yaml

DefinitionString:
  Fn::Sub: |-
    {
      "StartAt": "HelloWorld",
      "Comment": "Say hello world",
      "States": {
        "HelloWorld": {
          "Type": "Task",
          "Resource": "${HelloWorldFunction.Arn}",
          "Comment": "Run the HelloWorld Lambda function",
          "End": true
        }
      }
    }

Please note that the template file state-functions-definition.yaml would have to be copied to the S3 bucket refered by BucketName in the sam.yaml pior to creating/updating the CloudFormation stack.