Pyawssfn

Tools for converting Python code to AWS Step Function json
Alternatives To Pyawssfn
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Pynamodb2,17718 days ago13June 09, 2022258mitPython
A pythonic interface to Amazon's DynamoDB
Saw1,320
2 months ago13February 11, 202145mitGo
Fast, multi-purpose tool for AWS CloudWatch Logs
Aws835
3 months ago2apache-2.0Shell
A collection of bash shell scripts for automating various tasks with Amazon Web Services using the AWS CLI and jq.
Goformation8084417 hours ago62June 10, 202150apache-2.0Go
GoFormation is a Go library for working with CloudFormation templates.
Iam Policy Json To Terraform680
12 days ago7February 06, 202110apache-2.0Go
Small tool to convert an IAM Policy in JSON format into a Terraform aws_iam_policy_document
Aws Security Viz665
3 days ago176August 15, 20214mitRuby
Visualize your aws security groups.
Devops Python Tools659
a day ago32mitPython
80+ DevOps & Data CLI Tools - AWS, GCP, GCF Python Cloud Functions, Log Anonymizer, Spark, Hadoop, HBase, Hive, Impala, Linux, Docker, Spark Data Converters & Validators (Avro/Parquet/JSON/CSV/INI/XML/YAML), Travis CI, AWS CloudFormation, Elasticsearch, Solr etc.
Awacs389120235 days ago39January 01, 202214bsd-2-clausePython
Python library for AWS Access Policy Language creation
Nodb330
13 years ago7September 26, 201714Python
NoDB isn't a database.. but it sort of looks like one.
Foremast277
2a year ago392December 01, 2021apache-2.0Python
Spinnaker Pipeline/Infrastructure Configuration and Templating Tool - Pipelines as Code.
Alternatives To Pyawssfn
Select To Compare


Alternative Project Comparisons
Readme

Compiling Python into AWS Lambda / Step Function

Ben North (GitHub / blog), March 2018 (repository root)

Installation

pip install .

Background

Among the components of Amazon Web Services are the following two parts of their 'serverless' approach:

  • Lambda — a 'Lambda function' is a self-contained piece of code which AWS runs on your behalf in response to triggers you specify;
  • Step Functions — a 'Step Function' is a mechanism for controlling the interlinked operation of multiple steps, including invocation of Lambda functions.

While Lambda functions can be written in many languages, to write a Step Function you describe the logic as a state machine in JSON. This seems cumbersome when compared to our normal way of describing how to control interlinked computations, which is to write some Python (or C#, or Java, or...).

Based on this observation, the tools presented here are a 'plausibility argument of concept' for the idea that you could write your top-level logic as a Python program and have it compiled into a Step Function state machine. (I haven't developed this far enough to call it a 'proof of concept'.)

One of the desired properties of the system is that the source program should be more or less 'normal Python'. It should be possible to use it in two ways:

  • Run it as a Python program with the usual Python interpreter;
  • Compile it into a Step Function and run in the AWS cloud.

The ability to run your logic as a normal Python program allows local development and testing.

Status

Although I think the tools here do show that the idea has promise, there would be plenty still to do to make them useful for production purposes. I am very unlikely to have time in the near future to develop this any further, but the source is all here (under GPL) if anybody wants to build on it.

General approach

Compile Python code to Step Function state machine

The 'Python to Step Function compiler' tool, pysfn.tools.compile, reads in a file of Python code and emits JSON corresponding to the control flow of a specified 'entry point' function in that code. The resulting JSON is used for the creation of an AWS Step Function. Various supplied Python functions allow the programmer to express intent in terms of retry characteristics, parallel invocations, error handling, etc. Nonetheless the code is valid normal Python and executes with (mostly) equivalent semantics to those the resulting Step Function will have.

Wrap original Python code as Lambda function

The 'Python to Step Function wrapper compiler' tool, pysfn.tools.gen_lambda, constructs a zip-file containing the original Python code together with a small wrapper. The zip-file is suitable for uploading as an AWS Lambda function. This gives the top-level Step Function access to what were callees in the original Python code.

Example

In the below I have omitted details like creation of IAM users, creation of roles, etc. See Amazon's documentation on these points.

Run unit tests on original Python

The original Python source consists of a main driver function, with a collection of small functions used by the main function. It is very simple, performing a few computations on an input string, but serves the purpose of illustrating the compilation process. It has a suite of unit tests:

pip install .[dev]  # install development dependencies
pytest tests/test_analyse_text.py

Output:

# ... ======== 10 passed in 0.02 seconds ======== ...

Wrap original Python ready for Lambda

python -m pysfn.tools.gen_lambda examples/analyse_text.py lambda-function.zip
unzip -l lambda-function.zip

Output:

Archive:  lambda-function.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      302  1980-01-01 00:00   handler.py
     1981  2018-03-25 20:01   inner/analyse_text.py
      452  2018-03-23 22:32   pysfn.py
---------                     -------
     2735                     3 files

Now upload lambda-function.zip as a new Lambda function with the Python 3.6 runtime, specify handler.dispatch as its entry point, and note its ARN for use in the next step.

Compile original Python into Step Function JSON

python -m pysfn.tools.compile examples/analyse_text.py LAMBDA-FUN-ARN > examples/stepfun.json
cat examples/stepfun.json

Output (the full output is 196 lines):

{
  "States": {
    "n0": {
      "Type": "Pass",
      "Result": {
        "function": "get_summary",
        "arg_names": [
          "text"
        ]
      },
      "ResultPath": "$.call_descr",
      "Next": "n1"
    },

    [...]

    "n19": {
      "Type": "Succeed",
      "InputPath": "$.locals.result"
    }
  },
  "StartAt": "n0"
}

Now copy-and-paste this as the JSON for a new Step Function.

Execute Step Function

You should now be able to perform an execution of this Step Function with, for example, the input

{
  "locals": {
    "text": "a short example"
  }
}

to get the output

{
  "output": "text starts with a, has 15 chars, 5 vowels, and 2 spaces"
}

More documentation


This document: Copyright 2018 Ben North; licensed under CC BY-SA 4.0

See the file COPYING for full licensing details.

Popular Json Projects
Popular Amazon Web Services Projects
Popular Data Formats Categories

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Python
Json
Aws
Lambda