Giter Site home page Giter Site logo

imclab / troposphere Goto Github PK

View Code? Open in Web Editor NEW

This project forked from cloudtools/troposphere

0.0 2.0 0.0 682 KB

troposphere - Python library to create AWS CloudFormation descriptions

License: BSD 2-Clause "Simplified" License

Python 100.00%

troposphere's Introduction

troposphere

https://pypip.in/version/troposphere/badge.svg?text=version&style=flat https://travis-ci.org/cloudtools/troposphere.png?branch=master

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 Instructions

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

$ pip install troposphere

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::DynamoDB
  • AWS::EC2
  • AWS::ElastiCache
  • AWS::ElasticBeanstalk
  • AWS::ElasticLoadBalancing
  • AWS::IAM
  • AWS::KINESIS
  • AWS::Logs
  • AWS::OPSWORKS
  • AWS::RDS
  • AWS::REDSHIFT
  • AWS::Route53
  • AWS::S3
  • AWS::SDB
  • AWS::SNS
  • AWS::SQS

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
  • Add missing AWS resource types:
    • AWS::CloudFormation::CustomResource

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())

Community

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

troposphere's People

Contributors

acaire avatar andybotting avatar andystanton avatar bbl232 avatar bobveznat avatar bwhaley avatar christopherhackett avatar daniellawrence avatar fbenz avatar fungusakafungus avatar ganguera avatar hltbra avatar hons avatar iblazevic avatar jcoleman avatar jeanphix avatar k-ong avatar lapin10 avatar ltagliamonte avatar malthe avatar markpeek avatar mbrossard avatar pas256 avatar patrickmcclory avatar phobologic avatar robzienert avatar s1l0uk avatar shadone avatar sofuture avatar tobias-jimdo avatar

Watchers

 avatar  avatar

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.