main.tf 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. locals {
  2. # Convert accounts to arns. Technically, we don't need these in ARN format, but it makes updates slightly clearer
  3. # Include customer accounts based on a flag
  4. customer_accounts_included = var.customer_access ? local.customer_accounts : []
  5. customer_accounts_arn = [for a in local.customer_accounts_included : "arn:${var.aws_partition}:iam::${a}:root"]
  6. # Include XDR accounts
  7. xdr_accounts = [for a in local.account_list : "arn:${var.aws_partition}:iam::${a}:root"]
  8. # Include any statically added accounts
  9. extra_accounts = [for a in var.extra_accounts : "arn:${var.aws_partition}:iam::${a}:root"]
  10. # Final list:
  11. final_accounts = concat(local.customer_accounts_arn, local.xdr_accounts, local.extra_accounts)
  12. }
  13. resource "aws_s3_bucket" "bucket" {
  14. bucket = var.name
  15. tags = merge(local.standard_tags, var.tags)
  16. }
  17. resource "aws_s3_bucket_acl" "s3_acl_bucket" {
  18. bucket = aws_s3_bucket.bucket.id
  19. acl = "private"
  20. }
  21. resource "aws_s3_bucket_versioning" "s3_version_bucket" {
  22. bucket = aws_s3_bucket.bucket.id
  23. versioning_configuration {
  24. status = "Suspended"
  25. }
  26. }
  27. #FIXME: Does this keep a cross-account dependency?
  28. #resource "aws_s3_bucket_logging" "example" {
  29. #bucket = aws_s3_bucket.example.id
  30. # target_bucket = "dps-s3-logs"
  31. # target_prefix = "aws_terraform_s3_state_access_logs/"
  32. #}
  33. resource "aws_s3_bucket_lifecycle_configuration" "s3_lifecyle_bucket" {
  34. bucket = aws_s3_bucket.bucket.id
  35. rule {
  36. id = "CleanUp"
  37. status = "Enabled"
  38. abort_incomplete_multipart_upload {
  39. days_after_initiation = 7
  40. }
  41. filter {
  42. prefix = ""
  43. }
  44. expiration {
  45. days = 0
  46. expired_object_delete_marker = false
  47. }
  48. }
  49. }
  50. resource "aws_s3_bucket_server_side_encryption_configuration" "s3_sse_bucket" {
  51. bucket = aws_s3_bucket.bucket.id
  52. rule {
  53. apply_server_side_encryption_by_default {
  54. kms_master_key_id = var.encryption == "SSE-KMS" ? aws_kms_key.bucketkey[0].arn : null
  55. sse_algorithm = var.encryption == "SSE-KMS" ? "aws:kms" : "AES256"
  56. }
  57. }
  58. }
  59. /*resource "aws_s3_bucket" "bucket" {
  60. bucket = var.name
  61. acl = "private"
  62. versioning {
  63. enabled = false
  64. }
  65. tags = merge(local.standard_tags, var.tags)
  66. # FIXME: Does this keep a cross-account dependency?
  67. #logging {
  68. # target_bucket = "dps-s3-logs"
  69. # target_prefix = "aws_terraform_s3_state_access_logs/"
  70. #}
  71. lifecycle_rule {
  72. enabled = true
  73. prefix = ""
  74. abort_incomplete_multipart_upload_days = 7
  75. expiration {
  76. days = 0
  77. expired_object_delete_marker = false
  78. }
  79. }
  80. server_side_encryption_configuration {
  81. rule {
  82. apply_server_side_encryption_by_default {
  83. kms_master_key_id = var.encryption == "SSE-KMS" ? aws_kms_key.bucketkey[0].arn : null
  84. sse_algorithm = var.encryption == "SSE-KMS" ? "aws:kms" : "AES256"
  85. }
  86. }
  87. }
  88. }
  89. */
  90. resource "aws_s3_bucket_public_access_block" "public_access_block" {
  91. bucket = aws_s3_bucket.bucket.id
  92. block_public_acls = true
  93. block_public_policy = true
  94. ignore_public_acls = true
  95. restrict_public_buckets = true
  96. }
  97. data "aws_iam_policy_document" "s3" {
  98. statement {
  99. sid = "AccountAllow"
  100. effect = "Allow"
  101. resources = [
  102. "${aws_s3_bucket.bucket.arn}",
  103. "${aws_s3_bucket.bucket.arn}/*",
  104. ]
  105. actions = [
  106. "s3:GetObject",
  107. "s3:ListBucket",
  108. ]
  109. principals {
  110. type = "AWS"
  111. identifiers = local.final_accounts
  112. }
  113. }
  114. }
  115. resource "aws_s3_bucket_policy" "policy" {
  116. bucket = aws_s3_bucket.bucket.id
  117. policy = data.aws_iam_policy_document.s3.json
  118. }