A lambda-formation project that will Create, Update and Cancel Spotinst resources for AWS Lambda and CloudFormation.
To view full documentation
$ # Install only dependencies (no devDependencies)
$ npm --production install
$
$ # create the distribution
$ npm run dist
$
$ # Now upload dist/spotinst-lambda.zip to AWS Lambda, S3 or include in CloudFormation
Use either User Credentials parameters or accessCode. If both are provided
then User Credentials take precedence.
While multiple forms of credentials are supported it is highly recommended to use a Personal Access Token
username - Spotinst Username
password - Spotinst Password
clientId - Client ID for Spotinst Account
clientSecret - Client Secret for Spotinst Account
accessCode - Short term access code retrieved using Spotinst token
service or Personal Access
Token
index/handler
Params
In addition to one of the credential parameter groups:
-
resourceType required
string- elasticgroup|subscription -
requestType required
string- create|update|delete -
group
object- Spotinst group definition. Required forelasticgroupcreate|update, not used for delete -
subscription
object- Spotinst group definition. Required forsubscriptioncreate|update, not used for delete -
id
string- required for update|delete
Set the resource Type to Custom::elasticgroup or Custom::subscription
{
"accessToken": TOKEN
"requestType": "create",
"resourceType": "elasticgroup",
"group": {
"name": "test",
"strategy": {
"risk": 100,
"onDemandCount": null,
"availabilityVsCost": "balanced"
},
"capacity": {
"target": 1,
"minimum": 1,
"maximum": 1
},
"scaling": {},
"compute": {
"instanceTypes": {
"ondemand": "m3.medium",
"spot": [
"m3.medium"
]
},
"availabilityZones": [
{
"name": "us-east-1a",
"subnetId": SUBNET_ID
}
],
"launchSpecification": {
"monitoring": false,
"imageId": "ami-60b6c60a",
"keyPair": "kevinkey",
"securityGroupIds": [
SECURITY_GROUP_ID
]
},
"product": "Linux/UNIX"
},
"scheduling": {},
"thirdPartiesIntegration": {}
}
}
Resources:
SpotinstOcean:
Type: "Custom::ocean"
Properties:
accessToken: !Ref SpotinstToken
accountId: !Ref SpotinstAccountId
autoTag: true
ocean:
name: !Ref OceanName
controllerClusterId: !Ref ControllerClusterId
region: !Sub ${AWS::Region}
autoScaler:
isEnabled: true
cooldown: 180
resourceLimits:
maxMemoryGib: 1500
maxVCpu: 750
down:
evaluationPeriods: 3
headroom:
cpuPerUnit: 2000
memoryPerUnit: 0
numOfUnits: 4
isAutoConfig: false
capacity:
minimum: 0
maximum: 1
target: 1
strategy:
spotPercentage: 100
fallbackToOd: true
utilizeReservedInstances: false
compute:
subnetIds:
- ""
instanceTypes:
whitelist:
- "c4.8xlarge"
# blacklist:
# - "c4.8xlarge"
launchSpecification:
imageId: ""
# userData: "12345678987654321"
securityGroupIds:
- ""
# iamInstanceProfile:
# arn: ""
keyPair: ""
tags:
- tagKey: "creator"
tagValue: "testing"
"Resources": {
"SpotinstEMR": {
"Type": "Custom::mrScaler",
"Properties": {
"ServiceToken": "arn:aws:lambda:us-west-2:842422002533:function:spotinst-cloudformation",
"accessToken": "Your Token",
"accountId": "Your Account ID",
"autoTag":true,
"mrScaler":{
"name":"Jeffrey New MRScaler",
"description":"Spotinst MRScaler",
"region":"us-west-2",
"strategy":{
"new":{
"releaseLabel":"emr-5.17.0",
"numberOfRetries":1
},
"provisioningTimeout":{
"timeout":15,
"timeoutAction":"terminateAndRetry"
}
},
"compute":{
"availabilityZones":[
{
"name":"us-west-2b",
"subnetId":"subnet-1ba25052"
}
],
"instanceGroups":{
"masterGroup":{
"instanceTypes":[
"m3.xlarge"
],
"target":1,
"lifeCycle":"ON_DEMAND"
},
"coreGroup":{
"instanceTypes":[
"m3.xlarge"
],
"target":1,
"lifeCycle":"SPOT"
},
"taskGroup":{
"instanceTypes":[
"m1.medium"
],
"capacity":{
"minimum":0,
"maximum":30,
"target":1
},
"lifeCycle":"SPOT"
}
},
"emrManagedMasterSecurityGroup":"sg-8cfb40f6",
"emrManagedSlaveSecurityGroup":"sg-f2f94288",
"additionalMasterSecurityGroups":["sg-f2f94288"],
"additionalSlaveSecurityGroups":["sg-8cfb40f6"],
"ec2KeyName":"Noam-key",
"applications":[
{
"name":"Ganglia",
"version": "1.0"
},
{"name":"Hadoop"},
{"name":"Hive"},
{"name":"Hue"},
{"name":"Mahout"},
{"name":"Pig"},
{"name":"Tez"}
]
},
"cluster":{
"visibleToAllUsers":true,
"terminationProtected":true,
"keepJobFlowAliveWhenNoSteps": true,
"logUri":"s3://sorex-job-status",
"additionalInfo":"{'test':'more information'}",
"jobFlowRole": "EMR_EC2_DefaultRole",
"securityConfiguration":"test-config-jeffrey"
}
}
}
},
}
"Resources": {
"SpotinstStatefulNode": {
"Type": "Custom::statefulNode",
"Properties": {
"ServiceToken": "arn:aws:lambda:us-west-2:842422002533:function:spotinst-cloudformation",
"accessToken": "Your Token",
"accountId": "Your Account ID",
"autoTag":true,
"statefulNode":{
"name":"New Stateful Node",
"description":"Spotinst Stateful Node",
"region":"us-west-2",
"strategy":{
"fallbackToOd":false
},
"persistence": {
"persistPrivateIp": false,
"persistBlockDevices": true,
"persistRootDevice": true,
"blockDevicesMode": "reattach"
},
"healthCheck": {
"autoHealing": false
},
"compute": {
"subnetIds": [
"Your Subnet ID",
"Your Subnet ID"
],
"vpcId": "Your VPC ID",
"launchSpecification": {
"instanceTypes": {
"preferredType": "t3.xlarge",
"types": [
"t3.xlarge"
]
},
"ebsOptimized": false,
"monitoring": false,
"imageId": "Your Image ID",
"tags": [
{
"tagKey": "Creator",
"tagValue": "Name"
}
]
},
"product": "Linux/UNIX"
}
}
}
}
}