# Kenisis firehose stream # Record Transformation Required, called "processing_configuration" in Terraform resource "aws_kinesis_firehose_delivery_stream" "kinesis_firehose" { name = var.firehose_name destination = "splunk" s3_configuration { role_arn = aws_iam_role.kinesis_firehose.arn prefix = var.s3_prefix bucket_arn = aws_s3_bucket.kinesis_firehose_s3_bucket.arn buffer_size = var.kinesis_firehose_buffer buffer_interval = var.kinesis_firehose_buffer_interval compression_format = var.s3_compression_format } splunk_configuration { hec_endpoint = var.hec_url hec_token = var.hec_token hec_acknowledgment_timeout = var.hec_acknowledgment_timeout hec_endpoint_type = var.hec_endpoint_type s3_backup_mode = var.s3_backup_mode processing_configuration { enabled = "true" processors { type = "Lambda" parameters { parameter_name = "LambdaArn" parameter_value = "${aws_lambda_function.firehose_lambda_transform.arn}:$LATEST" } parameters { parameter_name = "RoleArn" parameter_value = aws_iam_role.kinesis_firehose.arn } } } cloudwatch_logging_options { enabled = var.enable_fh_cloudwatch_logging log_group_name = aws_cloudwatch_log_group.kinesis_logs.name log_stream_name = aws_cloudwatch_log_stream.kinesis_logs.name } } tags = var.tags } # S3 Bucket for Kinesis Firehose s3_backup_mode resource "aws_s3_bucket" "kinesis_firehose_s3_bucket" { bucket = var.s3_bucket_name acl = "private" server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { sse_algorithm = "AES256" } } } lifecycle_rule { id = "expire-old-logs" enabled = true prefix = "" expiration { days = var.s3_expiration } noncurrent_version_expiration { days = var.s3_expiration } abort_incomplete_multipart_upload_days = 7 } tags = var.tags } resource "aws_s3_bucket_public_access_block" "kinesis_firehose_s3_bucket" { count = var.s3_bucket_block_public_access_enabled bucket = aws_s3_bucket.kinesis_firehose_s3_bucket.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } # Cloudwatch logging group for Kinesis Firehose resource "aws_cloudwatch_log_group" "kinesis_logs" { name = "/aws/kinesisfirehose/${var.firehose_name}" retention_in_days = var.cloudwatch_log_retention tags = var.tags } # Create the stream resource "aws_cloudwatch_log_stream" "kinesis_logs" { name = var.log_stream_name log_group_name = aws_cloudwatch_log_group.kinesis_logs.name } ## handle the sensitivity of the hec_token variable #data "aws_kms_secrets" "splunk_hec_token" { # secret { # name = "hec_token" # payload = var.hec_token # # context = var.encryption_context # } #} # Role for the transformation Lambda function attached to the kinesis stream resource "aws_iam_role" "kinesis_firehose_lambda" { name = var.kinesis_firehose_lambda_role_name path = "/lambda/" description = "Role for Lambda function to transformation CloudWatch logs into Splunk compatible format" force_detach_policies = true assume_role_policy = <