troposphere – Bibliothek zum Erstellen von AWS CloudFormation-Beschreibungen
Die Troposphere-Bibliothek ermöglicht eine einfachere Erstellung des AWS CloudFormation JSON durch das Schreiben von Python-Code zur Beschreibung der AWS-Ressourcen. Troposphere bietet auch einige grundlegende Unterstützung für OpenStack-Ressourcen über Heat.
Um das frühzeitige Erkennen von CloudFormation- oder JSON-Fehlern zu erleichtern, verfügt die Bibliothek über eine in die Klassen integrierte Eigenschafts- und Typprüfung.
troposphere kann mithilfe des Pip-Verteilungssystems für Python installiert werden, indem Folgendes ausgegeben wird:
$ pip install troposphere
So installieren Sie Troposphere mit AWACS (empfohlene Soft-Abhängigkeit):
$ pip install troposphere[policy]
Alternativ können Sie setup.py zur Installation verwenden, indem Sie dieses Repository klonen und Folgendes ausgeben:
$ python setup.py install # you may need sudo depending on your python installation
Ein einfaches Beispiel zum Erstellen einer Instanz würde so aussehen:
> >> 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"
}
}
}
> >> print ( t . to_yaml ())
Resources :
myinstance :
Properties :
ImageId : ami - 951945 d0
InstanceType : t1 . micro
Type : AWS :: EC2 :: Instance
Alternativ können Parameter anstelle von Eigenschaften verwendet werden:
> >> instance = ec2 . Instance ( "myinstance" , ImageId = "ami-951945d0" , InstanceType = "t1.micro" )
> >> t . add_resource ( instance )
< troposphere . ec2 . Instance object at 0x101bf3550 >
Und add_resource()
gibt das Objekt zurück, um die Verwendung mit Ref()
zu vereinfachen:
> >> instance = t . add_resource ( ec2 . Instance ( "myinstance" , ImageId = "ami-951945d0" , InstanceType = "t1.micro" ))
> >> Ref ( instance )
< troposphere . Ref object at 0x101bf3490 >
Für die AWS-Ressource wird eine falsche Eigenschaft festgelegt:
> >> 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
Falscher Typ für AWS-Ressourceneigenschaft:
> >> ec2 . Instance ( "ec2instance" , ImageId = 1 )
Traceback ( most recent call last ):
...
TypeError : ImageId is < type 'int' > , expected < type 'basestring' >
Fehlende erforderliche Eigenschaft für die AWS-Ressource:
> >> from troposphere import Template
> >> import troposphere . ec2 as ec2
> >> t = Template ()
> >> t . add_resource ( ec2 . Subnet ( "ec2subnet" , VpcId = "vpcid" ))
< troposphere . ec2 . Subnet object at 0x100830ed0 >
> >> print ( t . to_json ())
Traceback ( most recent call last ):
...
ValueError : Resource CidrBlock required in type AWS :: EC2 :: Subnet ( title : ec2subnet )
# 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 ())
Wir haben eine Google-Gruppe, cloudtools-dev, in der Sie Fragen stellen und mit der Troposphären-Community in Kontakt treten können. Issues und Pull-Requests sind jederzeit willkommen!
Troposphere ist unter der BSD 2-Clause-Lizenz lizenziert. Den vollständigen Lizenztext für die Troposphäre finden Sie unter LIZENZ.