Skip to content

Commit 87929bb

Browse files
committed
feat: add terraform s3 backend
1 parent 5d2f3d6 commit 87929bb

File tree

5 files changed

+113
-0
lines changed

5 files changed

+113
-0
lines changed

.tf-branch-deploy.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ production-environments:
66
environments:
77
dev:
88
working-directory: ./terraform/modules
9+
backend-configs:
10+
paths:
11+
- ./terraform/config/terraform_backend.conf
912
var-files:
1013
paths:
1114
- ./terraform/config/terraform_config.tfvars
15+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
bucket = "cirrus-tfstate-store"
2+
key = "global/s3/terraform.tfstate"
3+
region = "us-east-1"
4+
dynamodb_table = "terraform-running-locks"
5+
encrypt = true

terraform/config/terraform_config.tfvars

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
env = "dev"
2+
terraform_state_bucket_name = "cirrus-tfstate-store"
23
code_store_bucket = "code-utility-store-bucket"
34
cloudtrail_logs_bucket_name = "cloudtrail-logs-store-bucket"
45

terraform/modules/backend.tf

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
terraform {
2+
backend "s3" {
3+
}
4+
}
5+
6+
resource "aws_s3_bucket" "terraform_state" {
7+
bucket = var.terraform_state_bucket_name
8+
}
9+
10+
resource "aws_s3_bucket_policy" "terraform_state_policy" {
11+
bucket = aws_s3_bucket.terraform_state.id
12+
policy = jsonencode({
13+
Version = "2012-10-17",
14+
Id = "DenyInsecureConnections",
15+
Statement = [
16+
{
17+
Sid = "HTTPSOnly",
18+
Effect = "Deny",
19+
Principal = "*",
20+
Action = "s3:*",
21+
Resource = [
22+
aws_s3_bucket.terraform_state.arn,
23+
"${aws_s3_bucket.terraform_state.arn}/*"
24+
],
25+
Condition = {
26+
Bool = {
27+
"aws:SecureTransport" = "false"
28+
}
29+
}
30+
}
31+
]
32+
})
33+
}
34+
35+
resource "aws_s3_bucket_versioning" "terraform_state_versioning" {
36+
bucket = aws_s3_bucket.terraform_state.id
37+
versioning_configuration {
38+
status = "Enabled"
39+
}
40+
41+
}
42+
43+
resource "aws_s3_bucket_server_side_encryption_configuration" "terraform_state_encryption" {
44+
bucket = aws_s3_bucket.terraform_state.id
45+
rule {
46+
apply_server_side_encryption_by_default {
47+
sse_algorithm = "AES256"
48+
}
49+
}
50+
}
51+
52+
resource "aws_s3_bucket_lifecycle_configuration" "terraform_state_lifecycle" {
53+
depends_on = [aws_s3_bucket_versioning.terraform_state_versioning]
54+
55+
bucket = aws_s3_bucket.terraform_state.id
56+
57+
rule {
58+
id = "ExpireOldVersions"
59+
status = "Enabled"
60+
61+
noncurrent_version_expiration {
62+
noncurrent_days = 7
63+
}
64+
}
65+
}
66+
67+
resource "aws_s3_bucket_public_access_block" "terraform_state_public_access" {
68+
bucket = aws_s3_bucket.terraform_state.id
69+
70+
block_public_acls = true
71+
block_public_policy = true
72+
ignore_public_acls = true
73+
restrict_public_buckets = true
74+
}
75+
76+
resource "aws_dynamodb_table" "terraform_locks" {
77+
name = "terraform-running-locks"
78+
billing_mode = "PAY_PER_REQUEST"
79+
hash_key = "LockID"
80+
deletion_protection_enabled = true
81+
82+
attribute {
83+
name = "LockID"
84+
type = "S"
85+
}
86+
87+
point_in_time_recovery {
88+
enabled = true
89+
}
90+
91+
server_side_encryption {
92+
enabled = true
93+
}
94+
95+
tags = {
96+
Name = "TerraformLocks"
97+
}
98+
}

terraform/modules/variables.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ variable "env" {
33
type = string
44
}
55

6+
variable "terraform_state_bucket_name" {
7+
description = "S3 backend bucket name for Terraform state."
8+
type = string
9+
}
10+
611
variable "api_gateway_name" {
712
description = "The name of the API Gateway."
813
type = string

0 commit comments

Comments
 (0)