main.tf 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. locals {
  2. bucket_name = "xdr-github-enterprise-${var.environment}-github-actions"
  3. accounts = [var.aws_account_id]
  4. account_arns = [for a in local.accounts : "arn:${var.aws_partition}:iam::${a}:root"]
  5. }
  6. resource "aws_s3_bucket" "bucket" {
  7. bucket = local.bucket_name
  8. acl = "private"
  9. versioning {
  10. enabled = true
  11. }
  12. tags = merge(var.standard_tags, var.tags)
  13. lifecycle_rule {
  14. id = "STANDARD_IA"
  15. enabled = true
  16. abort_incomplete_multipart_upload_days = 2
  17. transition {
  18. days = 30
  19. storage_class = "STANDARD_IA"
  20. }
  21. }
  22. server_side_encryption_configuration {
  23. rule {
  24. apply_server_side_encryption_by_default {
  25. kms_master_key_id = aws_kms_key.bucketkey.arn
  26. sse_algorithm = "aws:kms"
  27. }
  28. }
  29. }
  30. }
  31. resource "aws_s3_bucket_public_access_block" "public_access_block" {
  32. bucket = aws_s3_bucket.bucket.id
  33. block_public_acls = true
  34. block_public_policy = true
  35. ignore_public_acls = true
  36. restrict_public_buckets = true
  37. # Not technically dependent, but prevents a "Conflicting conditional operation" conflict.
  38. # See https://github.com/hashicorp/terraform-provider-aws/issues/7628
  39. depends_on = [aws_s3_bucket_policy.policy]
  40. }
  41. resource "aws_s3_bucket_policy" "policy" {
  42. bucket = aws_s3_bucket.bucket.id
  43. policy = <<POLICY
  44. {
  45. "Version": "2012-10-17",
  46. "Id": "AllowThisAccount",
  47. "Statement": [
  48. {
  49. "Sid": "AccountAllow",
  50. "Effect": "Allow",
  51. "Principal": {
  52. "AWS": ${jsonencode(local.account_arns)}
  53. },
  54. "Action": [
  55. "s3:GetObject",
  56. "s3:ListBucket"
  57. ],
  58. "Resource": [
  59. "${aws_s3_bucket.bucket.arn}",
  60. "${aws_s3_bucket.bucket.arn}/*"
  61. ]
  62. }
  63. ]
  64. }
  65. POLICY
  66. }