Skip to content

Commit dd68cbd

Browse files
committed
ci: Bundle OpenTofu setup actions.
1 parent d84d79e commit dd68cbd

File tree

9 files changed

+81
-113
lines changed

9 files changed

+81
-113
lines changed

.github/actions/setup-opentofu/action.yaml

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,16 @@ runs:
1717
run: tofu version
1818
- name: Set optional variables
1919
shell: bash
20-
env:
21-
# For any of these that have a value, the corresponding TF_VAR_*
22-
# environment variable will be set.
23-
APPLY_DATABASE_UPDATES_IMMEDIATELY: ${{ env.TF_VAR_APPLY_DATABASE_UPDATES_IMMEDIATELY }}
24-
TF_VAR_CONSUMER_CONTAINER_COUNT: ${{ env.TF_VAR_CONSUMER_CONTAINER_COUNT }}
25-
CONSUMER_CPU: ${{ env.TF_VAR_CONSUMER_CPU }}
26-
CONSUMER_MEMORY: ${{ env.TF_VAR_CONSUMER_MEMORY }}
27-
DATABASE_SKIP_FINAL_SNAPSHOT: ${{ env.TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT }}
28-
DELETION_PROTECTION: ${{ env.TF_VAR_DELETION_PROTECTION }}
29-
DEPLOYMENT_ENVIRONMENTS: ${{ env.TF_VAR_DEPLOYMENT_ENVIRONMENTS }}
30-
ENVIRONMENT: ${{ env.TF_VAR_ENVIRONMENT }}
31-
EXPORT_EXPIRATION: ${{ env.TF_VAR_EXPORT_EXPIRATION }}
32-
IMAGE_TAGS_MUTABLE: ${{ env.TF_VAR_IMAGE_TAGS_MUTABLE }}
33-
KEY_RECOVERY_PERIOD: ${{ env.TF_VAR_KEY_RECOVERY_PERIOD }}
34-
PROGRAM: ${{ env.TF_VAR_PROGRAM }}
35-
PROJECT: ${{ env.TF_VAR_PROJECT }}
36-
REPOSITORY: ${{ env.TF_VAR_REPOSITORY }}
3720
run: |
3821
variables=(
3922
"apply_database_updates_immediately" "consumer_container_count"
40-
"consumer_cpu" "consumer_memory" "database_skip_final_snapshot"
41-
"deletion_protection" "deployment_environments" "environment"
42-
"export_expiration" "image_tags_mutable" "key_recovery_period"
43-
"program" "project" "repository"
23+
"consumer_cpu" "consumer_memory" "database_instance_count"
24+
"database_skip_final_snapshot" "deletion_protection"
25+
"deployment_environments" "environment" "export_expiration"
26+
"image_tags_mutable" "key_recovery_period" "program" "project" "repository"
4427
)
4528
for var in ${variables[@]}; do
46-
name="$(echo $var | tr '[:lower:]' '[:upper:]')"
29+
name="TF_VAR_$(echo $var | tr '[:lower:]' '[:upper:]')"
4730
if [ -n "${!name}" ]; then
4831
echo "Setting TF_VAR_$var"
4932
echo "TF_VAR_$var=${!name}" >> $GITHUB_ENV

.github/workflows/deploy.yaml

Lines changed: 24 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -80,55 +80,35 @@ jobs:
8080
aws-region: ${{ secrets.AWS_REGION || 'us-west-1' }}
8181
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
8282
role-session-name: GitHub_to_AWS_via_FederatedOIDC
83-
- name: Setup OpenTofu
84-
uses: opentofu/setup-opentofu@v1
85-
with:
86-
tofu_wrapper: false
87-
- name: Display OpenTofu version
88-
run: tofu version
89-
- name: Set optional variables
90-
env:
91-
# For any of these that have a value, the corresponding TF_VAR_*
92-
# environment variable will be set.
93-
APPLY_DATABASE_UPDATES_IMMEDIATELY: ${{ secrets.TF_VAR_APPLY_DATABASE_UPDATES_IMMEDIATELY }}
94-
TF_VAR_CONSUMER_CONTAINER_COUNT: ${{ secrets.TF_VAR_CONSUMER_CONTAINER_COUNT }}
95-
CONSUMER_CPU: ${{ secrets.TF_VAR_CONSUMER_CPU }}
96-
CONSUMER_MEMORY: ${{ secrets.TF_VAR_CONSUMER_MEMORY }}
97-
DATABASE_SKIP_FINAL_SNAPSHOT: ${{ secrets.TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT }}
98-
DELETION_PROTECTION: ${{ secrets.TF_VAR_DELETION_PROTECTION }}
99-
DEPLOYMENT_ENVIRONMENTS: ${{ secrets.TF_VAR_DEPLOYMENT_ENVIRONMENTS }}
100-
ENVIRONMENT: ${{ secrets.TF_VAR_ENVIRONMENT }}
101-
EXPORT_EXPIRATION: ${{ secrets.TF_VAR_EXPORT_EXPIRATION }}
102-
IMAGE_TAGS_MUTABLE: ${{ secrets.TF_VAR_IMAGE_TAGS_MUTABLE }}
103-
KEY_RECOVERY_PERIOD: ${{ secrets.TF_VAR_KEY_RECOVERY_PERIOD }}
104-
PROGRAM: ${{ secrets.TF_VAR_PROGRAM }}
105-
PROJECT: ${{ secrets.TF_VAR_PROJECT }}
106-
REPOSITORY: ${{ secrets.TF_VAR_REPOSITORY }}
107-
run: |
108-
variables=(
109-
"apply_database_updates_immediately" "consumer_container_count"
110-
"consumer_cpu" "consumer_memory" "database_skip_final_snapshot"
111-
"deletion_protection" "deployment_environments" "environment"
112-
"export_expiration" "image_tags_mutable" "key_recovery_period"
113-
"program" "project" "repository"
114-
)
115-
for var in ${variables[@]}; do
116-
name="$(echo $var | tr '[:lower:]' '[:upper:]')"
117-
if [ -n "${!name}" ]; then
118-
echo "Setting TF_VAR_$var"
119-
echo "TF_VAR_$var=${!name}" >> $GITHUB_ENV
120-
else
121-
echo "$name is not set"
122-
fi
123-
done
12483
- name: Download plan file
12584
uses: actions/download-artifact@v4
12685
with:
12786
name: ${{ inputs.config }}-tfplan
12887
path: ./tofu/config/${{ inputs.config }}
129-
- name: Initialize OpenTofu
130-
working-directory: ./tofu/config/${{ inputs.config }}
131-
run: tofu init
88+
- name: Setup OpenTofu
89+
uses: ./.github/actions/setup-opentofu
90+
env:
91+
TF_VAR_APPLY_DATABASE_UPDATES_IMMEDIATELY: ${{ secrets.TF_VAR_APPLY_DATABASE_UPDATES_IMMEDIATELY }}
92+
TF_VAR_CONSUMER_CONTAINER_COUNT: ${{ secrets.TF_VAR_CONSUMER_CONTAINER_COUNT }}
93+
TF_VAR_CONSUMER_CPU: ${{ secrets.TF_VAR_CONSUMER_CPU }}
94+
TF_VAR_CONSUMER_MEMORY: ${{ secrets.TF_VAR_CONSUMER_MEMORY }}
95+
TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT: ${{ secrets.TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT }}
96+
TF_VAR_DATABASE_INSTANCE_COUNT: ${{ secrets.TF_VAR_DATABASE_INSTANCE_COUNT }}
97+
TF_VAR_DELETION_PROTECTION: ${{ secrets.TF_VAR_DELETION_PROTECTION }}
98+
TF_VAR_DEPLOYMENT_ENVIRONMENTS: ${{ secrets.TF_VAR_DEPLOYMENT_ENVIRONMENTS }}
99+
TF_VAR_ENVIRONMENT: ${{ inputs.environment }}
100+
TF_VAR_EXPORT_EXPIRATION: ${{ secrets.TF_VAR_EXPORT_EXPIRATION }}
101+
TF_VAR_IMAGE_TAGS_MUTABLE: ${{ secrets.TF_VAR_IMAGE_TAGS_MUTABLE }}
102+
TF_VAR_KEY_RECOVERY_PERIOD: ${{ secrets.TF_VAR_KEY_RECOVERY_PERIOD }}
103+
TF_VAR_PROJECT: ${{ secrets.TF_VAR_PROJECT }}
104+
TF_VAR_PROGRAM: ${{ secrets.TF_VAR_PROGRAM }}
105+
TF_VAR_REPO_OIDC_ARN: ${{ secrets.TF_VAR_REPO_OIDC_ARN }}
106+
TF_VAR_REPOSITORY: ${{ secrets.TF_VAR_REPOSITORY }}
107+
TF_VAR_VPC_CIDR: ${{ secrets.TF_VAR_VPC_CIDR }}
108+
TF_VAR_VPC_PRIVATE_SUBNET_CIDRS: ${{ secrets.TF_VAR_VPC_PRIVATE_SUBNET_CIDRS }}
109+
TF_VAR_VPC_PUBLIC_SUBNET_CIDRS: ${{ secrets.TF_VAR_VPC_PUBLIC_SUBNET_CIDRS }}
110+
with:
111+
config: ${{ inputs.config }}
132112
- name: Deploy changes
133113
working-directory: ./tofu/config/${{ inputs.config }}
134114
run: tofu apply tfplan

.github/workflows/launch-tools.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,18 @@ jobs:
8888
uses: ./.github/actions/setup-opentofu
8989
env:
9090
TF_VAR_APPLY_DATABASE_UPDATES_IMMEDIATELY: ${{ secrets.TF_VAR_APPLY_DATABASE_UPDATES_IMMEDIATELY }}
91-
TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT: ${{ secrets.TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT }}
9291
TF_VAR_CONSUMER_CONTAINER_COUNT: ${{ secrets.TF_VAR_CONSUMER_CONTAINER_COUNT }}
9392
TF_VAR_CONSUMER_CPU: ${{ secrets.TF_VAR_CONSUMER_CPU }}
9493
TF_VAR_CONSUMER_MEMORY: ${{ secrets.TF_VAR_CONSUMER_MEMORY }}
94+
TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT: ${{ secrets.TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT }}
95+
TF_VAR_DATABASE_INSTANCE_COUNT: ${{ secrets.TF_VAR_DATABASE_INSTANCE_COUNT }}
9596
TF_VAR_DELETION_PROTECTION: ${{ secrets.TF_VAR_DELETION_PROTECTION }}
9697
TF_VAR_DEPLOYMENT_ENVIRONMENTS: ${{ secrets.TF_VAR_DEPLOYMENT_ENVIRONMENTS }}
98+
TF_VAR_ENVIRONMENT: ${{ inputs.environment }}
9799
TF_VAR_EXPORT_EXPIRATION: ${{ secrets.TF_VAR_EXPORT_EXPIRATION }}
98100
TF_VAR_IMAGE_TAGS_MUTABLE: ${{ secrets.TF_VAR_IMAGE_TAGS_MUTABLE }}
99101
TF_VAR_KEY_RECOVERY_PERIOD: ${{ secrets.TF_VAR_KEY_RECOVERY_PERIOD }}
102+
TF_VAR_PROJECT: ${{ secrets.TF_VAR_PROJECT }}
100103
TF_VAR_PROGRAM: ${{ secrets.TF_VAR_PROGRAM }}
101104
TF_VAR_REPO_OIDC_ARN: ${{ secrets.TF_VAR_REPO_OIDC_ARN }}
102105
TF_VAR_REPOSITORY: ${{ secrets.TF_VAR_REPOSITORY }}
@@ -131,8 +134,6 @@ jobs:
131134
echo "command<<EOF" >> $GITHUB_OUTPUT
132135
echo "$COMMAND_STRING" >> $GITHUB_OUTPUT
133136
echo "EOF" >> $GITHUB_OUTPUT
134-
# - name: Show outputs
135-
# run: echo "${{ steps.command.outputs.command }}"
136137
- name: Launch container
137138
id: run-task
138139
uses: geekcell/github-action-aws-ecs-run-task@v5

.github/workflows/plan.yaml

Lines changed: 25 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ on:
6868
default: development
6969
required: true
7070
type: environment
71+
image_tag:
72+
description: (Optional) Image tag to use for the OpenTofu containers. Defaults to latest SHA.
73+
required: false
74+
type: string
7175

7276
permissions:
7377
contents: read
@@ -95,49 +99,29 @@ jobs:
9599
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
96100
role-session-name: GitHub_to_AWS_via_FederatedOIDC
97101
- name: Setup OpenTofu
98-
uses: opentofu/setup-opentofu@v1
99-
with:
100-
tofu_wrapper: false
101-
- name: Display OpenTofu version
102-
run: tofu version
103-
- name: Set optional variables
102+
uses: ./.github/actions/setup-opentofu
104103
env:
105-
# For any of these that have a value, the corresponding TF_VAR_*
106-
# environment variable will be set.
107-
APPLY_DATABASE_UPDATES_IMMEDIATELY: ${{ secrets.TF_VAR_APPLY_DATABASE_UPDATES_IMMEDIATELY }}
104+
TF_VAR_APPLY_DATABASE_UPDATES_IMMEDIATELY: ${{ secrets.TF_VAR_APPLY_DATABASE_UPDATES_IMMEDIATELY }}
108105
TF_VAR_CONSUMER_CONTAINER_COUNT: ${{ secrets.TF_VAR_CONSUMER_CONTAINER_COUNT }}
109-
CONSUMER_CPU: ${{ secrets.TF_VAR_CONSUMER_CPU }}
110-
CONSUMER_MEMORY: ${{ secrets.TF_VAR_CONSUMER_MEMORY }}
111-
DATABASE_SKIP_FINAL_SNAPSHOT: ${{ secrets.TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT }}
112-
DELETION_PROTECTION: ${{ secrets.TF_VAR_DELETION_PROTECTION }}
113-
DEPLOYMENT_ENVIRONMENTS: ${{ secrets.TF_VAR_DEPLOYMENT_ENVIRONMENTS }}
114-
ENVIRONMENT: ${{ secrets.TF_VAR_ENVIRONMENT }}
115-
EXPORT_EXPIRATION: ${{ secrets.TF_VAR_EXPORT_EXPIRATION }}
116-
IMAGE_TAGS_MUTABLE: ${{ secrets.TF_VAR_IMAGE_TAGS_MUTABLE }}
117-
KEY_RECOVERY_PERIOD: ${{ secrets.TF_VAR_KEY_RECOVERY_PERIOD }}
118-
PROGRAM: ${{ secrets.TF_VAR_PROGRAM }}
119-
PROJECT: ${{ secrets.TF_VAR_PROJECT }}
120-
REPOSITORY: ${{ secrets.TF_VAR_REPOSITORY }}
121-
run: |
122-
variables=(
123-
"apply_database_updates_immediately" "consumer_container_count"
124-
"consumer_cpu" "consumer_memory" "database_skip_final_snapshot"
125-
"deletion_protection" "deployment_environments" "environment"
126-
"export_expiration" "image_tags_mutable" "key_recovery_period"
127-
"program" "project" "repository"
128-
)
129-
for var in ${variables[@]}; do
130-
name="$(echo $var | tr '[:lower:]' '[:upper:]')"
131-
if [ -n "${!name}" ]; then
132-
echo "Setting TF_VAR_$var"
133-
echo "TF_VAR_$var=${!name}" >> $GITHUB_ENV
134-
else
135-
echo "$name is not set"
136-
fi
137-
done
138-
- name: Initialize OpenTofu
139-
working-directory: ./tofu/config/${{ inputs.config }}
140-
run: tofu init
106+
TF_VAR_CONSUMER_CPU: ${{ secrets.TF_VAR_CONSUMER_CPU }}
107+
TF_VAR_CONSUMER_MEMORY: ${{ secrets.TF_VAR_CONSUMER_MEMORY }}
108+
TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT: ${{ secrets.TF_VAR_DATABASE_SKIP_FINAL_SNAPSHOT }}
109+
TF_VAR_DATABASE_INSTANCE_COUNT: ${{ secrets.TF_VAR_DATABASE_INSTANCE_COUNT }}
110+
TF_VAR_DELETION_PROTECTION: ${{ secrets.TF_VAR_DELETION_PROTECTION }}
111+
TF_VAR_DEPLOYMENT_ENVIRONMENTS: ${{ secrets.TF_VAR_DEPLOYMENT_ENVIRONMENTS }}
112+
TF_VAR_ENVIRONMENT: ${{ inputs.environment }}
113+
TF_VAR_EXPORT_EXPIRATION: ${{ secrets.TF_VAR_EXPORT_EXPIRATION }}
114+
TF_VAR_IMAGE_TAGS_MUTABLE: ${{ secrets.TF_VAR_IMAGE_TAGS_MUTABLE }}
115+
TF_VAR_KEY_RECOVERY_PERIOD: ${{ secrets.TF_VAR_KEY_RECOVERY_PERIOD }}
116+
TF_VAR_PROJECT: ${{ secrets.TF_VAR_PROJECT }}
117+
TF_VAR_PROGRAM: ${{ secrets.TF_VAR_PROGRAM }}
118+
TF_VAR_REPO_OIDC_ARN: ${{ secrets.TF_VAR_REPO_OIDC_ARN }}
119+
TF_VAR_REPOSITORY: ${{ secrets.TF_VAR_REPOSITORY }}
120+
TF_VAR_VPC_CIDR: ${{ secrets.TF_VAR_VPC_CIDR }}
121+
TF_VAR_VPC_PRIVATE_SUBNET_CIDRS: ${{ secrets.TF_VAR_VPC_PRIVATE_SUBNET_CIDRS }}
122+
TF_VAR_VPC_PUBLIC_SUBNET_CIDRS: ${{ secrets.TF_VAR_VPC_PUBLIC_SUBNET_CIDRS }}
123+
with:
124+
config: ${{ inputs.config }}
141125
- name: Plan changes
142126
working-directory: ./tofu/config/${{ inputs.config }}
143127
run: tofu plan -concise -no-color -out tfplan > plan.txt

tofu/config/service/locals.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
locals {
2+
image_tag = var.image_tag != null ? var.image_tag : sha256(timestamp())
3+
}

tofu/config/service/main.tf

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ module "system" {
3030
container_subnets = split(",", module.inputs.values["vpc/private_subnets"])
3131

3232
apply_database_updates_immediately = var.apply_database_updates_immediately
33+
database_instance_count = var.database_instance_count
3334
database_skip_final_snapshot = var.database_skip_final_snapshot
3435
deletion_protection = var.deletion_protection
35-
image_tag = var.image_tag != null ? var.image_tag : sha256(timestamp())
36+
image_tag = local.image_tag
3637
image_tags_mutable = var.image_tags_mutable
3738

3839
consumer_container_count = var.consumer_container_count

tofu/config/service/outputs.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ output "export_bucket" {
88
description = "The name of the S3 bucket for exports."
99
}
1010

11+
output "image_tag" {
12+
value = local.image_tag
13+
description = "The tag of the container image used for the ECS tasks."
14+
}
15+
1116
output "queue_url" {
1217
value = module.system.queue_url
1318
description = "The URL of the SQS queue."

tofu/config/service/variables.tf

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@ variable "consumer_memory" {
2222
default = 4096
2323
}
2424

25+
variable "database_instance_count" {
26+
type = number
27+
description = "Number of instances in the database cluster."
28+
default = 1
29+
30+
validation {
31+
condition = var.database_instance_count >= 0 && var.database_instance_count < 17
32+
error_message = "Database instance count must be between 0 and 16."
33+
}
34+
}
35+
2536
variable "database_skip_final_snapshot" {
2637
type = bool
2738
description = "Whether to skip the final snapshot when the database cluster is deleted."

tofu/modules/system/variables.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ variable "database_instance_count" {
3333
default = 1
3434

3535
validation {
36-
condition = var.database_instance_count > 0 && var.database_instance_count < 17
37-
error_message = "Database instance count must be between 1 and 16."
36+
condition = var.database_instance_count >= 0 && var.database_instance_count < 17
37+
error_message = "Database instance count must be between 0 and 16."
3838
}
3939
}
4040

0 commit comments

Comments
 (0)