# 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 #Certificate CRLs need to be publicly accessible # tfsec:ignore:aws-s3-enable-versioning tfsec:ignore:aws-s3-no-public-buckets tfsec:ignore:aws-s3-enable-bucket-logging tfsec:ignore:aws-s3-block-public-acls resource "aws_s3_bucket" "kinesis_firehose_s3_bucket" { # tfsec:ignore:aws-s3-block-public-policy tfsec:ignore:aws-s3-ignore-public-acls tfsec:ignore:aws-s3-specify-public-access-block # checkov:skip=CKV_AWS_18: see tfsec ignore - logging not enabled # checkov:skip=CKV_AWS_21: see tfsec ignore - S3 object versioning is disabled # checkov:skip=CKV_AWS_144: S3 bucket has no cross-region replication enabled bucket = var.s3_bucket_name tags = var.tags } resource "aws_s3_bucket_acl" "kinesis_firehose_s3_bucket" { bucket = aws_s3_bucket.kinesis_firehose_s3_bucket.id acl = "private" } resource "aws_kms_key" "kinesis_firehose_s3_bucket" { enable_key_rotation = true deletion_window_in_days = 30 tags = var.tags } resource "aws_s3_bucket_server_side_encryption_configuration" "kinesis_firehose_s3_bucket" { bucket = aws_s3_bucket.kinesis_firehose_s3_bucket.id rule { apply_server_side_encryption_by_default { kms_master_key_id = aws_kms_key.kinesis_firehose_s3_bucket.arn sse_algorithm = "aws:kms" } } } resource "aws_s3_bucket_lifecycle_configuration" "kinesis_firehose_s3_bucket" { bucket = aws_s3_bucket.kinesis_firehose_s3_bucket.id rule { id = "expire-old-logs" status = "Enabled" filter { prefix = "" } expiration { days = var.s3_expiration } noncurrent_version_expiration { noncurrent_days = var.s3_expiration } abort_incomplete_multipart_upload { days_after_initiation = 7 } } } 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 # tfsec:ignore:aws-cloudwatch-log-group-customer-key # OK to use AWS key for this 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 = <