Example #1
0
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))
Example #2
0
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
    )
Example #3
0
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)
Example #4
0
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))