locals { aws_account_id = sensitive(data.aws_caller_identity.current.account_id) } # SQS resource "aws_sqs_queue" "es_queue_deadletter" { name = "es_queue_deadletter" delay_seconds = 90 max_message_size = 2048 message_retention_seconds = 86400 receive_wait_time_seconds = 10 kms_master_key_id = aws_kms_alias.aka.name } resource "aws_sqs_queue" "es_queue" { name = "es_queue" delay_seconds = 90 max_message_size = 2048 message_retention_seconds = 86400 receive_wait_time_seconds = 10 kms_master_key_id = aws_kms_alias.aka.name redrive_policy = jsonencode({ deadLetterTargetArn = aws_sqs_queue.es_queue_deadletter.arn maxReceiveCount = 4 }) tags = { Name = "SQS Queue for Elasticsearch" Environment = "Development" } } # S3 Bucket for Elasticsearch repository resource "aws_s3_bucket" "es_s3_repo" { bucket_prefix = var.repo_s3_bucket_prefix force_destroy = true tags = { Name = "Bucket for Elasticsearch snapshots" Environment = "Development" } } resource "aws_s3_bucket_logging" "es_s3_repo_logging" { bucket = aws_s3_bucket.es_s3_repo.id target_bucket = aws_s3_bucket.es_s3_logging.id target_prefix = "log/" } resource "aws_s3_bucket_versioning" "es_s3_repo_versioning" { bucket = aws_s3_bucket.es_s3_repo.id versioning_configuration { status = "Enabled" } } resource "aws_s3_bucket_server_side_encryption_configuration" "es_s3_repo_encryption" { bucket = aws_s3_bucket.es_s3_repo.id rule { apply_server_side_encryption_by_default { kms_master_key_id = aws_kms_key.akk.arn sse_algorithm = "aws:kms" } } } # S3 Policy for bucket for Elasticsearch snapshot resource "aws_s3_bucket_policy" "es_s3_repo" { bucket = aws_s3_bucket.es_s3_repo.id # Terraform expression's result to valid JSON syntax. policy = jsonencode({ Version = "2012-10-17" Id = "es_s3_repo_policy" Statement = [ { Effect = "Allow" Action = "s3:*" Principal = { "AWS" : "${local.aws_account_id}" } Resource = [ aws_s3_bucket.es_s3_repo.arn, "${aws_s3_bucket.es_s3_repo.arn}/*", ] }, ] }) } # S3 public access block for Elasticsearch snapshot resource "aws_s3_bucket_public_access_block" "es_s3_repo" { bucket = aws_s3_bucket.es_s3_repo.id block_public_acls = true block_public_policy = true restrict_public_buckets = true ignore_public_acls = true } # S3 Bucket for Elastic Agent resource "aws_s3_bucket" "es_s3_agent" { bucket_prefix = var.agent_s3_bucket_prefix force_destroy = true tags = { Name = "Bucket for Elastic Agent" Environment = "Development" } } resource "aws_s3_bucket_logging" "es_s3_agent_logging" { bucket = aws_s3_bucket.es_s3_agent.id target_bucket = aws_s3_bucket.es_s3_logging.id target_prefix = "log/" } resource "aws_s3_bucket_versioning" "es_s3_agent_versioning" { bucket = aws_s3_bucket.es_s3_agent.id versioning_configuration { status = "Enabled" } } resource "aws_s3_bucket_server_side_encryption_configuration" "es_s3_agent_encryption" { bucket = aws_s3_bucket.es_s3_agent.id rule { apply_server_side_encryption_by_default { kms_master_key_id = aws_kms_key.akk.arn sse_algorithm = "aws:kms" } } } # S3 Policy for bucket for Elastic Agent resource "aws_s3_bucket_policy" "es_s3_agent" { bucket = aws_s3_bucket.es_s3_agent.id # Terraform expression's result to valid JSON syntax. policy = jsonencode({ Version = "2012-10-17" Id = "es_s3_agent_policy" Statement = [ { Effect = "Allow" Action = "s3:*" Principal = { "AWS" : "${local.aws_account_id}" } Resource = [ aws_s3_bucket.es_s3_agent.arn, "${aws_s3_bucket.es_s3_agent.arn}/*", ] }, ] }) } # S3 public access block for Elastic Agent resource "aws_s3_bucket_public_access_block" "es_s3_agent" { bucket = aws_s3_bucket.es_s3_agent.id block_public_acls = true block_public_policy = true restrict_public_buckets = true ignore_public_acls = true } # S3 upload sar_config file to the bucket resource "aws_s3_object" "esf_sar_config" { bucket = aws_s3_bucket.es_s3_repo.id key = "config/sar_config.yaml" content = data.template_file.init_sar_config.rendered etag = md5(data.template_file.init_sar_config.rendered) depends_on = [aws_secretsmanager_secret.es_secrets] } data "template_file" "init_sar_config" { template = file("sar_config.yaml") vars = { sm-es-url = "${aws_secretsmanager_secret.es_secrets.arn}:es_url" sm-ec-user = "${aws_secretsmanager_secret.es_secrets.arn}:elasticsearch_username" sm-ec-pwd = "${aws_secretsmanager_secret.es_secrets.arn}:elasticsearch_password" } } # S3 for logging resource "aws_s3_bucket" "es_s3_logging" { bucket_prefix = var.log_s3_bucket_prefix } resource "aws_s3_bucket_acl" "es_s3_logging_acl" { bucket = aws_s3_bucket.es_s3_logging.id acl = "log-delivery-write" } resource "aws_s3_bucket_versioning" "es_s3_logging_versioning" { bucket = aws_s3_bucket.es_s3_logging.id versioning_configuration { status = "Enabled" } } resource "aws_s3_bucket_server_side_encryption_configuration" "es_s3_logging_encryption" { bucket = aws_s3_bucket.es_s3_logging.id rule { apply_server_side_encryption_by_default { kms_master_key_id = aws_kms_key.akk.arn sse_algorithm = "aws:kms" } } } resource "aws_s3_bucket_public_access_block" "es_s3_logging" { bucket = aws_s3_bucket.es_s3_logging.id block_public_acls = true block_public_policy = true restrict_public_buckets = true ignore_public_acls = true } # IAM Role resource "aws_iam_role" "es_role" { name_prefix = "es_deploy_role" assume_role_policy = <