forked from crewjam/etcd-aws
/
base.go
112 lines (97 loc) · 2.82 KB
/
base.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package aws
import (
"strconv"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
cfn "github.com/leestevensea/go-cloudformation"
)
type Parameters struct {
DnsName string
VpcSubnets []cfn.Stringable
}
var Regions = []string{
"us-east-1", // US East (N. Virginia)
"us-west-2", // US West (Oregon)
"us-west-1", // US West (N. California)
"eu-west-1", // EU (Ireland)
"eu-central-1", // EU (Frankfurt)
"ap-southeast-1", // Asia Pacific (Singapore)
"ap-northeast-1", // Asia Pacific (Tokyo)
"ap-southeast-2", // Asia Pacific (Sydney)
"ap-northeast-2", // Asia Pacific (Seoul)
"sa-east-1", // South America (Sao Paulo)
}
func MakeAvailabilityZonesMap(awsSession *session.Session, t *cfn.Template) error {
rv := cfn.Mapping{}
for _, region := range Regions {
s := *awsSession
s.Config = s.Config.Copy()
s.Config.Region = aws.String(region)
azinfo, err := ec2.New(&s).DescribeAvailabilityZones(&ec2.DescribeAvailabilityZonesInput{})
if err != nil {
return err
}
goodZones := []string{}
badZones := []string{}
for _, availabilityZone := range azinfo.AvailabilityZones {
if *availabilityZone.State == ec2.AvailabilityZoneStateAvailable {
goodZones = append(goodZones, *availabilityZone.ZoneName)
} else {
badZones = append(badZones, *availabilityZone.ZoneName)
}
}
zones := append(goodZones, badZones...)
rv[region] = map[string]string{}
for i, zone := range zones {
rv[region][strconv.Itoa(i)] = zone
}
}
t.Mappings["AvailablityZones"] = &rv
return nil
}
// MakeTemplate returns a Cloudformation template for the project infrastructure
func MakeTemplate(awsSession *session.Session, parameters *Parameters) (*cfn.Template, error) {
t := cfn.NewTemplate()
t.Parameters = map[string]*cfn.Parameter{
"MasterScale": &cfn.Parameter{
Description: "Number of master instances",
Type: "String",
Default: "3",
},
"KeyPair": &cfn.Parameter{
Description: "Number of master instances",
Type: "AWS::EC2::KeyPair::KeyName",
Default: "",
},
"Application": &cfn.Parameter{
Description: "Number of master instances",
Type: "String",
Default: "",
},
"InstanceType": &cfn.Parameter{
Description: "The type of instance",
Type: "String",
Default: "t1.micro",
},
}
if err := MakeAvailabilityZonesMap(awsSession, t); err != nil {
return nil, err
}
if err := MakeMapping(parameters, t); err != nil {
return nil, err
}
if err := MakeVPC(parameters, t); err != nil {
return nil, err
}
if err := MakeMaster(parameters, t); err != nil {
return nil, err
}
if err := MakeMasterLoadBalancer(parameters, t); err != nil {
return nil, err
}
if err := MakeHealthCheck(parameters, t); err != nil {
return nil, err
}
return t, nil
}