resource "aws_athena_workgroup" "primary" {
  name = "primary"

  configuration {
    engine_version {
      selected_engine_version = "Athena engine version 3"
    }
  }
}

resource "aws_athena_database" "access_logs_db" {
  name   = local.logs_athena_db
  bucket = module.s3_athena_output.bucket.id
}

resource "aws_glue_catalog_database" "access_logs_db" {
  name = replace(data.aws_s3_bucket.security_logs.id, "-", "_")

  create_table_default_permission {
    permissions = ["SELECT"]

    principal {
      data_lake_principal_identifier = "IAM_ALLOWED_PRINCIPALS"
    }
  }
}

resource "aws_glue_catalog_table" "uat_external_main_logs" {
  name          = lower("uat_apollo_external_main_logs")
  database_name = aws_athena_database.access_logs_db.name
  owner         = "hadoop"
  parameters = {
    "EXTERNAL"              = "TRUE"
    "transient_lastDdlTime" = "1675866423"
  }

  table_type = "EXTERNAL_TABLE"

  storage_descriptor {
    bucket_columns            = []
    compressed                = false
    input_format              = "org.apache.hadoop.mapred.TextInputFormat"
    location                  = "s3://${data.aws_s3_bucket.security_logs.bucket}/elb/uat-apollo-external-main/AWSLogs/${local.account_id}/elasticloadbalancing/${var.aws_region_id}"
    number_of_buckets         = -1
    output_format             = "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
    parameters                = {}
    stored_as_sub_directories = false

    columns {
      name       = "type"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "time"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "elb"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "client_ip"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "client_port"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "target_ip"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_port"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "request_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "target_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "response_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "elb_status_code"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "target_status_code"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "received_bytes"
      parameters = {}
      type       = "bigint"
    }
    columns {
      name       = "sent_bytes"
      parameters = {}
      type       = "bigint"
    }
    columns {
      name       = "request_verb"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_url"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_proto"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "user_agent"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "ssl_cipher"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "ssl_protocol"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_group_arn"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "trace_id"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "domain_name"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "chosen_cert_arn"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "matched_rule_priority"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_creation_time"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "actions_executed"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "redirect_url"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "lambda_error_reason"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_port_list"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_status_code_list"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "classification"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "classification_reason"
      parameters = {}
      type       = "string"
    }

    ser_de_info {
      parameters = {
        "input.regex"          = "([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^s]+?)\" \"([^s]+)\" \"([^ ]*)\" \"([^ ]*)\""
        "serialization.format" = "1"
      }
      serialization_library = "org.apache.hadoop.hive.serde2.RegexSerDe"
    }
  }
}

resource "aws_glue_catalog_table" "uat_internal_main_logs" {
  name          = lower("uat_apollo_internal_main_logs")
  database_name = aws_athena_database.access_logs_db.name
  owner         = "hadoop"
  parameters = {
    "EXTERNAL"              = "TRUE"
    "transient_lastDdlTime" = "1675866423"
  }

  table_type = "EXTERNAL_TABLE"

  storage_descriptor {
    bucket_columns            = []
    compressed                = false
    input_format              = "org.apache.hadoop.mapred.TextInputFormat"
    location                  = "s3://${data.aws_s3_bucket.security_logs.bucket}/elb/uat-apollo-internal-main/AWSLogs/${local.account_id}/elasticloadbalancing/${var.aws_region_id}"
    number_of_buckets         = -1
    output_format             = "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
    parameters                = {}
    stored_as_sub_directories = false

    columns {
      name       = "type"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "time"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "elb"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "client_ip"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "client_port"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "target_ip"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_port"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "request_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "target_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "response_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "elb_status_code"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "target_status_code"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "received_bytes"
      parameters = {}
      type       = "bigint"
    }
    columns {
      name       = "sent_bytes"
      parameters = {}
      type       = "bigint"
    }
    columns {
      name       = "request_verb"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_url"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_proto"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "user_agent"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "ssl_cipher"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "ssl_protocol"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_group_arn"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "trace_id"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "domain_name"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "chosen_cert_arn"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "matched_rule_priority"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_creation_time"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "actions_executed"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "redirect_url"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "lambda_error_reason"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_port_list"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_status_code_list"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "classification"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "classification_reason"
      parameters = {}
      type       = "string"
    }

    ser_de_info {
      parameters = {
        "input.regex"          = "([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^s]+?)\" \"([^s]+)\" \"([^ ]*)\" \"([^ ]*)\""
        "serialization.format" = "1"
      }
      serialization_library = "org.apache.hadoop.hive.serde2.RegexSerDe"
    }
  }
}

resource "aws_glue_catalog_table" "prod_external_main_logs" {
  name          = lower("prod_apollo_external_main_logs")
  database_name = aws_athena_database.access_logs_db.name
  owner         = "hadoop"
  parameters = {
    "EXTERNAL"              = "TRUE"
    "transient_lastDdlTime" = "1675866423"
  }

  table_type = "EXTERNAL_TABLE"

  storage_descriptor {
    bucket_columns            = []
    compressed                = false
    input_format              = "org.apache.hadoop.mapred.TextInputFormat"
    location                  = "s3://${data.aws_s3_bucket.security_logs.bucket}/elb/prod-apollo-external-main/AWSLogs/${local.account_id}/elasticloadbalancing/${var.aws_region_id}"
    number_of_buckets         = -1
    output_format             = "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
    parameters                = {}
    stored_as_sub_directories = false

    columns {
      name       = "type"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "time"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "elb"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "client_ip"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "client_port"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "target_ip"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_port"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "request_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "target_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "response_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "elb_status_code"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "target_status_code"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "received_bytes"
      parameters = {}
      type       = "bigint"
    }
    columns {
      name       = "sent_bytes"
      parameters = {}
      type       = "bigint"
    }
    columns {
      name       = "request_verb"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_url"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_proto"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "user_agent"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "ssl_cipher"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "ssl_protocol"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_group_arn"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "trace_id"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "domain_name"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "chosen_cert_arn"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "matched_rule_priority"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_creation_time"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "actions_executed"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "redirect_url"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "lambda_error_reason"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_port_list"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_status_code_list"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "classification"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "classification_reason"
      parameters = {}
      type       = "string"
    }

    ser_de_info {
      parameters = {
        "input.regex"          = "([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^s]+?)\" \"([^s]+)\" \"([^ ]*)\" \"([^ ]*)\""
        "serialization.format" = "1"
      }
      serialization_library = "org.apache.hadoop.hive.serde2.RegexSerDe"
    }
  }
}

resource "aws_glue_catalog_table" "prod_internal_main_logs" {
  name          = lower("prod_apollo_internal_main_logs")
  database_name = aws_athena_database.access_logs_db.name
  owner         = "hadoop"
  parameters = {
    "EXTERNAL"              = "TRUE"
    "transient_lastDdlTime" = "1675866423"
  }

  table_type = "EXTERNAL_TABLE"

  storage_descriptor {
    bucket_columns            = []
    compressed                = false
    input_format              = "org.apache.hadoop.mapred.TextInputFormat"
    location                  = "s3://${data.aws_s3_bucket.security_logs.bucket}/elb/prod-apollo-internal-main/AWSLogs/${local.account_id}/elasticloadbalancing/${var.aws_region_id}"
    number_of_buckets         = -1
    output_format             = "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
    parameters                = {}
    stored_as_sub_directories = false

    columns {
      name       = "type"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "time"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "elb"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "client_ip"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "client_port"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "target_ip"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_port"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "request_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "target_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "response_processing_time"
      parameters = {}
      type       = "double"
    }
    columns {
      name       = "elb_status_code"
      parameters = {}
      type       = "int"
    }
    columns {
      name       = "target_status_code"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "received_bytes"
      parameters = {}
      type       = "bigint"
    }
    columns {
      name       = "sent_bytes"
      parameters = {}
      type       = "bigint"
    }
    columns {
      name       = "request_verb"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_url"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_proto"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "user_agent"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "ssl_cipher"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "ssl_protocol"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_group_arn"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "trace_id"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "domain_name"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "chosen_cert_arn"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "matched_rule_priority"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "request_creation_time"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "actions_executed"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "redirect_url"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "lambda_error_reason"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_port_list"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "target_status_code_list"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "classification"
      parameters = {}
      type       = "string"
    }
    columns {
      name       = "classification_reason"
      parameters = {}
      type       = "string"
    }

    ser_de_info {
      parameters = {
        "input.regex"          = "([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^s]+?)\" \"([^s]+)\" \"([^ ]*)\" \"([^ ]*)\""
        "serialization.format" = "1"
      }
      serialization_library = "org.apache.hadoop.hive.serde2.RegexSerDe"
    }
  }
}
