main.tf 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. locals {
  2. # Technically, we don't need these in ARN format, but it makes updates slightly clearer
  3. accounts = [ for a in var.account_list: "arn:${var.aws_partition}:iam::${a}:root" ]
  4. }
  5. resource "aws_s3_bucket" "bucket" {
  6. bucket = var.name
  7. acl = "private"
  8. versioning {
  9. enabled = false
  10. }
  11. tags = merge(var.standard_tags, var.tags)
  12. # FIXME: Does this keep a cross-account dependency?
  13. #logging {
  14. # target_bucket = "dps-s3-logs"
  15. # target_prefix = "aws_terraform_s3_state_access_logs/"
  16. #}
  17. lifecycle_rule {
  18. enabled = true
  19. prefix = ""
  20. abort_incomplete_multipart_upload_days = 7
  21. expiration {
  22. days = 0
  23. expired_object_delete_marker = false
  24. }
  25. }
  26. server_side_encryption_configuration {
  27. rule {
  28. apply_server_side_encryption_by_default {
  29. kms_master_key_id = aws_kms_key.bucketkey.arn
  30. sse_algorithm = "aws:kms"
  31. }
  32. }
  33. }
  34. }
  35. resource "aws_s3_bucket_public_access_block" "public_access_block" {
  36. bucket = aws_s3_bucket.bucket.id
  37. block_public_acls = true
  38. block_public_policy = true
  39. ignore_public_acls = true
  40. restrict_public_buckets = true
  41. }
  42. resource "aws_s3_bucket_policy" "policy" {
  43. bucket = aws_s3_bucket.bucket.id
  44. policy = <<POLICY
  45. {
  46. "Version": "2012-10-17",
  47. "Id": "AllowAllAccounts",
  48. "Statement": [
  49. {
  50. "Sid": "AccountAllow",
  51. "Effect": "Allow",
  52. "Principal": {
  53. "AWS": ${jsonencode(local.accounts)}
  54. },
  55. "Action": [
  56. "s3:GetObject",
  57. "s3:ListBucket"
  58. ],
  59. "Resource": [
  60. "${aws_s3_bucket.bucket.arn}",
  61. "${aws_s3_bucket.bucket.arn}/*"
  62. ]
  63. }
  64. ]
  65. }
  66. POLICY
  67. }