cdkDiff
cdkDiff
This script performs a CDK diff into an AWS account.
Welcome users: run this script as
ENVIRONMENT=some_env python3 cdkDiff [-p <properties_env>] [-l <cdk_language> (Default: python)] [-h Help] [-v VERBOSE]
CDK Diff Return Codes:
- 0 - No CDK Diff
- 1 - CDK Diff OR ERROR in parse/compile
Our Return Codes:
- 0 - CDK Diff found, OR, Deploy Override was set
- 1 - No CDK Diff was found
- 2 - CDK Diff ERROR / Script Error
1#!/usr/bin/env python3 2""" 3cdkDiff 4 5This script performs a CDK diff into an AWS account. 6 7Welcome users: run this script as 8 9 ENVIRONMENT=some_env python3 cdkDiff [-p <properties_env>] [-l <cdk_language> (Default: python)] [-h Help] [-v VERBOSE] 10 11CDK Diff Return Codes: 12 13* 0 - No CDK Diff 14* 1 - CDK Diff OR ERROR in parse/compile 15 16Our Return Codes: 17 18* 0 - CDK Diff found, OR, Deploy Override was set 19* 1 - No CDK Diff was found 20* 2 - CDK Diff ERROR / Script Error 21 22""" 23 24import argparse 25import os 26import glob 27import json 28import yaml 29import sys 30from pathlib import Path 31from utils import cdk, common 32from subprocess_tee import run as _run 33 34REGION = os.environ.get('AWS_DEFAULT_REGION', 'us-east-1') 35_EXIT = 1 36 37 38if __name__ == "__main__": 39 print("cdkDiff.__main__(): BEGIN") 40 41 # 42 # ArgParse 43 # 44 parser = argparse.ArgumentParser(description='Deploy a CDK to an AWS Environment.') 45 parser.add_argument( 46 '-p', 47 '--properties_env', 48 action='store', 49 type=str, 50 required=False, 51 default=os.environ.get('CDK_ENV', None), 52 help='properties env file [i.e. gov-prod in properties.gov-prod.json]') 53 54 parser.add_argument( 55 '-l', 56 '--language', 57 action='store', 58 type=str, 59 required=False, 60 default=os.environ.get('CDK_LANG', None), 61 help='cdk language to use [python, typescript]') 62 63 parser.add_argument( 64 '-P', 65 '--path', 66 action='store', 67 type=str, 68 required=False, 69 default=os.environ.get('CDK_PATH', None), 70 help='cdk path, if different from root. Will attempt to dynamically find it.') 71 72 parser.add_argument( 73 '-v', 74 '--verbose', 75 action='count', 76 default=0, 77 required=False, 78 help='verbosity level') 79 80 args = parser.parse_args() 81 82 _VERBOSE = args.verbose 83 _CDK_ENV = args.properties_env 84 _CDK_LANG = args.language 85 _CDK_PATH = args.path if args.path is not None else os.path.dirname(glob.glob('**/cdk.json', recursive=True)[0]) 86 _PROPS_FILE = f"properties.{_CDK_ENV}.json" 87 _CDK_DIFF_FILE = f"{os.getcwd()}/cdk.diff.txt" 88 89 with common.ChDir(_CDK_PATH): 90 env_file = Path(_PROPS_FILE).read_text() 91 # env_data = json.load(env_file) 92 print(env_file) 93 94 cdk.install_cdk_requirements(cdk_lang=_CDK_LANG) 95 96 my_env = os.environ.copy() 97 my_env["ENVIRONMENT"] = _CDK_ENV 98 99 _process_output = _run(['cdk', 'diff', '--fail', '--verbose'], env=my_env, check=False) 100 101 if _process_output.returncode != 0: 102 print("cdkDiff.__main__(): CDK returned "+str(_process_output.returncode)+". Testing for CDK Error or Diff.") 103 104 with open(_CDK_DIFF_FILE, 'w') as file: 105 file.write(_process_output.stderr) 106 107 if '[~]' in _process_output.stderr or '[+]' in _process_output.stderr or '[-]' in _process_output.stderr or '[=]' in _process_output.stderr: 108 print("cdkDiff.__main__(): CDK Diff found!") 109 _EXIT = 0 110 else: 111 print("cdkDiff.__main__(): CDK ERROR!") 112 for stack in glob.glob('cdk.out/*.json'): 113 print("----------------------------------") 114 print("STACK: " + stack) 115 _stack_yaml = yaml.dump(json.loads(Path(stack).read_text())) 116 print(_stack_yaml) 117 _EXIT = 2 118 119 else: 120 # if 'DEPLOY_OVERRIDE' in os.environ.keys(): 121 # print("cdkDiff.__main__(): No CDK diff! Overriding CDK_DIFF because DEPLOY_OVERRIDE") 122 # _EXIT = 0 123 # else: 124 with open(_CDK_DIFF_FILE, 'w') as file: 125 file.write("NO CDK diff found. This could be an AMI SSM Param change. Deploy proceding.") 126 127 print("cdkDiff.__main__(): NO CDK diff found. This could be an AMI SSM Param change. Deploy proceding.") 128 _EXIT = 0 129 130 sys.exit(_EXIT)