stackit
is a CLI tool to synchronously and idempotently operate on AWS
CloudFormation stacks - a perfect complement for continuous integration systems
and developers who prefer the comfort of the command line.
The latest compiled stackit
binaries for Linux, macOS and Windows can be
downloaded from the project's GitHub Releases
page.
CloudFormation is inherently asychronous and this is reflected in the usage
of the AWS CLI tools - a create-stack
or update-stack
operation exits long
before the stack has reached its final state. stackit
treats a stack update
synchronously, streaming stack events to the CLI until the stack reaches a
steady state.
AWS CLI commands for CloudFormation aren't idempotent. If you call create-stack
when a stack already exists, the behaviour is different to if it doesn't.
Likewise with update-stack
. This means you either have to manually create a
stack before putting it under CI, or script up a "does it exist yet?" check
before deciding which command to invoke. stackit
abstracts over these with
an up
facade.
stackit up --stack-name some-other-name # use this stack name, fallback to yml for rest
stackit up \
--stack-name some-other-name \
--template sample.yml \
--param-value DockerImage=redis \
--param-value Cluster=some-ecs-cluster # no yml necessary
Note that there is JSON printed at the end of the up
command. This is all the
Outputs defined in your CloudFormation template file. These are printed to
stdout. The event lines above them are printed to stderr.
This separation makes it easy to pipe output from stackit up
to another
command without having to skip the log lines. Likewise, a non-zero exit code
indicates stack update/creation failure.
stackit outputs --stack-name <name>
prints the stack's Outputs in JSON form,
without making any modifications to the stack.
If an existing stack creation or update is in progress, stackit tail --stack-name <name>
will poll for events, similar to the up
command.
stackit down --stack-name <name>
will delete the named stack if it exists,
otherwise it will do nothing. Non-zero exit code indicates failure to delete
an existing stack.
All commands can be passed a --profile <name>
parameter. This will use alternative
AWS credentials defined in a profile named in ~/.aws/config
if it exists. If your
profile requires MFA credentials in order to assume a role, stackit
will prompt
for those to be entered on stdin
.
All commands can be passed a --region <region>
parameter if you want to deploy
your stack in a different region.
stackit <stack-name> cancel
stackit <stack-name> signal <logical-name>
TODO: Document these properly
--service-role VAL
--previous-param-value NAME
--tag NAME=VAL
(multiple)--notification-arn
(multiple)--stack-policy VAL
--previous-template
--no-cancel-on-exit
--no-destroy
(not yet implemented)
for changes: (not yet implemented)
--name VAL
--execute-if-no-destroy
- Change-sets return special exit code to indicate destructive (replacement, deletion) actions
- MFA support