cf_factory 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. data/bin/cf_factory +9 -9
  2. data/examples/base_vpc.rb +40 -40
  3. data/examples/cloudfront_private.rb +23 -23
  4. data/examples/cloudinit_script_for_one_instance.rb +77 -77
  5. data/examples/cloudinit_script_with_autoscaling.rb +85 -85
  6. data/examples/dynamodb_table.rb +24 -24
  7. data/examples/elastic_beanstalk_example.rb +23 -23
  8. data/examples/elb_with_cloudfront.rb +100 -100
  9. data/examples/instance_with_eip.rb +40 -40
  10. data/examples/instance_with_yum.rb +40 -40
  11. data/examples/just_an_instance.rb +31 -31
  12. data/examples/nat_mutual_monitoring.rb +69 -69
  13. data/examples/play_with_region_and_zones.rb +28 -28
  14. data/examples/ra_web_hosting.rb +148 -148
  15. data/examples/s3_with_cloudfront.rb +35 -35
  16. data/examples/test_vpc.rb +61 -61
  17. data/lib/cf_factory/as/cf_as_group.rb +80 -77
  18. data/lib/cf_factory/as/cf_as_launch_config.rb +55 -55
  19. data/lib/cf_factory/as/cf_as_scaling_policy.rb +35 -35
  20. data/lib/cf_factory/as/cf_as_update_policy.rb +23 -0
  21. data/lib/cf_factory/base/cf_base.rb +112 -102
  22. data/lib/cf_factory/base/cf_ec2_tag.rb +34 -34
  23. data/lib/cf_factory/base/cf_generator.rb +20 -20
  24. data/lib/cf_factory/base/cf_helper.rb +93 -93
  25. data/lib/cf_factory/base/cf_inner.rb +74 -74
  26. data/lib/cf_factory/base/cf_main.rb +103 -103
  27. data/lib/cf_factory/base/cf_mapping.rb +28 -28
  28. data/lib/cf_factory/base/cf_named_inner.rb +70 -1
  29. data/lib/cf_factory/base/cf_output.rb +26 -26
  30. data/lib/cf_factory/base/cf_parameter.rb +27 -27
  31. data/lib/cf_factory/base/cf_script_reader.rb +34 -34
  32. data/lib/cf_factory/cloudformation/cf_cloud_formation_init.rb +27 -27
  33. data/lib/cf_factory/cloudformation/cf_cloudformation_command.rb +39 -39
  34. data/lib/cf_factory/cloudformation/cf_cloudformation_commands.rb +27 -27
  35. data/lib/cf_factory/cloudformation/cf_cloudformation_config.rb +35 -35
  36. data/lib/cf_factory/cloudformation/cf_cloudformation_file.rb +40 -40
  37. data/lib/cf_factory/cloudformation/cf_cloudformation_files.rb +27 -27
  38. data/lib/cf_factory/cloudformation/cf_cloudformation_inner.rb +30 -30
  39. data/lib/cf_factory/cloudformation/cf_cloudformation_package.rb +36 -36
  40. data/lib/cf_factory/cloudformation/cf_cloudformation_packages.rb +44 -44
  41. data/lib/cf_factory/cloudformation/cf_cloudformation_sources.rb +32 -32
  42. data/lib/cf_factory/cloudformation/cf_init_script.rb +80 -80
  43. data/lib/cf_factory/cloudfront/cf_cache_behavior.rb +39 -39
  44. data/lib/cf_factory/cloudfront/cf_cache_behaviors.rb +30 -30
  45. data/lib/cf_factory/cloudfront/cf_cloudfront_distribution.rb +66 -66
  46. data/lib/cf_factory/cloudfront/cf_custom_origin_config.rb +39 -39
  47. data/lib/cf_factory/cloudfront/cf_default_cache_behavior.rb +34 -34
  48. data/lib/cf_factory/cloudfront/cf_distribution_config.rb +33 -33
  49. data/lib/cf_factory/cloudfront/cf_forwarded_values.rb +27 -27
  50. data/lib/cf_factory/cloudfront/cf_logging.rb +26 -26
  51. data/lib/cf_factory/cloudfront/cf_origin.rb +42 -42
  52. data/lib/cf_factory/cloudfront/cf_s3_origin_config.rb +27 -27
  53. data/lib/cf_factory/cloudwatch/cf_cloud_watch_alarm.rb +60 -60
  54. data/lib/cf_factory/dynamo/cf_dynamo_table.rb +45 -45
  55. data/lib/cf_factory/eb/cd_eb_solution_stack.rb +27 -28
  56. data/lib/cf_factory/eb/cf_eb_application.rb +41 -41
  57. data/lib/cf_factory/eb/cf_eb_application_version.rb +24 -24
  58. data/lib/cf_factory/eb/cf_eb_configuration_template.rb +36 -36
  59. data/lib/cf_factory/eb/cf_eb_environment.rb +56 -56
  60. data/lib/cf_factory/eb/cf_eb_option_setting.rb +19 -19
  61. data/lib/cf_factory/ec2/cf_ebs_volume.rb +56 -56
  62. data/lib/cf_factory/ec2/cf_ec2_instance.rb +80 -66
  63. data/lib/cf_factory/ec2/cf_ec2_security_group.rb +42 -42
  64. data/lib/cf_factory/ec2/cf_ec2_security_group_egress.rb +30 -30
  65. data/lib/cf_factory/ec2/cf_ec2_security_group_ingress.rb +41 -41
  66. data/lib/cf_factory/ec2/cf_eip.rb +28 -28
  67. data/lib/cf_factory/ec2/cf_eip_association.rb +33 -31
  68. data/lib/cf_factory/ec2/cf_inner_network_interface.rb +26 -0
  69. data/lib/cf_factory/ec2/cf_network_interface.rb +40 -0
  70. data/lib/cf_factory/elb/cf_app_cookie_stickiness_policy.rb +17 -17
  71. data/lib/cf_factory/elb/cf_elb.rb +51 -51
  72. data/lib/cf_factory/elb/cf_health_check.rb +25 -25
  73. data/lib/cf_factory/elb/cf_lb_cookie_stickiness_policy.rb +17 -17
  74. data/lib/cf_factory/elb/cf_listener.rb +28 -28
  75. data/lib/cf_factory/help/fixes.rb +15 -15
  76. data/lib/cf_factory/help/ip_mask.rb +167 -167
  77. data/lib/cf_factory/help/template_validation.rb +30 -30
  78. data/lib/cf_factory/iam/cf_iam_access_key.rb +34 -34
  79. data/lib/cf_factory/iam/cf_iam_group.rb +32 -32
  80. data/lib/cf_factory/iam/cf_iam_instance_profile.rb +32 -32
  81. data/lib/cf_factory/iam/cf_iam_policy.rb +20 -20
  82. data/lib/cf_factory/iam/cf_iam_role.rb +58 -58
  83. data/lib/cf_factory/iam/cf_iam_statement.rb +25 -25
  84. data/lib/cf_factory/iam/cf_iam_user.rb +36 -36
  85. data/lib/cf_factory/iam/cf_policy_document.rb +21 -21
  86. data/lib/cf_factory/modules/base_vpc.rb +63 -63
  87. data/lib/cf_factory/rds/cf_rds_instance.rb +55 -55
  88. data/lib/cf_factory/rds/cf_rds_security_group.rb +35 -35
  89. data/lib/cf_factory/rds/cf_rds_security_group_ingress.rb +31 -31
  90. data/lib/cf_factory/rds/cf_rds_subnet_group.rb +31 -31
  91. data/lib/cf_factory/route53/cf_elb_alias_target.rb +23 -23
  92. data/lib/cf_factory/route53/cf_record_set.rb +63 -63
  93. data/lib/cf_factory/route53/cf_route53_record_set.rb +63 -63
  94. data/lib/cf_factory/route53/cf_route53_record_set_group.rb +44 -44
  95. data/lib/cf_factory/s3/cf_s3_bucket.rb +34 -34
  96. data/lib/cf_factory/s3/cf_web_site_config.rb +26 -26
  97. data/lib/cf_factory/sqs/cf_sqs_queue.rb +28 -28
  98. data/lib/cf_factory/vpc/cf_attach_gateway.rb +30 -30
  99. data/lib/cf_factory/vpc/cf_internet_gateway.rb +32 -32
  100. data/lib/cf_factory/vpc/cf_network_acl.rb +41 -41
  101. data/lib/cf_factory/vpc/cf_network_acl_association.rb +26 -26
  102. data/lib/cf_factory/vpc/cf_network_acl_entry.rb +39 -39
  103. data/lib/cf_factory/vpc/cf_route.rb +45 -45
  104. data/lib/cf_factory/vpc/cf_route_table.rb +43 -43
  105. data/lib/cf_factory/vpc/cf_route_table_association.rb +26 -26
  106. data/lib/cf_factory/vpc/cf_subnet.rb +50 -50
  107. data/lib/cf_factory/vpc/cf_vpc.rb +66 -66
  108. data/lib/cf_factory.rb +12 -12
  109. metadata +120 -91
@@ -1,148 +1,148 @@
1
- #!/usr/bin/ruby
2
-
3
- require 'cf_factory'
4
-
5
- # CloudFormation template for Atraveo. 2-Tiered web-application with load-balancing.
6
- cf = CfFactory::CfMain.new("Reference Architecture Web-Hosting")
7
-
8
- ####### input parameters
9
- hosted_zone_id = "ZSSFB90C439AA"
10
- hosted_zone_name = "dezidr.com"
11
-
12
- #ami_id = "ami-c6699baf"
13
- #ami_id = "ami-e96bdf80" #eu-west NAT instance
14
- ami_id = "ami-e96bdf80" #us-east web-server returning something
15
-
16
- param_hosted_zone = CfFactory::CfParameter.new("HostedZoneId", "Needs an existing hosted zone in Route53 to be configured", "String", {"Default" => hosted_zone_id})
17
- cf.add_parameter(param_hosted_zone)
18
- param_app_server_ami = CfFactory::CfParameter.new("AppServerAmi", "AMI of App-Server", "String", {"Default" => ami_id})
19
- cf.add_parameter(param_app_server_ami)
20
- param_app_server_key = CfFactory::CfParameter.new("AppServerKey", "Key used to start App-Server", "String")
21
- cf.add_parameter(param_app_server_key)
22
- param_app_port = CfFactory::CfParameter.new("AppPort", "Port of the Web/App-Servers", "Number", {"Default" => "8080"})
23
- cf.add_parameter(param_app_port)
24
- param_db_user = CfFactory::CfParameter.new("MasterUserName", "Name of the master user name of the DB", "String", {"Default" => "masteruser"})
25
- cf.add_parameter(param_db_user)
26
- param_db_pw = CfFactory::CfParameter.new("MasterPassword", "Password of the master user of the DB", "String")
27
- cf.add_parameter(param_db_pw)
28
-
29
- zone = "us-east"
30
-
31
- ####### mappings
32
-
33
- ####### resources
34
-
35
- #ebs test
36
- ebs = CfFactory::CfEbsVolume.create_normal("MyEbs",CfFactory::CfHelper.az_in_region(az_id = "b"), 5)
37
- cf.add_resource(ebs)
38
-
39
- s3_bucket = CfFactory::CfS3Bucket.new("MyS3Bucket")
40
- cf.add_resource(s3_bucket)
41
- s3_log_bucket = CfFactory::CfS3Bucket.new("MyS3LogBucket")
42
- s3_log_bucket.set_deletion_policy("Delete")
43
- cf.add_resource(s3_log_bucket)
44
-
45
- #security groups
46
- # ELB security groups apparently only available for VPC
47
- #elb_sec_group = CfEc2SecurityGroup.new("ElbSecurityGroup", "Security Group for ELB")
48
- #elb_sec_group.add_ingress_rule(CfEc2SecurityGroupIngress.new("tcp", 80, 80, "0.0.0.0/0"))
49
- #elb_sec_group.add_ingress_rule(CfEc2SecurityGroupIngress.new("tcp", 443, 443, "0.0.0.0/0"))
50
- #cf.add_resource(elb_sec_group)
51
-
52
- #elb
53
- #health_check_string = "HTTP:#{param_app_port.generate_ref()}/index.html"
54
- health_check_string = "HTTP:80/index.html"
55
- elb = CfFactory::CfElb.new("MyLoadBalancer", {
56
- :health_check => CfFactory::CfHealthCheck.new("3","60", health_check_string,"10","2"),
57
- :listeners => [CfFactory::CfListener.new(param_app_port.generate_ref(),"http","80","http")],
58
- #:security_groups => [elb_sec_group], #only for VPC based ELBs
59
- :availability_zones => CfFactory::CfHelper.availability_zones()
60
- }
61
- )
62
- cf.add_resource(elb)
63
-
64
- app_sec_group = CfFactory::CfEc2SecurityGroup.new("AppSecurityGroup", "Security Group for web and app")
65
- app_sec_group.add_ingress_rule(CfFactory::CfEc2SecurityGroupIngress.new("tcp", 22, 22, "0.0.0.0/0"))
66
- ir1 = CfFactory::CfEc2SecurityGroupIngress.new("tcp", param_app_port.generate_ref(), param_app_port.generate_ref(), "0.0.0.0/0")
67
- app_sec_group.add_ingress_rule(ir1)
68
- cf.add_resource(app_sec_group)
69
-
70
- rds_sec_group = CfFactory::CfRdsSecurityGroup.new("RdsSecurityGroup","Security Group for RDS")
71
- ir = CfFactory::CfRdsSecurityGroupIngress.new(nil,app_sec_group)
72
- ir.set_use_sg_id(false)
73
- rds_sec_group.add_rule(ir)
74
- cf.add_resource(rds_sec_group)
75
-
76
- #rds
77
- rds_endpoint= "rdsendpoint"
78
- options = {:multi_az => true, :security_groups => [rds_sec_group]}
79
- rds_instance = CfFactory::CfRdsInstance.new("MyDatabase",5,"MySql","db.t1.micro",param_db_user.generate_ref(), param_db_pw.generate_ref, options)
80
- cf.add_resource(rds_instance)
81
- rds_endpoint = rds_instance.retrieve_attribute("Endpoint.Address")
82
-
83
- #iam-role to be able to read meta-data
84
- statement = CfFactory::CfIamStatement.new("Allow","cloudformation:DescribeStackResource","*")
85
- role_policy = CfFactory::CfIamPolicy.new("MyRolePolicy", CfFactory::CfPolicyDocument.new([statement]))
86
- iam_role = CfFactory::CfIamRole.new("ReadMetaData","/",{:policies => [role_policy]})
87
- cf.add_resource(iam_role)
88
-
89
- #auto-scaling group
90
- launch_config = CfFactory::CfAsLaunchConfig.new("AppServerLaunchConfig", ami_id, "t1.micro", {:security_groups => [app_sec_group], :user_data => rds_endpoint})
91
- cf.add_resource(launch_config)
92
- availability_zones = CfFactory::CfHelper.az_array_in_region(["b","c"])
93
- as_group = CfFactory::CfAsGroup.new("AppServerFleet",availability_zones, launch_config, [elb], 4 ,2 ,{:desired_capacity => 2})
94
- cf.add_resource(as_group)
95
- as_up_scaling_policy = CfFactory::CfAsScalingPolicy.new("MyUpscalePolicy",as_group,"ChangeInCapacity","1",{:cooldown => 300})
96
- cf.add_resource(as_up_scaling_policy)
97
- as_down_scaling_policy = CfFactory::CfAsScalingPolicy.new("MyDownscalePolicy",as_group,"ChangeInCapacity","-1",{:cooldown => 300})
98
- cf.add_resource(as_down_scaling_policy)
99
- as_up_alarm = CfFactory::CfCloudWatchAlarm.new("MyUpAlarm",CfFactory::CfCloudWatchAlarm::GREATER_THAN_OR_EQUAL_TO_THRESHOLD, "3", "CPUUtilization","AWS/EC2",
100
- "60","Average","80", {:alarm_actions => [as_up_scaling_policy]})
101
- as_down_alarm = CfFactory::CfCloudWatchAlarm.new("MyDownAlarm",CfFactory::CfCloudWatchAlarm::LESS_THAN_THRESHOLD, "3", "CPUUtilization","AWS/EC2",
102
- "60","Average","30", {:alarm_actions => [as_down_scaling_policy]})
103
- cf.add_resource(as_up_alarm)
104
- cf.add_resource(as_down_alarm)
105
-
106
- #cloudfront
107
- # distribution with multiple origins, one for S3, one for the ELB
108
- #define origins
109
- elb_origin = CfFactory::CfOrigin.create_elb_origin(elb)
110
- s3_origin = CfFactory::CfOrigin.create_s3_origin(s3_bucket)
111
- origins = [elb_origin, s3_origin]
112
- #define cache behaviors for origins
113
- default_cache_behavior = CfFactory::CfDefaultCacheBehavior.create_basic(elb_origin.id)
114
- cache_behaviors = [
115
- CfFactory::CfCacheBehavior.create_basic(s3_origin.id, "/static/*", :min_ttl => 24*60*60),
116
- CfFactory::CfCacheBehavior.create_basic(s3_origin.id, "*.jpg", :min_ttl => 24*60*60)
117
- ]
118
- #tie everything together
119
- cname_endpoint = "cached-elb-#{(Random.new.rand*100000).to_i}.dezidr.com"
120
- logging = CfFactory::CfLogging.new(s3_log_bucket,"log-") #activate logging
121
- cf_distribution = CfFactory::CfCloudfrontDistribution.create_multi_origin_distribution("MyDistribution", origins,
122
- default_cache_behavior, cache_behaviors, {:logging => logging, :aliases => [cname_endpoint]})
123
- cf.add_resource(cf_distribution)
124
-
125
- #route53
126
- cloudfront_dns = cf_distribution.retrieve_attribute("DomainName")
127
- cname = CfFactory::CfRoute53RecordSet.new("CnameRecord", "#{cname_endpoint}", "CNAME", {:ttl => 1, :resource_records => [cloudfront_dns], :hosted_zone_id => hosted_zone_id})
128
- cf.add_resource(cname)
129
- elb_alias = CfFactory::CfRoute53RecordSet.new("ElbAliasRecord","elb-#{(Random.new.rand*100000).to_i}.#{hosted_zone_name}","A", {:alias_target => CfFactory::CfElbAliasTarget.new(elb), :hosted_zone_id => hosted_zone_id})
130
- cf.add_resource(elb_alias)
131
-
132
- ####### output parameters
133
- elb_output = CfFactory::CfOutput.new("ElbEndpoint","Endpoint of the ELB",elb.retrieve_attribute("DNSName"))
134
- cf.add_output(elb_output)
135
- cloudfront_domain = CfFactory::CfOutput.new("CloudfrontDomain", "Endpoint of the CloudFront distribution", cf_distribution.retrieve_attribute("DomainName"))
136
- cf.add_output(cloudfront_domain)
137
-
138
- cf_json = cf.generate
139
- puts cf_json
140
-
141
- config_options = YAML.load_file("aws_config.yml")
142
- config_options["cloud_formation_endpoint"] = "cloudformation.us-east-1.amazonaws.com"
143
- puts config_options.inspect
144
- validator = CfFactory::TemplateValidation.new(cf_json, config_options)
145
- validator.validate()
146
- #validator.apply({"AppServerAmi" => ami_id, "AppServerKey" => "majung", "AppPort" => "80", "MasterUserName" => "iamauser", "MasterPassword" => "abcd1234"})
147
-
148
- #puts "the reference for the VPC : #{vpc.generate_ref}"
1
+ #!/usr/bin/ruby
2
+
3
+ require 'cf_factory'
4
+
5
+ # CloudFormation template for Atraveo. 2-Tiered web-application with load-balancing.
6
+ cf = CfFactory::CfMain.new("Reference Architecture Web-Hosting")
7
+
8
+ ####### input parameters
9
+ hosted_zone_id = "ZSSFB90C439AA"
10
+ hosted_zone_name = "dezidr.com"
11
+
12
+ #ami_id = "ami-c6699baf"
13
+ #ami_id = "ami-e96bdf80" #eu-west NAT instance
14
+ ami_id = "ami-e96bdf80" #us-east web-server returning something
15
+
16
+ param_hosted_zone = CfFactory::CfParameter.new("HostedZoneId", "Needs an existing hosted zone in Route53 to be configured", "String", {"Default" => hosted_zone_id})
17
+ cf.add_parameter(param_hosted_zone)
18
+ param_app_server_ami = CfFactory::CfParameter.new("AppServerAmi", "AMI of App-Server", "String", {"Default" => ami_id})
19
+ cf.add_parameter(param_app_server_ami)
20
+ param_app_server_key = CfFactory::CfParameter.new("AppServerKey", "Key used to start App-Server", "String")
21
+ cf.add_parameter(param_app_server_key)
22
+ param_app_port = CfFactory::CfParameter.new("AppPort", "Port of the Web/App-Servers", "Number", {"Default" => "8080"})
23
+ cf.add_parameter(param_app_port)
24
+ param_db_user = CfFactory::CfParameter.new("MasterUserName", "Name of the master user name of the DB", "String", {"Default" => "masteruser"})
25
+ cf.add_parameter(param_db_user)
26
+ param_db_pw = CfFactory::CfParameter.new("MasterPassword", "Password of the master user of the DB", "String")
27
+ cf.add_parameter(param_db_pw)
28
+
29
+ zone = "us-east"
30
+
31
+ ####### mappings
32
+
33
+ ####### resources
34
+
35
+ #ebs test
36
+ ebs = CfFactory::CfEbsVolume.create_normal("MyEbs",CfFactory::CfHelper.az_in_region(az_id = "b"), 5)
37
+ cf.add_resource(ebs)
38
+
39
+ s3_bucket = CfFactory::CfS3Bucket.new("MyS3Bucket")
40
+ cf.add_resource(s3_bucket)
41
+ s3_log_bucket = CfFactory::CfS3Bucket.new("MyS3LogBucket")
42
+ s3_log_bucket.set_deletion_policy("Delete")
43
+ cf.add_resource(s3_log_bucket)
44
+
45
+ #security groups
46
+ # ELB security groups apparently only available for VPC
47
+ #elb_sec_group = CfEc2SecurityGroup.new("ElbSecurityGroup", "Security Group for ELB")
48
+ #elb_sec_group.add_ingress_rule(CfEc2SecurityGroupIngress.new("tcp", 80, 80, "0.0.0.0/0"))
49
+ #elb_sec_group.add_ingress_rule(CfEc2SecurityGroupIngress.new("tcp", 443, 443, "0.0.0.0/0"))
50
+ #cf.add_resource(elb_sec_group)
51
+
52
+ #elb
53
+ #health_check_string = "HTTP:#{param_app_port.generate_ref()}/index.html"
54
+ health_check_string = "HTTP:80/index.html"
55
+ elb = CfFactory::CfElb.new("MyLoadBalancer", {
56
+ :health_check => CfFactory::CfHealthCheck.new("3","60", health_check_string,"10","2"),
57
+ :listeners => [CfFactory::CfListener.new(param_app_port.generate_ref(),"http","80","http")],
58
+ #:security_groups => [elb_sec_group], #only for VPC based ELBs
59
+ :availability_zones => CfFactory::CfHelper.availability_zones()
60
+ }
61
+ )
62
+ cf.add_resource(elb)
63
+
64
+ app_sec_group = CfFactory::CfEc2SecurityGroup.new("AppSecurityGroup", "Security Group for web and app")
65
+ app_sec_group.add_ingress_rule(CfFactory::CfEc2SecurityGroupIngress.new("tcp", 22, 22, "0.0.0.0/0"))
66
+ ir1 = CfFactory::CfEc2SecurityGroupIngress.new("tcp", param_app_port.generate_ref(), param_app_port.generate_ref(), "0.0.0.0/0")
67
+ app_sec_group.add_ingress_rule(ir1)
68
+ cf.add_resource(app_sec_group)
69
+
70
+ rds_sec_group = CfFactory::CfRdsSecurityGroup.new("RdsSecurityGroup","Security Group for RDS")
71
+ ir = CfFactory::CfRdsSecurityGroupIngress.new(nil,app_sec_group)
72
+ ir.set_use_sg_id(false)
73
+ rds_sec_group.add_rule(ir)
74
+ cf.add_resource(rds_sec_group)
75
+
76
+ #rds
77
+ rds_endpoint= "rdsendpoint"
78
+ options = {:multi_az => true, :security_groups => [rds_sec_group]}
79
+ rds_instance = CfFactory::CfRdsInstance.new("MyDatabase",5,"MySql","db.t1.micro",param_db_user.generate_ref(), param_db_pw.generate_ref, options)
80
+ cf.add_resource(rds_instance)
81
+ rds_endpoint = rds_instance.retrieve_attribute("Endpoint.Address")
82
+
83
+ #iam-role to be able to read meta-data
84
+ statement = CfFactory::CfIamStatement.new("Allow","cloudformation:DescribeStackResource","*")
85
+ role_policy = CfFactory::CfIamPolicy.new("MyRolePolicy", CfFactory::CfPolicyDocument.new([statement]))
86
+ iam_role = CfFactory::CfIamRole.new("ReadMetaData","/",{:policies => [role_policy]})
87
+ cf.add_resource(iam_role)
88
+
89
+ #auto-scaling group
90
+ launch_config = CfFactory::CfAsLaunchConfig.new("AppServerLaunchConfig", ami_id, "t1.micro", {:security_groups => [app_sec_group], :user_data => rds_endpoint})
91
+ cf.add_resource(launch_config)
92
+ availability_zones = CfFactory::CfHelper.az_array_in_region(["b","c"])
93
+ as_group = CfFactory::CfAsGroup.new("AppServerFleet",availability_zones, launch_config, [elb], 4 ,2 ,{:desired_capacity => 2})
94
+ cf.add_resource(as_group)
95
+ as_up_scaling_policy = CfFactory::CfAsScalingPolicy.new("MyUpscalePolicy",as_group,"ChangeInCapacity","1",{:cooldown => 300})
96
+ cf.add_resource(as_up_scaling_policy)
97
+ as_down_scaling_policy = CfFactory::CfAsScalingPolicy.new("MyDownscalePolicy",as_group,"ChangeInCapacity","-1",{:cooldown => 300})
98
+ cf.add_resource(as_down_scaling_policy)
99
+ as_up_alarm = CfFactory::CfCloudWatchAlarm.new("MyUpAlarm",CfFactory::CfCloudWatchAlarm::GREATER_THAN_OR_EQUAL_TO_THRESHOLD, "3", "CPUUtilization","AWS/EC2",
100
+ "60","Average","80", {:alarm_actions => [as_up_scaling_policy]})
101
+ as_down_alarm = CfFactory::CfCloudWatchAlarm.new("MyDownAlarm",CfFactory::CfCloudWatchAlarm::LESS_THAN_THRESHOLD, "3", "CPUUtilization","AWS/EC2",
102
+ "60","Average","30", {:alarm_actions => [as_down_scaling_policy]})
103
+ cf.add_resource(as_up_alarm)
104
+ cf.add_resource(as_down_alarm)
105
+
106
+ #cloudfront
107
+ # distribution with multiple origins, one for S3, one for the ELB
108
+ #define origins
109
+ elb_origin = CfFactory::CfOrigin.create_elb_origin(elb)
110
+ s3_origin = CfFactory::CfOrigin.create_s3_origin(s3_bucket)
111
+ origins = [elb_origin, s3_origin]
112
+ #define cache behaviors for origins
113
+ default_cache_behavior = CfFactory::CfDefaultCacheBehavior.create_basic(elb_origin.id)
114
+ cache_behaviors = [
115
+ CfFactory::CfCacheBehavior.create_basic(s3_origin.id, "/static/*", :min_ttl => 24*60*60),
116
+ CfFactory::CfCacheBehavior.create_basic(s3_origin.id, "*.jpg", :min_ttl => 24*60*60)
117
+ ]
118
+ #tie everything together
119
+ cname_endpoint = "cached-elb-#{(Random.new.rand*100000).to_i}.dezidr.com"
120
+ logging = CfFactory::CfLogging.new(s3_log_bucket,"log-") #activate logging
121
+ cf_distribution = CfFactory::CfCloudfrontDistribution.create_multi_origin_distribution("MyDistribution", origins,
122
+ default_cache_behavior, cache_behaviors, {:logging => logging, :aliases => [cname_endpoint]})
123
+ cf.add_resource(cf_distribution)
124
+
125
+ #route53
126
+ cloudfront_dns = cf_distribution.retrieve_attribute("DomainName")
127
+ cname = CfFactory::CfRoute53RecordSet.new("CnameRecord", "#{cname_endpoint}", "CNAME", {:ttl => 1, :resource_records => [cloudfront_dns], :hosted_zone_id => hosted_zone_id})
128
+ cf.add_resource(cname)
129
+ elb_alias = CfFactory::CfRoute53RecordSet.new("ElbAliasRecord","elb-#{(Random.new.rand*100000).to_i}.#{hosted_zone_name}","A", {:alias_target => CfFactory::CfElbAliasTarget.new(elb), :hosted_zone_id => hosted_zone_id})
130
+ cf.add_resource(elb_alias)
131
+
132
+ ####### output parameters
133
+ elb_output = CfFactory::CfOutput.new("ElbEndpoint","Endpoint of the ELB",elb.retrieve_attribute("DNSName"))
134
+ cf.add_output(elb_output)
135
+ cloudfront_domain = CfFactory::CfOutput.new("CloudfrontDomain", "Endpoint of the CloudFront distribution", cf_distribution.retrieve_attribute("DomainName"))
136
+ cf.add_output(cloudfront_domain)
137
+
138
+ cf_json = cf.generate
139
+ puts cf_json
140
+
141
+ config_options = YAML.load_file("aws_config.yml")
142
+ config_options["cloud_formation_endpoint"] = "cloudformation.us-east-1.amazonaws.com"
143
+ puts config_options.inspect
144
+ validator = CfFactory::TemplateValidation.new(cf_json, config_options)
145
+ validator.validate()
146
+ #validator.apply({"AppServerAmi" => ami_id, "AppServerKey" => "majung", "AppPort" => "80", "MasterUserName" => "iamauser", "MasterPassword" => "abcd1234"})
147
+
148
+ #puts "the reference for the VPC : #{vpc.generate_ref}"
@@ -1,35 +1,35 @@
1
- #!/usr/bin/ruby
2
-
3
- require 'cf_factory'
4
-
5
- # CloudFormation template for Atraveo. 2-Tiered web-application with load-balancing.
6
- cf = CfFactory::CfMain.new("S3 Bucket with CloudFront distribution")
7
-
8
- ####### input parameters
9
-
10
- ####### mappings
11
-
12
- ####### resources
13
-
14
- s3_bucket = CfFactory::CfS3Bucket.new("OriginBucket")
15
- cf.add_resource(s3_bucket)
16
- s3_log_bucket = CfFactory::CfS3Bucket.new("LogBucket")
17
-
18
- #cloudfront
19
- logging = CfFactory::CfLogging.new(s3_bucket,"MyDistribution")
20
- options = {:logging => logging}
21
- cloudfront_distribution = CfFactory::CfCloudfrontDistribution.create_s3_distribution("MyS3Distribution",s3_bucket)
22
- cf.add_resource(cloudfront_distribution)
23
-
24
- ####### output parameters
25
- s3_domain = CfFactory::CfOutput.new("S3Domain","Domain name of S3 bucket",s3_bucket.retrieve_attribute("DomainName"))
26
- cf.add_output(s3_domain)
27
- cloudfront_domain = CfFactory::CfOutput.new("CloudfrontDomain", "Endpoint of the CloudFront distribution", cloudfront_distribution.retrieve_attribute("DomainName"))
28
- cf.add_output(cloudfront_domain)
29
-
30
- cf_json = cf.generate
31
- puts cf_json
32
-
33
- config_options = YAML.load_file("aws_config.yml")
34
- validator = CfFactory::TemplateValidation.new(cf_json, config_options)
35
- validator.validate()
1
+ #!/usr/bin/ruby
2
+
3
+ require 'cf_factory'
4
+
5
+ # CloudFormation template for Atraveo. 2-Tiered web-application with load-balancing.
6
+ cf = CfFactory::CfMain.new("S3 Bucket with CloudFront distribution")
7
+
8
+ ####### input parameters
9
+
10
+ ####### mappings
11
+
12
+ ####### resources
13
+
14
+ s3_bucket = CfFactory::CfS3Bucket.new("OriginBucket")
15
+ cf.add_resource(s3_bucket)
16
+ s3_log_bucket = CfFactory::CfS3Bucket.new("LogBucket")
17
+
18
+ #cloudfront
19
+ logging = CfFactory::CfLogging.new(s3_bucket,"MyDistribution")
20
+ options = {:logging => logging}
21
+ cloudfront_distribution = CfFactory::CfCloudfrontDistribution.create_s3_distribution("MyS3Distribution",s3_bucket)
22
+ cf.add_resource(cloudfront_distribution)
23
+
24
+ ####### output parameters
25
+ s3_domain = CfFactory::CfOutput.new("S3Domain","Domain name of S3 bucket",s3_bucket.retrieve_attribute("DomainName"))
26
+ cf.add_output(s3_domain)
27
+ cloudfront_domain = CfFactory::CfOutput.new("CloudfrontDomain", "Endpoint of the CloudFront distribution", cloudfront_distribution.retrieve_attribute("DomainName"))
28
+ cf.add_output(cloudfront_domain)
29
+
30
+ cf_json = cf.generate
31
+ puts cf_json
32
+
33
+ config_options = YAML.load_file("aws_config.yml")
34
+ validator = CfFactory::TemplateValidation.new(cf_json, config_options)
35
+ validator.validate()
data/examples/test_vpc.rb CHANGED
@@ -1,61 +1,61 @@
1
- #!/usr/bin/ruby
2
-
3
- require 'cf_factory'
4
-
5
- cf = CfFactory::CfMain.new("Bla bla bla")
6
- ####### input parameters
7
- parameter = CfFactory::CfParameter.new("KeyName", "Name of the key", "String", {"Default" => "majung"})
8
- cf.add_parameter(parameter)
9
- parameter2 = CfFactory::CfParameter.new("SecurityGroup", "Name of the security group", "String", {"Default" => "Blubber"})
10
- cf.add_parameter(parameter2)
11
-
12
- ####### mappings
13
- mapping = CfFactory::CfMapping.new("Default","AMI",{"us-east-1" => "ami-c6699baf", "us-west-2" => "ami-52ff7262"})
14
- cf.add_mapping(mapping)
15
-
16
- ####### resources
17
- #vpc
18
- vpc = CfFactory::CfVpc.new("10.10.0.0/16")
19
- cf.add_vpc(vpc)
20
- igw = CfFactory::CfInternetGateway.new("MyInternetGateway", vpc)
21
- vpc.add_internet_gateway(igw)
22
- route_table = CfFactory::CfRouteTable.new("MyRouteTable")
23
- vpc.add_route_table(route_table)
24
- route1 = CfFactory::CfRoute.new("MyRoute1", "88.44.22.11/32", igw)
25
- route2 = CfFactory::CfRoute.new("MyRoute2", "188.144.122.111/32", igw)
26
- route_table.add_route(route1)
27
- route_table.add_route(route2)
28
-
29
- network_acl = CfFactory::CfNetworkAcl.new("MyAcl1")
30
- vpc.add_network_acl(network_acl)
31
- network_acl_entry = CfFactory::CfNetworkAclEntry.new("Acl1", "110", "6", "ALLOW", false, "0.0.0.0/0", 80, 80)
32
- network_acl.add_network_acl_entry(network_acl_entry)
33
-
34
- subnet1 = CfFactory::CfSubnet.new("WebTier1", "10.10.0.0/24", "eu-west-1a", route_table, network_acl)
35
- vpc.add_subnet(subnet1)
36
- subnet2 = CfFactory::CfSubnet.new("AppTier1", "10.10.1.0/24", "eu-west-1a", route_table, network_acl)
37
- vpc.add_subnet(subnet2)
38
- subnet3 = CfFactory::CfSubnet.new("DbTier1", "10.10.2.0/24", "eu-west-1a", route_table, network_acl)
39
- vpc.add_subnet(subnet3)
40
-
41
- #elb
42
- #elb = CfElb.new("MyElb", {
43
- # :availability_zones => "eu-west-1",
44
- # :app_cookie_stickiness_policy => CfAppCookieStickinessPolicy.new("cookie-name","policy bla")})
45
- #cf.add_elb(elb)
46
- #puts elb.get_cf_properties()
47
-
48
- ####### output parameters
49
- output = CfFactory::CfOutput.new("VpcId", "Id of the VPC", vpc.generate_ref())
50
- cf.add_output(output)
51
-
52
-
53
- cf_json = cf.generate
54
- puts cf_json
55
-
56
- config_options = YAML.load_file("aws_config.yml")
57
- validator = CfFactory::TemplateValidation.new(cf_json, config_options)
58
- validator.validate()
59
-
60
-
61
- #puts "the reference for the VPC : #{vpc.generate_ref}"
1
+ #!/usr/bin/ruby
2
+
3
+ require 'cf_factory'
4
+ require 'cf_factory/base/cf_main'
5
+
6
+ cf = CfFactory::CfMain.new("Bla bla bla")
7
+ ####### input parameters
8
+ parameter = CfFactory::CfParameter.new("KeyName", "Name of the key", "String", {"Default" => "majung"})
9
+ cf.add_parameter(parameter)
10
+ parameter2 = CfFactory::CfParameter.new("SecurityGroup", "Name of the security group", "String", {"Default" => "Blubber"})
11
+ cf.add_parameter(parameter2)
12
+
13
+ ####### mappings
14
+ mapping = CfFactory::CfMapping.new("Default","AMI",{"us-east-1" => "ami-c6699baf", "us-west-2" => "ami-52ff7262"})
15
+ cf.add_mapping(mapping)
16
+
17
+ ####### resources
18
+ #vpc
19
+ vpc = CfFactory::CfVpc.new("10.10.0.0/16")
20
+ cf.add_vpc(vpc)
21
+ igw = CfFactory::CfInternetGateway.new("MyInternetGateway", vpc)
22
+ vpc.add_internet_gateway(igw)
23
+ route_table = CfFactory::CfRouteTable.new("MyRouteTable")
24
+ vpc.add_route_table(route_table)
25
+ route1 = CfFactory::CfRoute.new("MyRoute1", "88.44.22.11/32", igw)
26
+ route2 = CfFactory::CfRoute.new("MyRoute2", "188.144.122.111/32", igw)
27
+ route_table.add_route(route1)
28
+ route_table.add_route(route2)
29
+
30
+ network_acl = CfFactory::CfNetworkAcl.new("MyAcl1")
31
+ vpc.add_network_acl(network_acl)
32
+ network_acl_entry = CfFactory::CfNetworkAclEntry.new("Acl1", "110", "6", "ALLOW", false, "0.0.0.0/0", 80, 80)
33
+ network_acl.add_network_acl_entry(network_acl_entry)
34
+
35
+ subnet1 = CfFactory::CfSubnet.new("WebTier1", "10.10.0.0/24", "eu-west-1a", route_table, network_acl)
36
+ vpc.add_subnet(subnet1)
37
+ subnet2 = CfFactory::CfSubnet.new("AppTier1", "10.10.1.0/24", "eu-west-1a", route_table, network_acl)
38
+ vpc.add_subnet(subnet2)
39
+ subnet3 = CfFactory::CfSubnet.new("DbTier1", "10.10.2.0/24", "eu-west-1a", route_table, network_acl)
40
+ vpc.add_subnet(subnet3)
41
+
42
+ #elb
43
+ #elb = CfElb.new("MyElb", {
44
+ # :availability_zones => "eu-west-1",
45
+ # :app_cookie_stickiness_policy => CfAppCookieStickinessPolicy.new("cookie-name","policy bla")})
46
+ #cf.add_elb(elb)
47
+ #puts elb.get_cf_properties()
48
+
49
+ ####### output parameters
50
+ output = CfFactory::CfOutput.new("VpcId", "Id of the VPC", vpc.generate_ref())
51
+ cf.add_output(output)
52
+
53
+ cf_json = cf.generate
54
+ puts cf_json
55
+
56
+ config_options = YAML.load_file("aws_config.yml")
57
+ validator = CfFactory::TemplateValidation.new(cf_json, config_options)
58
+ validator.validate()
59
+
60
+
61
+ #puts "the reference for the VPC : #{vpc.generate_ref}"