main
tf 161 lines 3.66 KB
Raw
1 variable "bucket_name" {
2 type = string
3 }
4
5 resource "aws_s3_bucket" "cache" {
6 provider = aws
7 bucket = var.bucket_name
8 }
9
10 resource "aws_s3_bucket_lifecycle_configuration" "cache" {
11 provider = aws
12 bucket = aws_s3_bucket.cache.id
13
14 rule {
15 id = "Infrequent Access"
16 status = "Enabled"
17
18 filter {
19 prefix = ""
20 }
21
22 transition {
23 days = 365
24 storage_class = "STANDARD_IA"
25 }
26 }
27
28 # Reap multipart uploads (large NARs) that were never completed, e.g. when a
29 # build aborts mid-upload. Uploads normally finish within an hour.
30 rule {
31 id = "Abort incomplete multipart uploads"
32 status = "Enabled"
33
34 filter {}
35
36 abort_incomplete_multipart_upload {
37 days_after_initiation = 7
38 }
39 }
40 }
41
42 resource "aws_s3_bucket_cors_configuration" "cache" {
43 provider = aws
44 bucket = aws_s3_bucket.cache.bucket
45
46 cors_rule {
47 allowed_headers = ["Authorization"]
48 allowed_methods = ["GET"]
49 allowed_origins = ["*"]
50 max_age_seconds = 3000
51 }
52 }
53
54
55 resource "aws_s3_bucket_public_access_block" "cache" {
56 bucket = aws_s3_bucket.cache.bucket
57
58 block_public_acls = false
59 block_public_policy = false
60 }
61
62 resource "aws_s3_bucket_object" "cache-nix-cache-info" {
63 provider = aws
64 depends_on = [aws_s3_bucket_public_access_block.cache]
65
66 bucket = aws_s3_bucket.cache.bucket
67 content_type = "text/x-nix-cache-info"
68 etag = filemd5("${path.module}/../cache-staging/nix-cache-info")
69 key = "nix-cache-info"
70 source = "${path.module}/../cache-staging/nix-cache-info"
71 }
72
73 resource "aws_s3_bucket_object" "cache-index-html" {
74 provider = aws
75 depends_on = [aws_s3_bucket_public_access_block.cache]
76
77 bucket = aws_s3_bucket.cache.bucket
78 content_type = "text/html"
79 etag = filemd5("${path.module}/../cache-staging/index.html")
80 key = "index.html"
81 source = "${path.module}/../cache-staging/index.html"
82 }
83
84 resource "aws_s3_bucket_policy" "cache" {
85 provider = aws
86 bucket = aws_s3_bucket.cache.id
87 depends_on = [aws_s3_bucket_public_access_block.cache]
88
89 # imported from existing
90 policy = <<EOF
91 {
92 "Version": "2008-10-17",
93 "Statement": [
94 {
95 "Sid": "AllowPublicRead",
96 "Effect": "Allow",
97 "Principal": {
98 "AWS": "*"
99 },
100 "Action": "s3:GetObject",
101 "Resource": "arn:aws:s3:::${var.bucket_name}/*"
102 },
103 {
104 "Sid": "AllowUploadDebuginfoWrite",
105 "Effect": "Allow",
106 "Principal": {
107 "AWS": "arn:aws:iam::080433136561:user/s3-upload-releases"
108 },
109 "Action": [
110 "s3:PutObject",
111 "s3:PutObjectAcl"
112 ],
113 "Resource": "arn:aws:s3:::${var.bucket_name}/debuginfo/*"
114 },
115 {
116 "Sid": "AllowUploadDebuginfoRead",
117 "Effect": "Allow",
118 "Principal": {
119 "AWS": "arn:aws:iam::080433136561:user/s3-upload-releases"
120 },
121 "Action": "s3:GetObject",
122 "Resource": "arn:aws:s3:::${var.bucket_name}/*"
123 },
124 {
125 "Sid": "AllowUploadDebuginfoRead2",
126 "Effect": "Allow",
127 "Principal": {
128 "AWS": "arn:aws:iam::080433136561:user/s3-upload-releases"
129 },
130 "Action": [
131 "s3:ListBucket",
132 "s3:GetBucketLocation"
133 ],
134 "Resource": "arn:aws:s3:::${var.bucket_name}"
135 }
136 ]
137 }
138 EOF
139 }
140
141 resource "aws_s3_bucket_request_payment_configuration" "cache" {
142 provider = aws
143 bucket = aws_s3_bucket.cache.id
144 payer = "Requester"
145 }
146
147 output "bucket" {
148 value = aws_s3_bucket.cache.bucket
149 }
150
151 output "bucket_domain_name" {
152 value = aws_s3_bucket.cache.bucket_domain_name
153 }
154
155 output "bucket_regional_domain_name" {
156 value = aws_s3_bucket.cache.bucket_regional_domain_name
157 }
158
159 output "region" {
160 value = aws_s3_bucket.cache.region
161 }