provider "aws" {
  region = "us-east-1"
}

# Terraform backends cannot contain interpolations
terraform {
  backend "s3" {
    bucket  = "orcd-terraform-state"
    key     = "prod/infoblox/terraform.tfstate"
    region  = "us-east-1"
    encrypt = "true"
  }
}

resource "aws_iam_user" "infoblox_backup_user" {
  name = "infoblox_backup"
}

# This effectively creates an empty S3 folder.
resource "aws_s3_bucket_object" "infoblox_backup_folder" {
  bucket = var.s3_bucket
  acl    = "private"
  key    = "${var.s3_path}/"
  source = "/dev/null"
}

data "aws_iam_policy_document" "infoblox_backup_s3_policy_data" {
  statement {
    effect = "Allow"
    actions = [
      "s3:AbortMultipartUpload",
      "s3:GetBucketLocation",
      "s3:GetBucketVersioning",
      "s3:GetLifecycleConfiguration",
      "s3:GetObject",
      "s3:GetObjectAcl",
      "s3:GetObjectTorrent",
      "s3:GetObjectVersion",
      "s3:GetObjectVersionAcl",
      "s3:GetObjectVersionTorrent",
      "s3:GetReplicationConfiguration",
      "s3:ListBucket",
      "s3:ListBucketMultipartUploads",
      "s3:ListBucketVersions",
      "s3:ListMultipartUploadParts",
      "s3:PutObject",
      "s3:PutObjectAcl",
      "s3:PutObjectVersionAcl"
    ]
    resources = [
      "arn:aws:s3:::${var.s3_bucket}/${var.s3_path}",
      "arn:aws:s3:::${var.s3_bucket}/${var.s3_path}/*",
    ]
  }
  statement {
    effect = "Allow"
    actions = [
      "s3:GetBucketLocation",
      "s3:ListBucket"
    ]
    resources = [
      "arn:aws:s3:::${var.s3_bucket}"
    ]
  }
}

resource "aws_iam_policy" "infoblox_backup_s3_policy" {
  name   = "S3-${var.s3_bucket}-${var.s3_path}-RW"
  policy = data.aws_iam_policy_document.infoblox_backup_s3_policy_data.json
}

resource "aws_iam_user_policy_attachment" "infoblox_backup_s3_policy_attachment" {
  user       = aws_iam_user.infoblox_backup_user.name
  policy_arn = aws_iam_policy.infoblox_backup_s3_policy.arn
}

data "aws_iam_policy_document" "infoblox_kms_key_policy_document" {
  statement {
    effect = "Allow"
    principals {
      type        = "AWS"
      identifiers = ["${aws_iam_user.infoblox_backup_user.arn}"]
    }
    actions = [
      "kms:Encrypt",
      "kms:Decrypt",
      "kms:ReEncrypt*",
      "kms:GenerateDataKey*",
      "kms:DescribeKey"
    ]
    resources = [
      "*"
    ]
  }
  statement {
    effect = "Allow"
    principals {
      type        = "AWS"
      identifiers = var.infoblox_kms_key_admins
    }
    actions = [
      "kms:*"
    ]
    resources = [
      "*"
    ]
  }
  statement {
    effect = "Allow"
    principals {
      type        = "AWS"
      identifiers = ["arn:aws:iam::437795906767:role/nickelback-replication-role"]
    }
    actions = [
      "kms:Decrypt",
      "kms:GenerateDataKey*",
    ]
    resources = [
      "*"
    ]
  }
}

resource "aws_kms_key" "infoblox_kms_key" {
  description             = "infoblox_backup_key"
  deletion_window_in_days = 14
  policy                  = data.aws_iam_policy_document.infoblox_kms_key_policy_document.json

  tags = {
    terraformed = true
    Environment = "prod"
  }
}

resource "aws_kms_alias" "a" {
  name          = "alias/infoblox_backup_key"
  target_key_id = aws_kms_key.infoblox_kms_key.key_id
}
