酷徒LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:WEB  Amazon Web服务  DSL    services  cloudformation  generating  服务  
A DSL for generating Amazon Web Services CloudFormation templates.

  • 源代码名称:cfndsl
  • 源代码网址:http://www.github.com/stevenjack/cfndsl
  • cfndsl源代码文档
  • cfndsl源代码下载
  • Git URL:
    git://www.github.com/stevenjack/cfndsl.git
  • Git Clone代码到本地:
    git clone http://www.github.com/stevenjack/cfndsl
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/stevenjack/cfndsl
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • cfndsl

    AWS Cloudformation 模板是在亚马逊环境中构建资源集的一种非常强大的方法。 但是,由于它们是用JSON指定的,所以编写和维护它们也很困难:

    • JSON不允许注释

    • 所有结构都是 JSON,因这里有时候读取模板的人很容易丢失。

    • 引用和内部函数的语法非常不理想。

    cnfdsl gem 提供了简单的DSL,允许你用更友好的语言编写等价的模板,并通过运行 ruby 来生成正确的json模板。

    正在启动

    运行cfndsl需要 ruby 版本> 2.1.0

    
    sudo gem install cfndsl
    
    
    
    

    现在在dsl中编写一个模板

    CloudFormation {
     Description"Test"Parameter("One") {
     StringDefault"Test"MaxLength15 }
     Output(:One,FnBase64( Ref("One")))
     EC2_Instance(:MyInstance) {
     ImageId"ami-12345678" }
    }

    然后在文件上运行 cfndsl

    
    chris@raspberrypi:~/git/cfndsl$ cfndsl test.rb | json_pp
    
    
    {
    
    
    "Parameters" : {
    
    
    "One" : {
    
    
    "Type" :"String",
    
    
    "Default" :"Test",
    
    
    "MaxLength" : 15
    
    
     }
    
    
     },
    
    
    "Resources" : {
    
    
    "MyInstance" : {
    
    
    "Type" :"AWS::EC2::Instance",
    
    
    "Properties" : {
    
    
    "ImageId" :"ami-12345678"
    
    
     }
    
    
     }
    
    
     },
    
    
    "AWSTemplateFormatVersion" :"2010-09-09",
    
    
    "Outputs" : {
    
    
    "One" : {
    
    
    "Value" : {
    
    
    "Fn::Base64" : {
    
    
    "Ref" :"One"
    
    
     }
    
    
     }
    
    
     }
    
    
     },
    
    
    "Description" :"Test"
    
    
    }
    
    
    
    

    :Aside: 这是正确的- 这个 gem的大量开发在一个 树莓派 平台上完成。

    命令行语法

    cfndsl 带有许多在上定义的helper 方法每个资源和/或者堆栈作为整体。

    模板元数据

    元数据是一个特殊的模板部分,描述了这里的 提供的参数必须是 json。 如果包含在 Metadata 中,某些CloudFormation功能引用特殊键,请查看AWS文档以了解详细信息。

    CloudFormationdoMetadata(foo:'bar')
     EC2_Instance(:myInstance) doImageId'ami-12345678'Type't1.micro'endend

    模板参数

    至少,参数需要一个 NAME,默认情况下为类型 String。 以单数而非复数指定参数:

    CloudFormationdoParameter'foo'end
    {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Parameters": {
     "foo": {
     "Type": "String" }
     }
    }

    但是,它们可以接受每个文档的所有附加密钥:

    Parameter('foo') doDescription'This is a sample parameter definition'Type'String'Default'foo'NoEchotrueAllowedValues%w(foo bar)AllowedPattern'/pattern/'MaxLength5MinLength3MaxValue10MinValue2ConstraintDescription'The error message printed when a parameter outside the constraints is given'end

    参数可以稍后在模板中引用:

    EC2_Instance(:myInstance) doInstanceType'm3.xlarge'UserDataRef('foo')end

    模板映射

    映射是用于模板的基于哈希的查找。 它们可以单数或者复数形式指定。

    CloudFormationdoMapping('foo', letters: { a:'a', b:'b' }, numbers: { 1: 1, 2: 2 })end
    {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Mappings": {
     "foo": {
     "letters": {
     "a": "a",
     "b": "b" },
     "numbers": {
     "one": 1,
     "two": 2 }
     }
     }
     }
    }

    然后,你可以使用 FnFindInMap 方法在模板中引用它们:

    EC2_Instance(:myInstance) doInstanceType'm3.xlarge'UserDataFnFindInMap('foo', :numbers, :one)end

    模板输出

    输出一次声明一个,并且必须至少给出一个 NAME 和一个值,描述是可选的。 通常使用 Ref 或者 FnGetAtt 从其他资源获取值:

    CloudFormationdoEC2_Instance(:myInstance) doImageId'ami-12345678'Type't1.micro'endOutput(:myInstanceId) doDescription'My instance Id'ValueRef(:myInstance)
     endend
    {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Resources": {
     "myInstance": {
     "Properties": {
     "ImageId": "ami-12345678" },
     "Type": "AWS::EC2::Instance" }
     },
     "Outputs": {
     "myInstanceId": {
     "Description": "My instance Id",
     "Value": {
     "Ref": "myInstance" }
     }
     }
    }

    模板条件

    条件必须在三个节中的语句中创建语句: 变量条目作为 Parameter,模板级 Condition 基于该 Parameter的值,以及一个引用模板级别的资源级别 Condition

    CloudFormationdoParameter(:environment) doDefault'development'AllowedValues%w(production development)endCondition(:createResource, FnEquals(Ref(:environment), 'production'))
     EC2_Instance(:myInstance) doCondition:createResourceImageId'ami-12345678'Type't1.micro'endend
    {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Parameters": {
     "environment": {
     "Type": "String",
     "Default": "development",
     "AllowedValues": [
     "production",
     "development" ]
     }
     },
     "Conditions": {
     "createResource": {
     "Fn::Equals": [
     {
     "Ref": "environment" },
     "production" ]
     }
     },
     "Resources": {
     "myInstance": {
     "Condition": "createResource",
     "Properties": {
     "ImageId": "ami-12345678" },
     "Type": "AWS::EC2::Instance" }
     }
    }

    模板资源

    Cfndsl为这里列出的所有资源创建访问器方法,这里是。 如果缺少资源,或者你更愿意在模板中显式输入资源,则可以这样做。 记住,因为你正在使用泛型类,你还需要显式设置该类,并且你不能再访问该特定类的helper 方法,因此你必须使用 Property 方法来设置这些方法。

    CloudFormationdoResource(:myInstance) doType'AWS::EC2::Instance'Property('ImageId', 'ami-12345678')
     Property('Type', 't1.micro')
     end# Will generate the same json as this## EC2_Instance(:myInstance) do# ImageId 'ami-12345678'# Type 't1.micro'# endend
    {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Resources": {
     "myInstance": {
     "Type": "AWS::ApiGateway::Resource",
     "Properties": {
     "ImageId": "ami-12345678",
     "Type": "t1.micro" }
     }
     }
    }

    资源类型

    当使用通用 Resource 方法而不是dsl方法时,使用 Type 指定资源类型,以及使用 Property的属性。 有关示例,请参见模板资源。

    资源条件

    指定资源条件,通过逻辑标识引用模板级别条件。 有关示例,请参见模板条件

    资源依赖项

    资源可以使用 DependsOn 显式地依赖其他资源。 它接受一个或者多个逻辑 id。

    CloudFormationdoEC2_Instance(:database) doImageId'ami-12345678'Type't1.micro'endEC2_Instance(:webserver) doDependsOn:databaseImageId'ami-12345678'Type't1.micro'endend
    {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Resources": {
     "database": {
     "Properties": {
     "ImageId": "ami-12345678" },
     "Type": "AWS::EC2::Instance" },
     "webserver": {
     "Properties": {
     "ImageId": "ami-12345678" },
     "Type": "AWS::EC2::Instance",
     "DependsOn": "database" }
     }
    }

    资源 DeletionPolicy

    资源可以有删除策略,与它们关联。 为每个资源指定一个作为属性:

    CloudFormationdoEC2_Instance(:myInstance) doDeletionPolicy'Retain'ImageId'ami-12345678'Type't1.micro'endend

    资源元数据

    你可以将任意的元数据作为属性附加。 提供的参数必须能够是 json ified:

    CloudFormationdoEC2_Instance(:myInstance) doMetadata(foo:'bar')
     ImageId'ami-12345678'Type't1.micro'endend

    资源 CreationPolicy/updatePolicy

    这些属性仅在特定的资源中使用。 属性的NAME 不是任意的,它必须 MATCH 你要附加的策略 NAME。 不同的策略有不同的参数。

    CloudFormationdoEC2_Instance(:myInstance) doImageId'ami-12345678'Type't1.micro'CreationPolicy(:ResourceSignal, { Count:1, Timeout:'PT1M' })
     endend

    示例

    示例目录中有一个更详细的示例。 文件"自动缩放。模板"是标准的亚马逊示例模板之一。 "autoscale。rb生成等价的模板文件。

    还有一组在 cfndsl_examples的大量示例,感谢 @neillturner.

    命令行 选项

    cfndsl 命令行 程序现在接受一些 命令行 选项。

    
    Usage: cfndsl [options] FILE
    
    
     -o, --output FILE Write output to file
    
    
     -y, --yaml FILE Import yaml file as local variables
    
    
     -r, --ruby FILE Evaluate ruby file before template
    
    
     -j, --json FILE Import json file as local variables
    
    
     -p, --pretty Pretty-format output JSON
    
    
     -f, --format FORMAT Specify the output format (JSON default)
    
    
     -D, --define"VARIABLE=VALUE" Directly set local VARIABLE as VALUE
    
    
     -v, --verbose Turn on verbose ouptut
    
    
     -b, --disable-binding Disable binding configuration
    
    
     -m, --disable-deep-merge Disable deep merging of yaml
    
    
     -s, --specification-file FILE Location of Cloudformation Resource Specification file
    
    
     -u, --update-specification Update the Cloudformation Resource Specification file
    
    
     -g RESOURCE_TYPE,RESOURCE_LOGICAL_NAME,
    
    
     --generate Add resource type and logical name
    
    
     -l, --list List supported resources
    
    
     -h, --help Display this screen
    
    
    
    

    默认情况下,cfndsl将尝试将文件作为cfndsl模板进行评估,并将生成的cloudformation json模板打印到 stdout。 使用-o选项,可以让它将生成的json模板写入给定文件。 -v选项打印出关于模型生成过程中所发生的信息的其他信息。

    可以使用 -y。-j。R 和-D选项控制关于模板代码在环境中评估的环境的一些事情。 例如,-D选项允许你在 命令行 中设置变量,然后在模板本身中引用该变量。

    最好用一个例子来说明。 考虑以下cfndsl模板

    # cfndsl template sample/t1.rbCloudFormationdo description = external_parameters.fetch(:description, 'default description')
     machines = external_parameters.fetch(:machines, 1).to_i
     Description description
     (1..machines).each do |i|
     name ="machine#{i}"EC2_Instance(name) doImageId'ami-12345678'Type't1.micro'endendend

    请注意两个变量 descriptionmachines。 模板将这些设置为一些合理的默认值,如果在它的上运行cfndsl而不用任何方式更改以下cloudformation模板:

    {
     "Resources": {
     "machine1": {
     "Type": "AWS::EC2::Instance",
     "Properties": {
     "ImageId": "ami-12345678" }
     }
     },
     "Description": "default description",
     "AWSTemplateFormatVersion": "2010-09-09"}

    但是如果你运行命令

    $ cfndsl sample/t1.rb -D 'description=3 machine cluster' -D 'machines=3'

    你得到以下生成的模板。

    {
     "Resources": {
     "machine3": {
     "Type": "AWS::EC2::Instance",
     "Properties": {
     "ImageId": "ami-12345678" }
     },
     "machine2": {
     "Type": "AWS::EC2::Instance",
     "Properties": {
     "ImageId": "ami-12345678" }
     },
     "machine1": {
     "Type": "AWS::EC2::Instance",
     "Properties": {
     "ImageId": "ami-12345678" }
     }
     },
     "Description": "3 machine cluster",
     "AWSTemplateFormatVersion": "2010-09-09"}

    -y和-j选项允许将多个变量定义组合到一个文件( 分别格式化为yaml或者 json ) 中。 如果有一个名为't1.yaml'的文件包含以下内容,

    # sample/t1.yamldescription: 5 machine clustermachines: 5

    这命令

    $ cfndsl sample/t1.rb -y sample/t1.yaml

    将生成一个包含 5个实例的模板。

    指定多个-y选项将按照指定的顺序对所有的yaml进行默认的deep_merge。 你可以使用-m禁用这里功能。

    最后,R 选项让你有机会在评估上下文中执行某些任意的ruby 代码,然后再评估cloudformation模板。

    Rake任务

    只需将以下内容添加到 Rakefile:

    require'cfndsl/rake_task'CfnDsl::RakeTask.newdo |t|
     t.cfndsl_opts = {
     verbose:true,
     files: [{
     filename:'templates/application.rb',
     output:'application.json' }],
     extras: [
     [ :yaml, 'templates/default_params.yml' ]
     ]
     }end

    然后使用rake生成 cloudformation:

    $ bin/rake generate

    从cfndsl生成CloudFormation资源

    通过提供-g参数,现在可以为支持的对象生成cloudformation资源,为运行 cfndsl -l的支持资源列表。

    例子

    cfndsl -g AWS::EC2::EIP,EIP
    require'cfndsl'CloudFormationdoDescription'auto generated cloudformation cfndsl template'EC2_EIP('EIP') doDomainString# http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html#cfn-ec2-eip-domainInstanceIdString# http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html#cfn-ec2-eip-instanceidendend

    很多感谢cfnlego的基本代码使这成为可能 !



    文章标签:WEB  服务  template  services    亚马逊  generating  DSL  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备17041772号-2  |  如果智培  |  酷兔英语  |  帮酷