GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

cloudtools

troposphere – troposphere – AWS CloudFormationの記述を作成するためのPythonライブラリ

投稿日:

troposphere – AWS CloudFormationの記述を作成するためのPythonライブラリ

対流圏

troposphere – AWS CloudFormationの説明を作成するライブラリ

troposphereライブラリを使用すると、AWSリソースを記述するPythonコードを記述することで、 AWS CloudFormation JSONを簡単に作成できます。 対流圏には、熱を介したOpenStackリソースの基本的なサポートも含まれています。

早期にCloudFormationまたはJSONエラーを捕捉しやすくするために、ライブラリにはプロパティと型チェックがクラスに組み込まれています。

インストール

対流圏は、Pythonの配管分配システムを使用して以下を発行してインストールすることができます。

$ pip install troposphere

awpossを使用して対流圏をインストールする(推奨されるソフト依存関係):

$ pip install troposphere[policy]

あるいは、setup.pyを使用して、このリポジトリを複製し、次のコマンドを発行してインストールすることもできます。

$ python setup.py install  # you may need sudo depending on your python installation

インスタンスを作成する簡単な例は、次のようになります。

>>> 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"
        }
    }
}

インスタンス(YAML)を作成する簡単な例は、次のようになります。

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

Resources:
    myinstance:
        Properties:
            ImageId: ami-951945d0
            InstanceType: t1.micro
        Type: AWS::EC2::Instance

また、プロパティの代わりにパラメータを使用することもできます。

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

add_resource()は、 Ref()で簡単に使用できるようにオブジェクトを返します。

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

エラーチェックの例(分かりやすくするために完全なトレースバックを削除):

AWSリソースに不適切なプロパティが設定されています:

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

AWSリソースプロパティのタイプが正しくありません:

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

AWSリソースに必須のプロパティがありません:

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

現在サポートされているAWSリソースタイプ

  • AWS :: ApiGateway
  • AWS :: ApplicationAutoScaling
  • AWS :: AppSync
  • AWS :: Athena
  • AWS :: AutoScaling
  • AWS :: Batch
  • AWS :: CertificateManager
  • AWS :: Cloud9
  • AWS :: CloudFormation
  • AWS :: CloudFront
  • AWS :: CloudTrail
  • AWS :: CloudWatch
  • AWS :: CodeBuild
  • AWS :: CodeCommit
  • AWS :: CodeDeploy
  • AWS :: CodePipeline
  • AWS :: Cognito
  • AWS :: Config
  • AWS :: DAX
  • AWS :: DMS
  • AWS :: DataPipeline
  • AWS :: DirectoryService
  • AWS :: DynamoDB
  • AWS :: EC2
  • AWS :: ECR
  • AWS :: ECS
  • AWS :: EFS
  • AWS :: EMR
  • AWS :: ElastiCache
  • AWS :: ElasticBeanstalk
  • AWS :: ElasticLoadBalancing
  • AWS :: ElasticLoadBalancingV2
  • AWS ::弾性検索
  • AWS ::イベント
  • AWS :: GuardDuty
  • AWS :: Glue
  • AWS :: IAM
  • AWS ::インスペクタ
  • AWS :: IoT
  • AWS :: KMS
  • AWS :: Kinesis
  • AWS :: KinesisAnalytics
  • AWS :: KinesisFirehose
  • AWS ::ラムダ
  • AWS :: Logs
  • AWS :: OpsWorks
  • AWS :: RDS
  • AWS :: Redshift
  • AWS :: Route53
  • AWS :: S3
  • AWS :: SDB
  • AWS :: SES
  • AWS :: SNS
  • AWS :: SQS
  • AWS :: SSM
  • AWS :: Serverless
  • AWS :: ServiceCatalog
  • AWS :: ServiceDiscovery
  • AWS :: StepFunctions
  • AWS :: WAF
  • AWS :: WAFRegional
  • AWS :: WorkSpaces

現在サポートされているOpenStackリソースタイプ

  • OS :: Neutron ::ファイアウォール
  • OS :: Neutron :: FirewallPolicy
  • OS :: Neutron :: FirewallRule
  • OS :: Neutron :: FloatingIP
  • OS :: Neutron :: FloatingIPAssociation
  • OS :: Neutron :: HealthMonitor
  • OS ::ニュートロン::プール
  • OS :: Neutron :: LoadBalancer
  • OS :: Neutron :: Net
  • OS :: Neutron :: PoolMember
  • OS ::ニュートロン::ポート
  • OS :: Neutron :: SecurityGroup
  • OS :: Nova :: FloatingIP
  • OS :: Nova :: FloatingIPAssociation
  • OS :: Nova :: KeyPair
  • OS :: Nova ::サーバ

Todo:

  • 追加の有効性チェックを追加する

1つのインスタンスサンプルを複製すると、次のようになります

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

コミュニティ

私たちには、Googleグループ、 cloudtools-devがあり 、ここで質問をしたり、対流圏コミュニティに参加したりすることができます。 問題とプルリクエストはいつでも歓迎です!

ライセンス

対流圏は、 BSD 2条項のライセンスのもとで使用許諾されます。 対流圏のフルライセンステキストについては、 ライセンスを参照してください。







-cloudtools
-, ,

執筆者: