diff --git a/managed-route53/Makefile b/managed-route53/Makefile new file mode 100644 index 00000000..7f7e0785 --- /dev/null +++ b/managed-route53/Makefile @@ -0,0 +1,29 @@ + +ifdef ACCOUNTS +else + ACCOUNTS := 442294194136 +endif + +TEST := false + +ifdef AWS_REGION +else + AWS_REGION := us-east-1 +endif + +build: setup + +buildlambda: upload update + +upload: + npm install + cd build.f; node run_upload_code; + +update: + npm install + cd build.f; node run_update_code; + +setup: + cd build.f/particles-initial; npm install; ./node_modules/.bin/gulp condensation:build; ./node_modules/.bin/gulp condensation:deploy; + +clean: diff --git a/managed-route53/README.md b/managed-route53/README.md new file mode 100644 index 00000000..3d479e8a --- /dev/null +++ b/managed-route53/README.md @@ -0,0 +1,23 @@ + +# Route53 + +AWS micro service to Manage AWS Route53. + + +## How To Setup + + $ make \ + -e AWS_REGION= \ + -e ACCOUNTS="" + + +## How To Update Lambda Function Codes + + $ make buildlambda + + +## How To Remove Service + + $ make clean -e AWS_REGION= + + diff --git a/managed-route53/build.f/particles-initial/.gitignore b/managed-route53/build.f/particles-initial/.gitignore new file mode 100644 index 00000000..c4eeca9b --- /dev/null +++ b/managed-route53/build.f/particles-initial/.gitignore @@ -0,0 +1,4 @@ +condensation_errors +config/local.js +dist +node_modules diff --git a/managed-route53/build.f/particles-initial/condensation.js b/managed-route53/build.f/particles-initial/condensation.js new file mode 100644 index 00000000..dc838682 --- /dev/null +++ b/managed-route53/build.f/particles-initial/condensation.js @@ -0,0 +1,21 @@ +var git = require('gulp-git'), +gulp = require('gulp'), +vfs = require('vinyl-fs'), +zip = require('gulp-zip'), +exec = require('child_process').exec; + +module.exports.initialize = function(cb) { + var child = exec('npm install', function(error, stdout, stderr) { + if (error) return cb(error); + }); + + vfs.src(["managed-route53/index_*.js", "managed-route53/json/*.json", "lib/flow_controller.js", "lib/aws/*.js"],{cwd:'../../..', base:'../../..'}) + .pipe(zip('managed-route53.zip')) + .pipe(gulp.dest('./particles/assets')) + .on('end', function(err, data) { + vfs.src(['cloudformation/*.js'],{cwd:'../../..', base:'../../..'}) + .pipe(zip('cloudformation_builder.zip')) + .pipe(gulp.dest('./particles/assets')) + .on('end', cb); + }); +}; diff --git a/managed-route53/build.f/particles-initial/config/default.js b/managed-route53/build.f/particles-initial/config/default.js new file mode 100644 index 00000000..70405100 --- /dev/null +++ b/managed-route53/build.f/particles-initial/config/default.js @@ -0,0 +1,16 @@ +var config = { + s3: [ + { + aws: { + region: 'us-east-1', + bucket: 'sgas.particles-managed-route53.442294194136.us-east-1' + }, + clean: true, + validate: true, + create: true + } + ], + dist: 'dist' +}; + +module.exports = config; diff --git a/managed-route53/build.f/particles-initial/gulpfile.js b/managed-route53/build.f/particles-initial/gulpfile.js new file mode 100644 index 00000000..f13fd13d --- /dev/null +++ b/managed-route53/build.f/particles-initial/gulpfile.js @@ -0,0 +1,7 @@ +var gulp = require('gulp'), +config = require('config'); + +// Will add necessary gulp tasks to build, compile and validate +// CloudFormation templates + +require('condensation').buildTasks(gulp,config); diff --git a/managed-route53/build.f/particles-initial/package.json b/managed-route53/build.f/particles-initial/package.json new file mode 100644 index 00000000..a89571f5 --- /dev/null +++ b/managed-route53/build.f/particles-initial/package.json @@ -0,0 +1,33 @@ +{ + "name": "managed-route53", + "version": "0.0.1", + "description": "Condensation particles for building AWS Route53 CloudFormation templates.", + "scripts": { + "test": "./node_modules/.bin/mocha", + "build": "./node_modules/.bin/gulp condensation:build", + "deploy": "./node_modules/.bin/gulp condensation:deploy", + "gulp": "./node_modules/.bin/gulp" + }, + "license": "Apache-2.0", + "keywords": [ + "condensation-particles", + "aws", + "cloudformation", + "cloud", + "formation", + "aws", + "vpc" + ], + "dependencies": { + "condensation": "^0.5.5", + "config": "^1.21.0", + "gulp": "^3.9.1", + "particles-core": "^0.4.5", + "particles-vpc": "^0.5.1", + "particles-nat-gateway": "^0.2.2" + }, + "devDependencies": { + "condensation-particle-tests": "^0.5.2", + "mocha": "^2.5.3" + } +} diff --git a/managed-route53/build.f/particles-initial/particles/cftemplates/route53HostedZone.json.hbs b/managed-route53/build.f/particles-initial/particles/cftemplates/route53HostedZone.json.hbs new file mode 100644 index 00000000..033e4dd1 --- /dev/null +++ b/managed-route53/build.f/particles-initial/particles/cftemplates/route53HostedZone.json.hbs @@ -0,0 +1,4 @@ +{{#layout templateDescription="This template creates Route53 Hosted Zone"}} +{{set "hostedzone"}} + +{{/layout}} diff --git a/managed-route53/build.f/particles-initial/particles/cftemplates/route53RecordSet.json.hbs b/managed-route53/build.f/particles-initial/particles/cftemplates/route53RecordSet.json.hbs new file mode 100644 index 00000000..982d25d4 --- /dev/null +++ b/managed-route53/build.f/particles-initial/particles/cftemplates/route53RecordSet.json.hbs @@ -0,0 +1,4 @@ +{{#layout templateDescription="This template creates Route53 Record Set"}} + +{{set "recordset"}} +{{/layout}} diff --git a/managed-route53/build.f/particles-initial/particles/parameters/optionalString.hbs b/managed-route53/build.f/particles-initial/particles/parameters/optionalString.hbs new file mode 100644 index 00000000..2c2583c5 --- /dev/null +++ b/managed-route53/build.f/particles-initial/particles/parameters/optionalString.hbs @@ -0,0 +1,8 @@ +--- +description: "Optional input for Route53" +--- +{{ + parameter "m:core" "base" + type="String" + optional=true +}} diff --git a/managed-route53/build.f/particles-initial/particles/parameters/requiredString.hbs b/managed-route53/build.f/particles-initial/particles/parameters/requiredString.hbs new file mode 100644 index 00000000..7dcac27b --- /dev/null +++ b/managed-route53/build.f/particles-initial/particles/parameters/requiredString.hbs @@ -0,0 +1,7 @@ +--- +description: "Required input for Route53" +--- +{{ + parameter "m:core" "base" + type="String" +}} diff --git a/managed-route53/build.f/particles-initial/particles/resources/route53HostedZone.hbs b/managed-route53/build.f/particles-initial/particles/resources/route53HostedZone.hbs new file mode 100644 index 00000000..62bf544d --- /dev/null +++ b/managed-route53/build.f/particles-initial/particles/resources/route53HostedZone.hbs @@ -0,0 +1,6 @@ +{{#resource "m:core" "base" type="AWS::Route53::HostedZone"}} + {{#helper "m:core" "properties"}} + {{helper "m:core" "property" "Name"}} + {{helper "m:core" "property" "Comment" optional=true}} + {{/helper}} +{{/resource}} diff --git a/managed-route53/build.f/particles-initial/particles/resources/route53RecordSet.hbs b/managed-route53/build.f/particles-initial/particles/resources/route53RecordSet.hbs new file mode 100644 index 00000000..ccd9e305 --- /dev/null +++ b/managed-route53/build.f/particles-initial/particles/resources/route53RecordSet.hbs @@ -0,0 +1,9 @@ +{{#resource "m:core" "base" type="AWS::Route53::RecordSet"}} + {{#helper "m:core" "properties"}} + {{helper "m:core" "property" "HostedZoneId"}} + {{helper "m:core" "property" "Name"}} + {{helper "m:core" "property" "Type"}} + {{helper "m:core" "property" "TTL"}} + {{helper "m:core" "property" "ResourceRecords"}} + {{/helper}} +{{/resource}} diff --git a/managed-route53/build.f/particles-initial/particles/sets/hostedzone.hbs b/managed-route53/build.f/particles-initial/particles/sets/hostedzone.hbs new file mode 100644 index 00000000..1ea5e55b --- /dev/null +++ b/managed-route53/build.f/particles-initial/particles/sets/hostedzone.hbs @@ -0,0 +1,13 @@ +{{parameter "requiredString" logicalId="RouteHostName"}} +{{parameter "optionalString" logicalId="RouteHostComment"}} + +{{#resource "route53HostedZone" logicalId="Route53HostedZone" }} + "Properties": { + "Name": {{ref "RouteHostName"}}, + "HostedZoneConfig": { + "Comment": {{ref "RouteHostComment"}} + } + } +{{/resource}} + +{{output "m:core" "base" logicalId="Route53HostZoneID" value=(ref "Route53HostedZone")}} diff --git a/managed-route53/build.f/particles-initial/particles/sets/recordset.hbs b/managed-route53/build.f/particles-initial/particles/sets/recordset.hbs new file mode 100644 index 00000000..f61211aa --- /dev/null +++ b/managed-route53/build.f/particles-initial/particles/sets/recordset.hbs @@ -0,0 +1,19 @@ +{{parameter "requiredString" logicalId="HostedZoneId" description="Hosted Zone Id"}} +{{parameter "requiredString" logicalId="RecordSetName" description="Name of Record Set"}} +{{parameter "requiredString" logicalId="RecordSetType" description="Type of Record Set, eg: A, CNAME, MX, AAAA, TXT, PTR, SRV, SPF, NAPTR"}} +{{parameter "requiredString" logicalId="ResourceRecord" description="Value for the record set"}} +{{parameter "requiredString" logicalId="TTLValue" description="TTL in seconds"}} +{{parameter "requiredString" logicalId="ResourceRecord" description="Value for Record Set Type" type="CommaDelimitedList"}} + +{{#resource logicalId="Route53RecordSet"}} + "Type": "AWS::Route53::RecordSet", + "Properties": { + "HostedZoneId": {{ref "HostedZoneId"}}, + "Name": {{ref "RecordSetName"}}, + "Type": {{ref "RecordSetType"}}, + "TTL": {{ref "TTLValue"}}, + "ResourceRecords": {{ref "ResourceRecord"}} + } +{{/resource}} + +{{output "m:core" "base" logicalId="Route53RecordSetDomainName" value=(ref "Route53RecordSet")}} diff --git a/managed-route53/build.f/run_stack.js b/managed-route53/build.f/run_stack.js new file mode 100644 index 00000000..cc50e97f --- /dev/null +++ b/managed-route53/build.f/run_stack.js @@ -0,0 +1,48 @@ + +var argv = require('minimist')(process.argv.slice(2)); +var action = argv._[0]; +var region = argv['region']; +var name = argv['name']; +var particles = argv['particles']; +if (!region || !action || (action != 'launch' && action != 'drop') || !name) { + console.log("Usage : node run_stack launch/drop --region --name [--parameters ] [--particles ]"); + return; +} +console.log('action = ' + action); +console.log('region = ' + region); +console.log('name = ' + name); +console.log('particles Folder = ' + particles); + +var templateStr = null; +if (particles) { + var fs = require("fs"); + templateStr = fs.readFileSync(__dirname + '/particles-' + particles + "/dist/0/particles/cftemplates/template.json", {encoding:'utf8'}); +} +var input = { + region: region, + stackName: name +} +if (templateStr) input.templateStr = templateStr; +console.log(input); + +var stack_builder = new (require('../../lib/stack_builder'))(); +stack_builder[action](input, function(err, data) { + if(err) { + if (action == 'launch') { + console.log("Error occurred during " + action + " : " + err); + process.exit(1); + } + else if (action == 'drop') { + console.log("stack was already removed"); + process.exit(0); + } + } + else if(data) { + console.log("Successfully completed to " + action + " stack"); + process.exit(0); + } + else { + console.log("Failed to " + action + " stack"); + process.exit(1); + } +}); diff --git a/managed-route53/package.json b/managed-route53/package.json new file mode 100644 index 00000000..a89571f5 --- /dev/null +++ b/managed-route53/package.json @@ -0,0 +1,33 @@ +{ + "name": "managed-route53", + "version": "0.0.1", + "description": "Condensation particles for building AWS Route53 CloudFormation templates.", + "scripts": { + "test": "./node_modules/.bin/mocha", + "build": "./node_modules/.bin/gulp condensation:build", + "deploy": "./node_modules/.bin/gulp condensation:deploy", + "gulp": "./node_modules/.bin/gulp" + }, + "license": "Apache-2.0", + "keywords": [ + "condensation-particles", + "aws", + "cloudformation", + "cloud", + "formation", + "aws", + "vpc" + ], + "dependencies": { + "condensation": "^0.5.5", + "config": "^1.21.0", + "gulp": "^3.9.1", + "particles-core": "^0.4.5", + "particles-vpc": "^0.5.1", + "particles-nat-gateway": "^0.2.2" + }, + "devDependencies": { + "condensation-particle-tests": "^0.5.2", + "mocha": "^2.5.3" + } +}