Skip to content

Instantly share code, notes, and snippets.

@danieldreier
Created August 30, 2014 18:51
Show Gist options
  • Save danieldreier/e5685e77f9727bf93b18 to your computer and use it in GitHub Desktop.
Save danieldreier/e5685e77f9727bf93b18 to your computer and use it in GitHub Desktop.
coreos cloudformation template using spot pricing for us-west-2 region
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "CoreOS on EC2: http://coreos.com/docs/running-coreos/cloud-providers/ec2/",
"Mappings" : {
"RegionMap" : {
"ap-northeast-1" : {
"AMI" : "ami-57032456"
},
"sa-east-1" : {
"AMI" : "ami-7fe54e62"
},
"ap-southeast-2" : {
"AMI" : "ami-59e48563"
},
"ap-southeast-1" : {
"AMI" : "ami-a49dc7f6"
},
"us-east-1" : {
"AMI" : "ami-601ec508"
},
"us-west-2" : {
"AMI" : "ami-c5f4b0f5"
},
"us-west-1" : {
"AMI" : "ami-b7545bf2"
},
"eu-west-1" : {
"AMI" : "ami-fedb0289"
}
}
},
"Parameters": {
"SpotPrice" : {
"Description" : "Maximum spot price to bid in USD (e.g.: 0.32).",
"Default" : "0.1",
"Type" : "Number"
},
"InstanceType" : {
"Description" : "EC2 PV instance type (m3.medium, etc). Note: m1.small is not supported.",
"Type" : "String",
"Default" : "m3.medium",
"AllowedValues" : ["m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m1.medium", "m1.large", "m1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c1.medium", "c1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "hi1.4xlarge", "hs1.8xlarge", "t1.micro"],
"ConstraintDescription" : "Must be a valid EC2 PV instance type. Note: m1.small is not supported."
},
"ClusterSize": {
"Default": "3",
"MinValue": "3",
"MaxValue": "12",
"Description": "Number of nodes in cluster (3-12).",
"Type": "Number"
},
"DiscoveryURL": {
"Description": "An unique etcd cluster discovery URL. Grab a new token from https://discovery.etcd.io/new",
"Type": "String"
},
"AdvertisedIPAddress": {
"Description": "Use 'private' if your etcd cluster is within one region or 'public' if it spans regions or cloud providers.",
"Default": "private",
"AllowedValues": ["private", "public"],
"Type": "String"
},
"AllowSSHFrom": {
"Description": "The net block (CIDR) that SSH is available to.",
"Default": "0.0.0.0/0",
"Type": "String"
},
"KeyPair" : {
"Description" : "The name of an EC2 Key Pair to allow SSH access to the instance.",
"Type" : "String"
}
},
"Resources": {
"CoreOSSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "CoreOS SecurityGroup",
"SecurityGroupIngress": [
{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "AllowSSHFrom"}}
]
}
},
"Ingress4001": {
"Type": "AWS::EC2::SecurityGroupIngress",
"Properties": {
"GroupName": {"Ref": "CoreOSSecurityGroup"}, "IpProtocol": "tcp", "FromPort": "4001", "ToPort": "4001", "SourceSecurityGroupId": {
"Fn::GetAtt" : [ "CoreOSSecurityGroup", "GroupId" ]
}
}
},
"Ingress7001": {
"Type": "AWS::EC2::SecurityGroupIngress",
"Properties": {
"GroupName": {"Ref": "CoreOSSecurityGroup"}, "IpProtocol": "tcp", "FromPort": "7001", "ToPort": "7001", "SourceSecurityGroupId": {
"Fn::GetAtt" : [ "CoreOSSecurityGroup", "GroupId" ]
}
}
},
"CoreOSServerAutoScale": {
"Type": "AWS::AutoScaling::AutoScalingGroup",
"Properties": {
"AvailabilityZones": {"Fn::GetAZs": ""},
"LaunchConfigurationName": {"Ref": "CoreOSServerLaunchConfig"},
"MinSize": "3",
"MaxSize": "12",
"DesiredCapacity": {"Ref": "ClusterSize"},
"Tags": [
{"Key": "Name", "Value": { "Ref" : "AWS::StackName" }, "PropagateAtLaunch": true}
]
}
},
"CoreOSServerLaunchConfig": {
"Type": "AWS::AutoScaling::LaunchConfiguration",
"Properties": {
"SpotPrice" : { "Ref" : "SpotPrice" },
"ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]},
"InstanceType": {"Ref": "InstanceType"},
"KeyName": {"Ref": "KeyPair"},
"SecurityGroups": [{"Ref": "CoreOSSecurityGroup"}],
"UserData" : { "Fn::Base64":
{ "Fn::Join": [ "", [
"#cloud-config\n\n",
"coreos:\n",
" etcd:\n",
" discovery: ", { "Ref": "DiscoveryURL" }, "\n",
" addr: $", { "Ref": "AdvertisedIPAddress" }, "_ipv4:4001\n",
" peer-addr: $", { "Ref": "AdvertisedIPAddress" }, "_ipv4:7001\n",
" units:\n",
" - name: etcd.service\n",
" command: start\n",
" - name: fleet.service\n",
" command: start\n"
] ]
}
}
}
}
}
}
@danieldreier
Copy link
Author

this distributes the spot requests evenly across availability zones, which gives some level of protection against them all being terminated at once because price spikes are often limited to one AZ.

To use, launch using the aws command line tool with something like:

aws cloudformation create-stack --stack-name=coreoscluster --template-body file:////Users/foo/coreos-cluster/coreos-beta-pv.template --parameters ParameterKey='KeyPair',ParameterValue='daniel'  ParameterKey=DiscoveryURL,ParameterValue='https://discovery.etcd.io/31337' ParameterKey=InstanceType,ParameterValue=c3.large

@danieldreier
Copy link
Author

just a heads-up -- this appears to leave spot requests lying around even after you delete the cloudformation stack. Not sure why or if that would cause problems / expenses.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment