def create_app_auto_scaling_group(war_file_info, rds_stack_name): ''' Here, we know that the app auto scaling group does not exist. so, we find template url for app autoscaling group, set parameters on it from s3 war file metadata and execute it. :return: ''' group_id = war_file_info["metadata"]["group-id"] artifact_id = war_file_info["metadata"]["artifact-id"] version = war_file_info["metadata"]["version"] app_context_root = war_file_info["metadata"]["context_root"] if app_context_root == "/": app_context_root = "ROOT" context_config_url = war_file_info["metadata"]["context_config_url"] health_check_url = war_file_info["metadata"]["health_check_url"] print(json.dumps(war_file_info, indent=True, sort_keys=True)) network_resources = util.make_base_output_map_from_cfn("Network") iam_resources = util.make_base_output_map_from_cfn("IAM") rds_output_map = util.make_stack_output_map(rds_stack_name) availability_zones = network_resources["AvailabilityZonesOutput"] app_security_groups = network_resources["AppSecurityGroupOutput"] elb_subnets = network_resources["ElbSubnetsOutput"] app_subnets = network_resources["AppSubnetsOutput"] app_elb_security_groups = network_resources["ElbSecurityGroupOutput"] instance_profile = iam_resources["AppInstanceProfileOutput"] app_setup_role = iam_resources["AppSetupRoleOutput"].split("/")[1] war_file_url = util.make_s3_base_url() + "/" + war_file_info["bucket_name"] + "/" + war_file_info["key"] app_fqdn = war_file_info["metadata"]["app_fqdn"] index_of_first_dot = app_fqdn.index(".") domain_name = app_fqdn[index_of_first_dot + 1:] + "." jdbc_replacer_url = util.make_cfn_url("app/replace_jdbc_params.sh") app_stack_parameters = [ {"ParameterKey": "AppSubnetsParam", "ParameterValue": app_subnets}, {"ParameterKey": "AppInstanceProfileParam", "ParameterValue": instance_profile}, {"ParameterKey": "AvailabilityZonesParam", "ParameterValue": availability_zones}, {"ParameterKey": "AppSecurityGroupParam", "ParameterValue": app_security_groups}, {"ParameterKey": "ElbSubnetsParam", "ParameterValue": elb_subnets}, {"ParameterKey": "HealthCheckUrlParam", "ParameterValue": health_check_url}, {"ParameterKey": "ElbSecurityGroupParam", "ParameterValue": app_elb_security_groups}, {"ParameterKey": "ArtifactBucketNameParam", "ParameterValue": war_file_info["bucket_name"]}, {"ParameterKey": "WarFileUrlParam", "ParameterValue": war_file_url}, {"ParameterKey": "AppSetupRoleParam", "ParameterValue": app_setup_role}, {"ParameterKey": "AppConfigXmlUrlParam", "ParameterValue": context_config_url}, {"ParameterKey": "ContextRootParam", "ParameterValue": app_context_root}, {"ParameterKey": "AppDnsNameParam", "ParameterValue": app_fqdn}, {"ParameterKey": "DomainNameHostedZoneNameParam", "ParameterValue": domain_name}, {"ParameterKey": "DbHostParam", "ParameterValue": rds_output_map["AppDbEndpointOutput"]}, {"ParameterKey": "DbUsernameParam", "ParameterValue": war_file_info["metadata"]["db-username"]}, {"ParameterKey": "DbPasswordParam", "ParameterValue": war_file_info["metadata"]["db-password"]}, {"ParameterKey": "DbNameParam", "ParameterValue": war_file_info["metadata"]["db-name"]}, {"ParameterKey": "JdbcSetupShParam", "ParameterValue": jdbc_replacer_url} ] cfn_client.create_stack( StackName=(group_id + "-" + artifact_id + "-" + version).replace(".", "-"), TemplateURL=util.make_cfn_url("app/app.template"), Parameters=app_stack_parameters )
def deploy(event, context): print(json.dumps(event, indent=4, sort_keys=True, default=lambda x: str(x))) deployable_bucket_name = event["Records"][0]["s3"]["bucket"]["name"] deployable_key_name = event["Records"][0]["s3"]["object"]["key"] app_metadata = util.get_app_metadata( deployable_bucket_name, deployable_key_name ) rds_version = app_metadata['Metadata']['db-version'] db_name = app_metadata['Metadata']['db-name'] db_username = app_metadata['Metadata']['db-username'] db_password = app_metadata['Metadata']['db-password'] all_db_instances = rds_client.describe_db_instances() found_db = False if len(all_db_instances['DBInstances']) > 0: for each_db_instance in all_db_instances['DBInstances']: all_tags = each_db_instance['Tags'] if "Tags" in each_db_instance else {} if "tvarit_version" in all_tags and all_tags['tvarit_version'] == rds_version: found_db = each_db_instance["Endpoint"] else: found_db = False sns_resources = util.make_base_output_map_from_cfn("SnsTopics") deploy_complete_topic = sns_resources["RdsDeployedSnsTopicOutput"] rds_already_deployed_sqs_q = sns_resources["RdsAlreadyDeployedSqsTopicOutput"] if not found_db: print("db not found!") rds_template = util.make_cfn_url("app/rds.template") group_id = app_metadata['Metadata']["group-id"] artifact_id = app_metadata['Metadata']["artifact-id"] version = app_metadata['Metadata']["version"] print("db to be created: group, artifact, version: " + group_id + " : " + artifact_id + " : " + version) network_resources = util.make_base_output_map_from_cfn("Network") print(json.dumps(network_resources, indent=4, sort_keys=True, default=lambda x: str(x))) db_subnet_group = network_resources["DbSubnetGroupOutput"] db_security_group = network_resources["DbSecurityGroupOutput"] rds_stack_parameters = [ {"ParameterKey": "DbSubnetGroupNameParam", "ParameterValue": db_subnet_group}, {"ParameterKey": "DbVersionParam", "ParameterValue": rds_version}, {"ParameterKey": "DbNameParam", "ParameterValue": db_name}, {"ParameterKey": "DbUsernameParam", "ParameterValue": db_username}, {"ParameterKey": "DbPasswordParam", "ParameterValue": db_password}, {"ParameterKey": "DbSecurityGroupParam", "ParameterValue": db_security_group} ] print("printing rds_stack_parameters") print(json.dumps(rds_stack_parameters, indent=4, sort_keys=True, default=lambda x: str(x))) stack_name = ("rds" + group_id + "-" + artifact_id + "-" + version).replace(".", "-") cfn_client.create_stack( StackName=stack_name, TemplateURL=rds_template, Parameters=rds_stack_parameters, NotificationARNs=[deploy_complete_topic], Tags=[{"Key": "app_file_object", "Value": deployable_bucket_name + "::" + deployable_key_name}] ) else: print("found the version tag and it was same as rds version " + rds_version) sqs_client.send_message(QueueUrl=rds_already_deployed_sqs_q, MessageBody=json.dumps(found_db))
def create_app_auto_scaling_group(war_file_info, rds_stack_name): ''' Here, we know that the app auto scaling group does not exist. so, we find template url for app autoscaling group, set parameters on it from s3 war file metadata and execute it. :return: ''' group_id = war_file_info["metadata"]["group-id"] artifact_id = war_file_info["metadata"]["artifact-id"] version = war_file_info["metadata"]["version"] app_context_root = war_file_info["metadata"]["context_root"] if app_context_root == "/": app_context_root = "ROOT" context_config_url = war_file_info["metadata"]["context_config_url"] health_check_url = war_file_info["metadata"]["health_check_url"] print(json.dumps(war_file_info, indent=True, sort_keys=True)) network_resources = util.make_base_output_map_from_cfn("Network") iam_resources = util.make_base_output_map_from_cfn("IAM") rds_output_map = util.make_stack_output_map(rds_stack_name) availability_zones = network_resources["AvailabilityZonesOutput"] app_security_groups = network_resources["AppSecurityGroupOutput"] elb_subnets = network_resources["ElbSubnetsOutput"] app_subnets = network_resources["AppSubnetsOutput"] app_elb_security_groups = network_resources["ElbSecurityGroupOutput"] instance_profile = iam_resources["AppInstanceProfileOutput"] app_setup_role = iam_resources["AppSetupRoleOutput"].split("/")[1] war_file_url = util.make_s3_base_url( ) + "/" + war_file_info["bucket_name"] + "/" + war_file_info["key"] app_fqdn = war_file_info["metadata"]["app_fqdn"] index_of_first_dot = app_fqdn.index(".") domain_name = app_fqdn[index_of_first_dot + 1:] + "." jdbc_replacer_url = util.make_cfn_url("app/replace_jdbc_params.sh") app_stack_parameters = [{ "ParameterKey": "AppSubnetsParam", "ParameterValue": app_subnets }, { "ParameterKey": "AppInstanceProfileParam", "ParameterValue": instance_profile }, { "ParameterKey": "AvailabilityZonesParam", "ParameterValue": availability_zones }, { "ParameterKey": "AppSecurityGroupParam", "ParameterValue": app_security_groups }, { "ParameterKey": "ElbSubnetsParam", "ParameterValue": elb_subnets }, { "ParameterKey": "HealthCheckUrlParam", "ParameterValue": health_check_url }, { "ParameterKey": "ElbSecurityGroupParam", "ParameterValue": app_elb_security_groups }, { "ParameterKey": "ArtifactBucketNameParam", "ParameterValue": war_file_info["bucket_name"] }, { "ParameterKey": "WarFileUrlParam", "ParameterValue": war_file_url }, { "ParameterKey": "AppSetupRoleParam", "ParameterValue": app_setup_role }, { "ParameterKey": "AppConfigXmlUrlParam", "ParameterValue": context_config_url }, { "ParameterKey": "ContextRootParam", "ParameterValue": app_context_root }, { "ParameterKey": "AppDnsNameParam", "ParameterValue": app_fqdn }, { "ParameterKey": "DomainNameHostedZoneNameParam", "ParameterValue": domain_name }, { "ParameterKey": "DbHostParam", "ParameterValue": rds_output_map["AppDbEndpointOutput"] }, { "ParameterKey": "DbUsernameParam", "ParameterValue": war_file_info["metadata"]["db-username"] }, { "ParameterKey": "DbPasswordParam", "ParameterValue": war_file_info["metadata"]["db-password"] }, { "ParameterKey": "DbNameParam", "ParameterValue": war_file_info["metadata"]["db-name"] }, { "ParameterKey": "JdbcSetupShParam", "ParameterValue": jdbc_replacer_url }] cfn_client.create_stack(StackName=(group_id + "-" + artifact_id + "-" + version).replace(".", "-"), TemplateURL=util.make_cfn_url("app/app.template"), Parameters=app_stack_parameters)
def deploy(event, context): print(json.dumps(event, indent=4, sort_keys=True, default=lambda x: str(x))) deployable_bucket_name = event["Records"][0]["s3"]["bucket"]["name"] deployable_key_name = event["Records"][0]["s3"]["object"]["key"] app_metadata = util.get_app_metadata(deployable_bucket_name, deployable_key_name) rds_version = app_metadata['Metadata']['db-version'] db_name = app_metadata['Metadata']['db-name'] db_username = app_metadata['Metadata']['db-username'] db_password = app_metadata['Metadata']['db-password'] all_db_instances = rds_client.describe_db_instances() found_db = False if len(all_db_instances['DBInstances']) > 0: for each_db_instance in all_db_instances['DBInstances']: all_tags = each_db_instance[ 'Tags'] if "Tags" in each_db_instance else {} if "tvarit_version" in all_tags and all_tags[ 'tvarit_version'] == rds_version: found_db = each_db_instance["Endpoint"] else: found_db = False sns_resources = util.make_base_output_map_from_cfn("SnsTopics") deploy_complete_topic = sns_resources["RdsDeployedSnsTopicOutput"] rds_already_deployed_sqs_q = sns_resources[ "RdsAlreadyDeployedSqsTopicOutput"] if not found_db: print("db not found!") rds_template = util.make_cfn_url("app/rds.template") group_id = app_metadata['Metadata']["group-id"] artifact_id = app_metadata['Metadata']["artifact-id"] version = app_metadata['Metadata']["version"] print("db to be created: group, artifact, version: " + group_id + " : " + artifact_id + " : " + version) network_resources = util.make_base_output_map_from_cfn("Network") print( json.dumps(network_resources, indent=4, sort_keys=True, default=lambda x: str(x))) db_subnet_group = network_resources["DbSubnetGroupOutput"] db_security_group = network_resources["DbSecurityGroupOutput"] rds_stack_parameters = [{ "ParameterKey": "DbSubnetGroupNameParam", "ParameterValue": db_subnet_group }, { "ParameterKey": "DbVersionParam", "ParameterValue": rds_version }, { "ParameterKey": "DbNameParam", "ParameterValue": db_name }, { "ParameterKey": "DbUsernameParam", "ParameterValue": db_username }, { "ParameterKey": "DbPasswordParam", "ParameterValue": db_password }, { "ParameterKey": "DbSecurityGroupParam", "ParameterValue": db_security_group }] print("printing rds_stack_parameters") print( json.dumps(rds_stack_parameters, indent=4, sort_keys=True, default=lambda x: str(x))) stack_name = ("rds" + group_id + "-" + artifact_id + "-" + version).replace(".", "-") cfn_client.create_stack(StackName=stack_name, TemplateURL=rds_template, Parameters=rds_stack_parameters, NotificationARNs=[deploy_complete_topic], Tags=[{ "Key": "app_file_object", "Value": deployable_bucket_name + "::" + deployable_key_name }]) else: print("found the version tag and it was same as rds version " + rds_version) sqs_client.send_message(QueueUrl=rds_already_deployed_sqs_q, MessageBody=json.dumps(found_db))