main.tf 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. data "aws_caller_identity" "current" {
  2. }
  3. data "aws_partition" "current" {
  4. }
  5. locals {
  6. account_id = data.aws_caller_identity.current.account_id
  7. partition = data.aws_partition.current.partition
  8. # Need a list to work with for_each, but don't actually want to for_each
  9. log_s3 = length(var.s3_object_level_buckets) > 0 ? [ true ] : [ ]
  10. log_lambda = length(var.lambda_functions) > 0 ? [ true ] : [ ]
  11. }
  12. resource "aws_cloudtrail" "trail" {
  13. cloud_watch_logs_role_arn = aws_iam_role.cloudtrail_cloudwatch_events_role.arn
  14. cloud_watch_logs_group_arn = aws_cloudwatch_log_group.cwl_loggroup.arn
  15. enable_log_file_validation = "true"
  16. enable_logging = "true"
  17. is_multi_region_trail = "true"
  18. kms_key_id = var.kms_key_id
  19. name = var.cloudtrail_name
  20. s3_bucket_name = var.cloudtrail_bucket
  21. # S3 object logging:
  22. event_selector{
  23. read_write_type = "All"
  24. include_management_events = true
  25. dynamic "data_resource" {
  26. for_each = local.log_s3
  27. content {
  28. type = "AWS::S3::Object"
  29. values = var.s3_object_level_buckets
  30. }
  31. }
  32. dynamic "data_resource" {
  33. for_each = local.log_lambda
  34. content {
  35. type = "AWS::Lambda::Function"
  36. values = var.lambda_functions
  37. }
  38. }
  39. }
  40. }
  41. resource "aws_iam_role" "cloudtrail_cloudwatch_events_role" {
  42. name_prefix = "cloudtrail_events_role"
  43. path = var.iam_path
  44. assume_role_policy = data.aws_iam_policy_document.cwl_assume_policy.json
  45. }
  46. resource "aws_iam_role_policy" "cwl_policy" {
  47. name_prefix = "cloudtrail_cloudwatch_events_policy"
  48. role = aws_iam_role.cloudtrail_cloudwatch_events_role.id
  49. policy = data.aws_iam_policy_document.cwl_policy.json
  50. }
  51. data "aws_iam_policy_document" "cwl_assume_policy" {
  52. statement {
  53. effect = "Allow"
  54. actions = ["sts:AssumeRole"]
  55. principals {
  56. type = "Service"
  57. identifiers = ["cloudtrail.amazonaws.com"]
  58. }
  59. }
  60. }
  61. data "aws_iam_policy_document" "cwl_policy" {
  62. statement {
  63. effect = "Allow"
  64. actions = ["logs:CreateLogStream"]
  65. resources = [
  66. "arn:${local.partition}:logs:${var.region}:${local.account_id}:log-group:${aws_cloudwatch_log_group.cwl_loggroup.name}:log-stream:*",
  67. ]
  68. }
  69. statement {
  70. effect = "Allow"
  71. actions = ["logs:PutLogEvents"]
  72. resources = [
  73. "arn:${local.partition}:logs:${var.region}:${local.account_id}:log-group:${aws_cloudwatch_log_group.cwl_loggroup.name}:log-stream:*",
  74. ]
  75. }
  76. }
  77. resource "aws_cloudwatch_log_group" "cwl_loggroup" {
  78. name = var.log_group_name
  79. kms_key_id = var.kms_key_id
  80. retention_in_days = var.retention_in_days == -1 ? null : var.retention_in_days
  81. }
  82. resource "aws_cloudwatch_log_stream" "cwl_stream" {
  83. name = local.account_id
  84. log_group_name = aws_cloudwatch_log_group.cwl_loggroup.name
  85. }