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)