Skip to main content

AWS CloudFormation creation library

Project description

https://img.shields.io/pypi/v/troposphere.svg https://travis-ci.org/cloudtools/troposphere.png?branch=master https://img.shields.io/pypi/l/troposphere.svg

About

troposphere - library to create AWS CloudFormation descriptions

The troposphere library allows for easier creation of the AWS CloudFormation JSON by writing Python code to describe the AWS resources. troposphere also includes some basic support for OpenStack resources via Heat.

To facilitate catching CloudFormation or JSON errors early the library has property and type checking built into the classes.

Installation

troposphere can be installed using the pip distribution system for Python by issuing:

$ pip install troposphere

To install troposphere with awacs (recommended soft dependency):

$ pip install troposphere[policy]

Alternatively, you can run use setup.py to install by cloning this repository and issuing:

# python setup.py install

Examples

A simple example to create an instance would look like this:

>>> from troposphere import Ref, Template
>>> import troposphere.ec2 as ec2
>>> t = Template()
>>> instance = ec2.Instance("myinstance")
>>> instance.ImageId = "ami-951945d0"
>>> instance.InstanceType = "t1.micro"
>>> t.add_resource(instance)
<troposphere.ec2.Instance object at 0x101bf3390>
>>> print(t.to_json())
{
    "Resources": {
        "myinstance": {
            "Properties": {
                "ImageId": "ami-951945d0",
                "InstanceType": "t1.micro"
            },
            "Type": "AWS::EC2::Instance"
        }
    }
}

Alternatively, parameters can be used instead of properties:

>>> instance = ec2.Instance("myinstance", ImageId="ami-951945d0", InstanceType="t1.micro")
>>> t.add_resource(instance)
<troposphere.ec2.Instance object at 0x101bf3550>

And add_resource() returns the object to make it easy to use with Ref():

>>> instance = t.add_resource(ec2.Instance("myinstance", ImageId="ami-951945d0", InstanceType="t1.micro"))
>>> Ref(instance)
<troposphere.Ref object at 0x101bf3490>

Examples of the error checking (full tracebacks removed for clarity):

Incorrect property being set on AWS resource:

>>> import troposphere.ec2 as ec2
>>> ec2.Instance("ec2instance", image="i-XXXX")
Traceback (most recent call last):
...
AttributeError: AWS::EC2::Instance object does not support attribute image

Incorrect type for AWS resource property:

>>> ec2.Instance("ec2instance", ImageId=1)
Traceback (most recent call last):
...
TypeError: ImageId is <type 'int'>, expected <type 'basestring'>

Missing required property for the AWS resource:

>>> from troposphere import Template
>>> import troposphere.ec2 as ec2
>>> t = Template()
>>> t.add_resource(ec2.Instance("ec2instance", InstanceType="m3.medium"))
<troposphere.ec2.Instance object at 0x109ee2e50>
>>> print(t.to_json())
Traceback (most recent call last):
...
ValueError: Resource ImageId required in type AWS::EC2::Instance

Currently supported AWS resource types

  • AWS::AutoScaling

  • AWS::CloudFormation

  • AWS::CloudFront

  • AWS::CloudTrail

  • AWS::CloudWatch

  • AWS::CodeDeploy

  • AWS::CodePipeline

  • AWS::Config

  • AWS::DirectoryService

  • AWS::DynamoDB

  • AWS::EC2

  • AWS::ECR

  • AWS::ECS

  • AWS::ElastiCache

  • AWS::ElasticBeanstalk

  • AWS::ElasticLoadBalancing

  • AWS::Elasticsearch

  • AWS::EMR

  • AWS::IAM

  • AWS::Kinesis

  • AWS::KinesisFirehose

  • AWS::KMS

  • AWS::Lambda

  • AWS::Logs

  • AWS::OpsWorks

  • AWS::RDS

  • AWS::Redshift

  • AWS::Route53

  • AWS::S3

  • AWS::SDB

  • AWS::SNS

  • AWS::SQS

  • AWS::SSM

  • AWS::WorkSpaces

Currently supported OpenStack resource types

  • OS::Neutron::Firewall

  • OS::Neutron::FirewallPolicy

  • OS::Neutron::FirewallRule

  • OS::Neutron::FloatingIP

  • OS::Neutron::FloatingIPAssociation

  • OS::Neutron::HealthMonitor

  • OS::Neutron::Pool

  • OS::Neutron::LoadBalancer

  • OS::Neutron::Net

  • OS::Neutron::PoolMember

  • OS::Neutron::Port

  • OS::Neutron::SecurityGroup

  • OS::Nova::FloatingIP

  • OS::Nova::FloatingIPAssociation

  • OS::Nova::KeyPair

  • OS::Nova::Server

Todo:

  • Add additional validity checks

Duplicating a single instance sample would look like this

# Converted from EC2InstanceSample.template located at:
# http://aws.amazon.com/cloudformation/aws-cloudformation-templates/

from troposphere import Base64, FindInMap, GetAtt
from troposphere import Parameter, Output, Ref, Template
import troposphere.ec2 as ec2


template = Template()

keyname_param = template.add_parameter(Parameter(
    "KeyName",
    Description="Name of an existing EC2 KeyPair to enable SSH "
                "access to the instance",
    Type="String",
))

template.add_mapping('RegionMap', {
    "us-east-1":      {"AMI": "ami-7f418316"},
    "us-west-1":      {"AMI": "ami-951945d0"},
    "us-west-2":      {"AMI": "ami-16fd7026"},
    "eu-west-1":      {"AMI": "ami-24506250"},
    "sa-east-1":      {"AMI": "ami-3e3be423"},
    "ap-southeast-1": {"AMI": "ami-74dda626"},
    "ap-northeast-1": {"AMI": "ami-dcfa4edd"}
})

ec2_instance = template.add_resource(ec2.Instance(
    "Ec2Instance",
    ImageId=FindInMap("RegionMap", Ref("AWS::Region"), "AMI"),
    InstanceType="t1.micro",
    KeyName=Ref(keyname_param),
    SecurityGroups=["default"],
    UserData=Base64("80")
))

template.add_output([
    Output(
        "InstanceId",
        Description="InstanceId of the newly created EC2 instance",
        Value=Ref(ec2_instance),
    ),
    Output(
        "AZ",
        Description="Availability Zone of the newly created EC2 instance",
        Value=GetAtt(ec2_instance, "AvailabilityZone"),
    ),
    Output(
        "PublicIP",
        Description="Public IP address of the newly created EC2 instance",
        Value=GetAtt(ec2_instance, "PublicIp"),
    ),
    Output(
        "PrivateIP",
        Description="Private IP address of the newly created EC2 instance",
        Value=GetAtt(ec2_instance, "PrivateIp"),
    ),
    Output(
        "PublicDNS",
        Description="Public DNSName of the newly created EC2 instance",
        Value=GetAtt(ec2_instance, "PublicDnsName"),
    ),
    Output(
        "PrivateDNS",
        Description="Private DNSName of the newly created EC2 instance",
        Value=GetAtt(ec2_instance, "PrivateDnsName"),
    ),
])

print(template.to_json())

New DynamoDB module

The original DynamoDB module did not use a consistent interface with the rest of troposphere, and so is being phased out. In order to prepare for this, you’ll need to make a few changes to DynamoDB resources. The biggest change is that many of the DynamoDB properties are now treated like regular properties in troposphere rather than as helper functions. For a full example of the changes, you can check out this diff between the DynamoDB_Table example using the old and the new modules:

# diff examples/DynamoDB_Table.py examples/DynamoDB2_Table.py
5,7c5,7
< from troposphere.dynamodb import (Key, AttributeDefinition,
<                                   ProvisionedThroughput)
< from troposphere.dynamodb import Table
---
> from troposphere.dynamodb2 import (KeySchema, AttributeDefinition,
>                                    ProvisionedThroughput)
> from troposphere.dynamodb2 import Table
58c58,61
<         AttributeDefinition(Ref(hashkeyname), Ref(hashkeytype)),
---
>         AttributeDefinition(
>             AttributeName=Ref(hashkeyname),
>             AttributeType=Ref(hashkeytype)
>         ),
61c64,67
<         Key(Ref(hashkeyname), "HASH")
---
>         KeySchema(
>             AttributeName=Ref(hashkeyname),
>             KeyType="HASH"
>         )
64,65c70,71
<         Ref(readunits),
<         Ref(writeunits)
---
>         ReadCapacityUnits=Ref(readunits),
>         WriteCapacityUnits=Ref(writeunits)

Community

We have a Google Group, cloudtools-dev, where you can ask questions and engage with the troposphere community. Issues and pull requests are always welcome!

Licensing

troposphere is licensed under the BSD 2-Clause license. See LICENSE for the troposphere full license text.

Project details


Release history Release notifications | RSS feed

This version

1.7.0

Download files

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

Source Distribution

troposphere-1.7.0.tar.gz (76.9 kB view details)

Uploaded Source

File details

Details for the file troposphere-1.7.0.tar.gz.

File metadata

  • Download URL: troposphere-1.7.0.tar.gz
  • Upload date:
  • Size: 76.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for troposphere-1.7.0.tar.gz
Algorithm Hash digest
SHA256 3c918d94300320f201be6d87d3748675c825c7a9221a90b14f15db827310f5d7
MD5 5ad0154018c7ce5c879d84db7c96e770
BLAKE2b-256 483b92871a457c00edf1fbbd842566c99d51329249c96927053c53c1db4d719d

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