Code Monkey home page Code Monkey logo

sceptre-ssm-resolver's Introduction

Sceptre

GitHub Actions Workflow Status Docker Image Version (latest semver) PyPI PyPI - Status PyPI - Python Version PyPI - Downloads License

About

Sceptre is a tool to drive AWS CloudFormation. It automates the mundane, repetitive and error-prone tasks, enabling you to concentrate on building better infrastructure.

Features

  • Code reuse by separating a Stack's template and its configuration
  • Support for templates written in JSON, YAML, Jinja2 or Python DSLs such as Troposphere
  • Dependency resolution by passing of Stack outputs to parameters of dependent Stacks
  • Stack Group support by bundling related Stacks into logical groups (e.g. dev and prod)
  • Stack Group-level commands, such as creating multiple Stacks with a single command
  • Fast, highly parallelised builds
  • Built in support for working with Stacks in multiple AWS accounts and regions
  • Infrastructure visibility with meta-operations such as Stack querying protection
  • Support for inserting dynamic values in templates via customisable Resolvers
  • Support for running arbitrary code as Hooks before/after Stack builds

Benefits

  • Utilises cloud-native Infrastructure as Code engines (CloudFormation)
  • You do not need to manage state
  • Simple templates using popular templating syntax - Yaml & Jinja
  • Powerful flexibility using a mature programming language - Python
  • Easy to integrate as part of a CI/CD pipeline by using Hooks
  • Simple CLI and API
  • Unopinionated - Sceptre does not force a specific project structure

Install

Using pip

$ pip install sceptre

More information on installing sceptre can be found in our Installation Guide

Using Docker Image

View our Docker repository. Images available from version 2.0.0 onward.

To use our Docker image follow these instructions:

  1. Pull the image docker pull sceptreorg/sceptre:[SCEPTRE_VERSION_NUMBER] e.g. docker pull sceptreorg/sceptre:2.5.0. Leave out the version number if you wish to run latest or run docker pull sceptreorg/sceptre:latest.

  2. Run the image. You will need to mount the working directory where your project resides to a directory called project. You will also need to mount a volume with your AWS config to your docker container. E.g.

docker run -v $(pwd):/project -v /Users/me/.aws/:/root/.aws/:ro sceptreorg/sceptre:latest --help

If you want to use a custom ENTRYPOINT simply amend the Docker command:

docker run -ti --entrypoint='' sceptreorg/sceptre:latest sh

The above command will enter you into the shell of the Docker container where you can execute sceptre commands - useful for development.

If you have any other environment variables in your non-docker shell you will need to pass these in on the Docker CLI using the -e flag. See Docker documentation on how to achieve this.

Example

Sceptre organises Stacks into "Stack Groups". Each Stack is represented by a YAML configuration file stored in a directory which represents the Stack Group. Here, we have two Stacks, vpc and subnets, in a Stack Group named dev:

$ tree
.
├── config
│   └── dev
│        ├── config.yaml
│        ├── subnets.yaml
│        └── vpc.yaml
└── templates
    ├── subnets.py
    └── vpc.py

We can create a Stack with the create command. This vpc Stack contains a VPC.

$ sceptre create dev/vpc.yaml

dev/vpc - Creating stack dev/vpc
VirtualPrivateCloud AWS::EC2::VPC CREATE_IN_PROGRESS
dev/vpc VirtualPrivateCloud AWS::EC2::VPC CREATE_COMPLETE
dev/vpc sceptre-demo-dev-vpc AWS::CloudFormation::Stack CREATE_COMPLETE

The subnets Stack contains a subnet which must be created in the VPC. To do this, we need to pass the VPC ID, which is exposed as a Stack output of the vpc Stack, to a parameter of the subnets Stack. Sceptre automatically resolves this dependency for us.

$ sceptre create dev/subnets.yaml
dev/subnets - Creating stack
dev/subnets Subnet AWS::EC2::Subnet CREATE_IN_PROGRESS
dev/subnets Subnet AWS::EC2::Subnet CREATE_COMPLETE
dev/subnets sceptre-demo-dev-subnets AWS::CloudFormation::Stack CREATE_COMPLETE

Sceptre implements meta-operations, which allow us to find out information about our Stacks:

$ sceptre list resources dev/subnets.yaml

- LogicalResourceId: Subnet
  PhysicalResourceId: subnet-445e6e32
  dev/vpc:
- LogicalResourceId: VirtualPrivateCloud
  PhysicalResourceId: vpc-c4715da0

Sceptre provides Stack Group level commands. This one deletes the whole dev Stack Group. The subnet exists within the vpc, so it must be deleted first. Sceptre handles this automatically:

$ sceptre delete dev

Deleting stack
dev/subnets Subnet AWS::EC2::Subnet DELETE_IN_PROGRESS
dev/subnets - Stack deleted
dev/vpc Deleting stack
dev/vpc VirtualPrivateCloud AWS::EC2::VPC DELETE_IN_PROGRESS
dev/vpc - Stack deleted

Note: Deleting Stacks will only delete a given Stack, or the Stacks that are directly in a given StackGroup. By default Stack dependencies that are external to the StackGroup are not deleted.

Sceptre can also handle cross Stack Group dependencies, take the following example project:

$ tree
.
├── config
│   ├── dev
│   │   ├── network
│   │   │   └── vpc.yaml
│   │   ├── users
│   │   │   └── iam.yaml
│   │   ├── compute
│   │   │   └── ec2.yaml
│   │   └── config.yaml
│   └── staging
│       └── eu
│           ├── config.yaml
│           └── stack.yaml
├── hooks
│   └── stack.py
├── templates
│   ├── network.json
│   ├── iam.json
│   ├── ec2.json
│   └── stack.json
└── vars
    ├── dev.yaml
    └── staging.yaml

In this project staging/eu/stack.yaml has a dependency on the output of dev/users/iam.yaml. If you wanted to create the Stack staging/eu/stack.yaml, Sceptre will resolve all of it's dependencies, including dev/users/iam.yaml, before attempting to create the Stack.

Usage

Sceptre can be used from the CLI, or imported as a Python package.

CLI

Usage: sceptre [OPTIONS] COMMAND [ARGS]...

  Sceptre is a tool to manage your cloud native infrastructure deployments.

Options:
  --version                  Show the version and exit.
  --debug                    Turn on debug logging.
  --dir TEXT                 Specify sceptre directory.
  --output [text|yaml|json]  The formatting style for command output.
  --no-colour                Turn off output colouring.
  --var TEXT                 A variable to replace the value of an item in
                             config file.
  --var-file FILENAME        A YAML file of variables to replace the values
                             of items in config files.
  --ignore-dependencies      Ignore dependencies when executing command.
  --merge-vars               Merge variables from successive --vars and var
                             files.
  --help                     Show this message and exit.

Commands:
  create         Creates a stack or a change set.
  delete         Deletes a stack or a change set.
  describe       Commands for describing attributes of stacks.
  estimate-cost  Estimates the cost of the template.
  execute        Executes a Change Set.
  generate       Prints the template.
  launch         Launch a Stack or StackGroup.
  list           Commands for listing attributes of stacks.
  new            Commands for initialising Sceptre projects.
  set-policy     Sets Stack policy.
  status         Print status of stack or stack_group.
  update         Update a stack.
  validate       Validates the template.

Python

Using Sceptre as a Python module is very straightforward. You need to create a SceptreContext, which tells Sceptre where your project path is and which path you want to execute on, we call this the "command path".

After you have created a SceptreContext you need to pass this into a SceptrePlan. On instantiation the SceptrePlan will handle all the required steps to make sure the action you wish to take on the command path are resolved.

After you have instantiated a SceptrePlan you can access all the actions you can take on a Stack, such as validate(), launch(), list() and delete().

from sceptre.context import SceptreContext
from sceptre.plan.plan import SceptrePlan

context = SceptreContext("/path/to/project", "command_path")
plan = SceptrePlan(context)
plan.launch()

Full API reference documentation can be found in the Documentation

Tutorial and Documentation

Communication

Sceptre community discussions happen in the #sceptre chanel in the og-aws Slack. To join click on http://slackhatesthe.cloud/ to create an account and join the #sceptre channel.

Contributing

See our Contributing Guide

Sponsors

Sage Bionetworks

GoDaddy

Cloudreach

sceptre-ssm-resolver's People

Contributors

jfalkenstein avatar pre-commit-ci[bot] avatar ykhalyavin avatar zaro0508 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sceptre-ssm-resolver's Issues

resolver error when running this in sceptre v2.3.0 and [email protected]

I might be missing something, any help would be appreciated.
Any one else come across this issue?
I have installed sceptre-ssm-resolver
Sceptre = 2.3.0
[email protected]

Note: I have changed the sceptre project name with , the path is correct when I am running the sceptre launch command.

Traceback (most recent call last):
File "/usr/local/bin/sceptre", line 11, in
load_entry_point('sceptre==2.3.0', 'console_scripts', 'sceptre')()
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/click/core.py", line 829, in call
return self.main(*args, **kwargs)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/click/decorators.py", line 21, in new_func
return f(get_current_context(), *args, **kwargs)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/sceptre/cli/helpers.py", line 36, in decorated
return func(*args, **kwargs)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/sceptre/cli/launch.py", line 35, in launch_command
plan = SceptrePlan(context)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/sceptre/plan/plan.py", line 34, in init
all_stacks, command_stacks = config_reader.construct_stacks()
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/sceptre/config/reader.py", line 228, in construct_stacks
stack = self._construct_stack(rel_path, stack_group_config)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/sceptre/config/reader.py", line 482, in _construct_stack
config = self.read(rel_path, stack_group_config)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/sceptre/config/reader.py", line 304, in read
this_config = self._recursive_read(directory_path, filename, config)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/sceptre/config/reader.py", line 345, in _recursive_read
child_config = self._render(directory_path, filename, stack_group_config) or {}
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/sceptre/config/reader.py", line 392, in _render
config = yaml.safe_load(rendered_template)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/yaml/init.py", line 162, in safe_load
return load(stream, SafeLoader)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/yaml/init.py", line 114, in load
return loader.get_single_data()
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/yaml/constructor.py", line 43, in get_single_data
return self.construct_document(node)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/yaml/constructor.py", line 52, in construct_document
for dummy in generator:
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/yaml/constructor.py", line 405, in construct_yaml_map
value = self.construct_mapping(node)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/yaml/constructor.py", line 210, in construct_mapping
return super().construct_mapping(node, deep=deep)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/yaml/constructor.py", line 135, in construct_mapping
value = self.construct_object(value_node, deep=deep)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/yaml/constructor.py", line 92, in construct_object
data = constructor(self, node)
File "/usr/local/Cellar/sceptre/2.3.0/libexec/lib/python3.8/site-packages/yaml/constructor.py", line 419, in construct_undefined
raise ConstructorError(None, None,
yaml.constructor.ConstructorError: could not determine a constructor for the tag '!ssm'
in "", line 12, column 5:
!ssm /production// ...
^

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.