Skip to content

Instantly share code, notes, and snippets.

@s-fujimoto
Created May 28, 2016 08:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save s-fujimoto/b0ab1caef5f23246748f27b2840e4682 to your computer and use it in GitHub Desktop.
Save s-fujimoto/b0ab1caef5f23246748f27b2840e4682 to your computer and use it in GitHub Desktop.
CloudFormation parameters use by YAML format
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import json
try:
import boto3
import yaml
except ImportError:
print '*******************************'
print 'ERROR : Please install boto3 and PyYAML. Please exec following commad.'
print 'pip install boto3 PyYAML'
print '*******************************'
import sys
sys.exit(1)
def parse_args():
parser = argparse.ArgumentParser()
subparser = parser.add_subparsers()
parser_gen = subparser.add_parser('generate-parameters')
parser_gen.add_argument('--template-file', dest='template_file', required=True)
parser_gen.add_argument('--parameters-file', dest='parameters_file', required=True)
parser_gen.set_defaults(func=generate_parameters)
parser_gen2 = subparser.add_parser('g')
parser_gen2.add_argument('--template-file', dest='template_file', required=True)
parser_gen2.add_argument('--parameters-file', dest='parameters_file', required=True)
parser_gen2.set_defaults(func=generate_parameters)
parser_create = subparser.add_parser('create-stack')
parser_create.add_argument('--stack-name', dest='stack_name', required=True)
parser_create.add_argument('--template-file', dest='template_file', required=True)
parser_create.add_argument('--parameters-file', dest='parameters_file', required=True)
parser_create.add_argument('--profile', dest='profile', required=False)
parser_create.set_defaults(func=create_stack)
parser_create2 = subparser.add_parser('c')
parser_create2.add_argument('--stack-name', dest='stack_name', required=True)
parser_create2.add_argument('--template-file', dest='template_file', required=True)
parser_create2.add_argument('--parameters-file', dest='parameters_file', required=False)
parser_create2.add_argument('--profile', dest='profile', required=False)
parser_create2.set_defaults(func=create_stack)
return parser.parse_args()
def _write_yaml_file(file_path, params):
with open(file_path, "w") as f:
for name, data in params.items():
default = None
for key, val in data.items():
if isinstance(val, (list, dict)):
val = json.dumps(val)
if key == 'Default':
default = val
f.writelines("### %s: %s\n" % (key, str(val)))
f.writelines(name + ": %s\n" % (default if default else ''))
f.writelines("\n")
def _read_yaml_file(file_path):
with open(file_path) as f:
return yaml.load(f.read())
def _read_json_file(file_path):
with open(file_path) as f:
return json.load(f)
def _create_parameters_format(params):
cfn_params = []
for key, value in params.items():
cfn_params.append({'ParameterKey': key, 'ParameterValue': value})
return cfn_params
def generate_parameters(args):
body = _read_json_file(args.template_file)
params = body['Parameters']
_write_yaml_file(args.parameters_file, params)
def create_stack(args):
template = json.dumps(_read_json_file(args.template_file))
params = None
if args.parameters_file:
params = _create_parameters_format(_read_yaml_file(args.parameters_file))
session = boto3.session.Session(profile_name=args.profile)
session.client('cloudformation').create_stack(
StackName=args.stack_name,
TemplateBody=template,
Parameters=params,
Capabilities=[ 'CAPABILITY_IAM' ],
)
def main():
args = parse_args()
args.func(args)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment