一说就懂的AWS Cloudformation

AWS Cloudformation简化了云资源的创建和管理,通过代码定义基础设施,支持多种AWS服务,并能通过版本控制工具进行维护。适用于快速部署和重复配置,开发者可以使用Web界面、CLI或各种AWS SDK(如PHP、Ruby、JavaScript、.NET)进行操作。文章介绍了如何使用Cloudformation创建Stack,以及通过VPC的例子来进一步理解其用法。

我是一个系统工程师,经历过HP、IBM等等的工作岁月后投身到云计算的世界里,真感慨以前的时间都活在狗身上了,全都因为云计算里Infrastructure as Code(基础设施即代码)慨念。以前在机房里建系统的活现在可以用一段代码完成,包括接网线,增加储存硬盘,安装基本的包,以至应用层面的资料库,要是配合一些DevOps工具如Chef或Puppet,以前得花三四天来建新架构或管理现有架构都都可以在几分钟之内完成。今天就给大家介绍一下颠覆IT世界的亚马逊AWS Cloudformation。


Cloudformation到底是干嘛用的?

用人类的语言来表达,就是你能把你所需要架构内容、参数、详细定义写成代码然后让Cloudformation帮你建。


Cloudformation好在哪里?

- Cloudformation可建的资源种类几乎包括了所有的AWS云服务。

- 可把需要重覆置备的架构以代码形式表达,而代码的改动能透过版本管理的工具如git或svn进行维护,
例如由于大部份的网页后台或APP后台的架构都离不开公网与私网分离,并把资料库置放于私网内把外来连接隔离,只需要在建第一套架构时用Cloudformation的格式创建出来,后面的新应用建立的工序就都变简单了。


Cloudformation用在哪里?

如果你是一个开发者,你可以用Cloudformation把AWS整个系统里的资源当作自己的应用程序,随时随量添加或移除AWS实例或资源。Cloudformation服务可以让你透过网页介面,AWS命令行或任何AWS SDK如PHP、JAVA或PYTHON等等。

使用网页介面上载template代码


使用AWS CLI
aws cloudformation create-stack --stack-name TEST_STACK --template-body file:////home//local//test//sampletemplate.json

使用AWS SDK
PHP:
http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-cloudformation.html
Ruby:
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/CloudFormation.html
JavaScript:
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudFormation.html
.NET
http://docs.aws.amazon.com/AWSSdkDocsNET/latest/V3/DeveloperGuide/welcome.html


如何开始使用Cloudformation?

之前我分享过一篇文章提到如何建用Cloudformation来建VPC, 

一说就懂的AWS VPC亚马逊虚拟私有云

这次就分享在已经建好VPC的情况下用Cloudformation建PostgreSQL DB,经过一点的修改你可以用这一个template 来建MySQL

{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Description":"AWS CloudFormation Template for PostgreSQL, template to create a highly-available, RDS DBInstance version 9.3 with alarming on important metrics that indicate the health of the database **WARNING**  ",
  "Parameters":{
    "VpcId":{
      "Type":"String",
      "Description":"VpcId of your existing Virtual Private Cloud(VPC)"
    },
    "Subnets":{
      "Type":"CommaDelimitedList",
      "Description":"The list of SubnetIds,for at least two Availability Zones in the region"
    },
    "DBIdentifier":{
      "Type":"String",
      "Description":"The identifier of this mysql database"
    },
    "MyDBName":{
      "Default":"MyDatabase",
      "Description":"The database name",
      "Type":"String",
      "MinLength":"1",
      "MaxLength":"64",
      "AllowedPattern":"[a-zA-Z][a-zA-Z0-9]*",
      "ConstraintDescription":"must begin with a letter and contain only alphanumeric characters."
    },
    "DBUser":{
      "Description":"The database admin account username",
      "Type":"String",
      "MinLength":"1",
      "MaxLength":"16",
      "AllowedPattern":"[a-zA-Z][a-zA-Z0-9]*",
      "ConstraintDescription":"must begin with a letter and contain only alphanumeric characters."
    },
    "DBPassword":{
      "NoEcho":"true",
      "Description":"The database admin account password",
      "Type":"String",
      "MinLength":"8",
      "MaxLength":"41",
      "AllowedPattern":"[a-zA-Z0-9]*",
      "ConstraintDescription":"must contain only alphanumeric characters."
    },
    "DBAllocatedStorage":{
      "Default":"5",
      "Description":"The size of the database (Gb)",
      "Type":"Number",
      "MinValue":"5",
      "MaxValue":"1024",
      "ConstraintDescription":"must be between 5 and 1024Gb."
    },
    "MyDBInstanceClass":{
      "Default":"db.m3.medium",
      "Description":"The database instance type",
      "Type":"String",
      "ConstraintDescription":"must select a valid database instance type."
    },
    "MultiAZDatabase":{
      "Default":"false",
      "Description":"Create a multi-AZ RDS database instance",
      "Type":"String",
      "AllowedValues":[
        "true",
        "false"
      ],
      "ConstraintDescription":"must be either true or false."
    }
  },
  "Resources":{
    "MyDBSubnetGroup":{
      "Type":"AWS::RDS::DBSubnetGroup",
      "Properties":{
        "DBSubnetGroupDescription":"Subnets available for the RDS DB Instance",
        "SubnetIds":{
          "Ref":"Subnets"
        }
      }
    },
    "SecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"Allow access to the mysql from the Web Server",
        "VpcId":{
          "Ref":"VpcId"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":"5432",
            "ToPort":"5432",
            "CidrIp":"10.0.0.0/16"
          }
        ]
      }
    },
    "MyDB":{
      "Type":"AWS::RDS::DBInstance",
      "Properties":{
        "AllocatedStorage":{
          "Ref":"DBAllocatedStorage"
        },
        "AutoMinorVersionUpgrade":"false",
        "VPCSecurityGroups":[
          {
            "Ref":"SecurityGroup"
          }
        ],
        "DBName":{
          "Ref":"MyDBName"
        },
        "DBInstanceClass":{
          "Ref":"MyDBInstanceClass"
        },
        "DBSubnetGroupName":{
          "Ref":"MyDBSubnetGroup"
        },
        "Engine":"postgres",
        "EngineVersion":"9.3.10",
        "MasterUsername":{
          "Ref":"DBUser"
        },
        "MasterUserPassword":{
          "Ref":"DBPassword"
        },
        "MultiAZ":{
          "Ref":"MultiAZDatabase"
        },
        "StorageType":"gp2",
        "Tags":[
          {
            "Key":"Name",
            "Value":{
              "Ref":"DBIdentifier"
            }
          }
        ]
      }
    }
  },
  "Outputs":{
    "JDBCConnectionString":{
      "Description":"JDBC connection string for database",
      "Value":{
        "Fn::Join":[
          "",
          [
            "jdbc:postgresql://",
            {
              "Fn::GetAtt":[
                "MyDB",
                "Endpoint.Address"
              ]
            },
            ":",
            {
              "Fn::GetAtt":[
                "MyDB",
                "Endpoint.Port"
              ]
            },
            "/",
            {
              "Ref":"MyDBName"
            }
          ]
        ]
      }
    },
    "DBAddress":{
      "Description":"address of database endpoint",
      "Value":{
        "Fn::GetAtt":[
          "MyDB",
          "Endpoint.Address"
        ]
      }
    },
    "DBPort":{
      "Description":"database endpoint port",
      "Value":{
        "Fn::GetAtt":[
          "MyDB",
          "Endpoint.Port"
        ]
      }
    }
  }
}

有任何问题随时都可以联系我!微信:@tursjackychan

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值