summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-03-24 11:41:23 +0200
committerPaul Buetow <paul@buetow.org>2024-03-24 11:41:23 +0200
commit92b0d3de2c5247776170ceb59ef13bc944fb31bd (patch)
treee36f696f774df62f4c87b05e2c06a3089e4451c6
parentcefb75f99c1be916d192613a8df4c49876a9e301 (diff)
add gpodder service
-rw-r--r--org-buetow-bastion/Makefile5
-rw-r--r--org-buetow-ecs/gpodderservice.tf147
-rw-r--r--org-buetow-ecs/variables.tf6
3 files changed, 158 insertions, 0 deletions
diff --git a/org-buetow-bastion/Makefile b/org-buetow-bastion/Makefile
new file mode 100644
index 0000000..ac16539
--- /dev/null
+++ b/org-buetow-bastion/Makefile
@@ -0,0 +1,5 @@
+apply:
+ terraform apply -auto-approve
+destroy:
+ terraform destroy -auto-approve
+recreate: destroy apply
diff --git a/org-buetow-ecs/gpodderservice.tf b/org-buetow-ecs/gpodderservice.tf
new file mode 100644
index 0000000..66431a6
--- /dev/null
+++ b/org-buetow-ecs/gpodderservice.tf
@@ -0,0 +1,147 @@
+resource "aws_route53_record" "a_record_gpodder" {
+ count = var.deploy_gpodder ? 1 : 0
+ zone_id = data.terraform_remote_state.base.outputs.zone_id
+ name = "gpodder.${data.terraform_remote_state.base.outputs.zone_name}."
+ type = "A"
+
+ alias {
+ name = data.terraform_remote_state.elb.outputs.alb_dns_name
+ zone_id = data.terraform_remote_state.elb.outputs.alb_zone_id
+ evaluate_target_health = true
+ }
+}
+
+resource "aws_route53_record" "aaaa_record_gpodder" {
+ count = var.deploy_gpodder ? 1 : 0
+ zone_id = data.terraform_remote_state.base.outputs.zone_id
+ name = "gpodder.${data.terraform_remote_state.base.outputs.zone_name}."
+ type = "AAAA"
+
+ alias {
+ name = data.terraform_remote_state.elb.outputs.alb_dns_name
+ zone_id = data.terraform_remote_state.elb.outputs.alb_zone_id
+ evaluate_target_health = true
+ }
+}
+
+resource "aws_ecs_task_definition" "gpodder" {
+ count = var.deploy_gpodder ? 1 : 0
+ family = "gpodder"
+ network_mode = "awsvpc"
+ requires_compatibilities = ["FARGATE"]
+ cpu = "256"
+ memory = "512"
+ execution_role_arn = aws_iam_role.ecs_execution_role.arn
+
+ tags = {
+ Name = "gpodder"
+ }
+
+ volume {
+ name = "gpodder-data-efs-volume"
+ efs_volume_configuration {
+ file_system_id = data.terraform_remote_state.base.outputs.self_hosted_services_efs_id
+ root_directory = "/ecs/gpodder/data"
+ }
+ }
+
+ container_definitions = jsonencode([{
+ name = "gpodder",
+ image = "634617747016.dkr.ecr.eu-central-1.amazonaws.com/micro-gpodder-server:latest",
+ portMappings = [{
+ containerPort = 8080,
+ hostPort = 8080
+ }],
+ mountPoints = [
+ {
+ sourceVolume = "gpodder-data-efs-volume"
+ containerPath = "/var/www/server/data"
+ readOnly = false
+ }
+ ],
+ "logConfiguration" : {
+ "logDriver" : "awslogs",
+ "options" : {
+ "awslogs-group" : "/ecs/containers",
+ "awslogs-region" : "eu-central-1",
+ "awslogs-stream-prefix" : "gpodder"
+ }
+ }
+ }])
+}
+
+resource "aws_ecs_service" "gpodder" {
+ count = var.deploy_gpodder ? 1 : 0
+ name = "gpodder"
+ cluster = aws_ecs_cluster.ecs_cluster.id
+ task_definition = aws_ecs_task_definition.gpodder[0].arn
+ launch_type = "FARGATE"
+ deployment_maximum_percent = 100
+ deployment_minimum_healthy_percent = 0
+ desired_count = 1
+
+ tags = {
+ Name = "gpodder"
+ }
+
+ load_balancer {
+ target_group_arn = aws_lb_target_group.gpodder_tg[0].arn
+ container_name = "gpodder" # Must match the name in your container definition
+ container_port = 8080 # The port your container is listening on
+ }
+
+ network_configuration {
+ subnets = [
+ data.terraform_remote_state.base.outputs.public_subnet_a_id,
+ data.terraform_remote_state.base.outputs.public_subnet_b_id,
+ data.terraform_remote_state.base.outputs.public_subnet_c_id,
+ ]
+ security_groups = [data.terraform_remote_state.base.outputs.allow_web_sg_id]
+ assign_public_ip = true
+ }
+}
+
+resource "aws_lb_target_group" "gpodder_tg" {
+ count = var.deploy_gpodder ? 1 : 0
+ name = "gpodder-tg"
+ port = 8080
+ protocol = "HTTP"
+ vpc_id = data.terraform_remote_state.base.outputs.vpc_id
+ target_type = "ip"
+
+ health_check {
+ enabled = true
+ healthy_threshold = 2
+ unhealthy_threshold = 2
+ interval = 30
+ path = "/"
+ protocol = "HTTP"
+ timeout = 3
+ matcher = "200-299"
+ }
+
+ tags = {
+ Name = "gpodder"
+ }
+}
+
+resource "aws_lb_listener_rule" "gpodder_https_listener_rule" {
+ count = var.deploy_gpodder ? 1 : 0
+ listener_arn = data.terraform_remote_state.elb.outputs.alb_https_listener_arn
+ priority = 107
+
+ action {
+ type = "forward"
+ target_group_arn = aws_lb_target_group.gpodder_tg[0].arn
+ }
+
+ condition {
+ host_header {
+ values = ["gpodder.${data.terraform_remote_state.base.outputs.zone_name}"]
+ }
+ }
+
+ tags = {
+ Name = "gpodder"
+ }
+}
diff --git a/org-buetow-ecs/variables.tf b/org-buetow-ecs/variables.tf
index 5127d0c..83dca35 100644
--- a/org-buetow-ecs/variables.tf
+++ b/org-buetow-ecs/variables.tf
@@ -16,6 +16,12 @@ variable "deploy_bag" {
default = true
}
+variable "deploy_gpodder" {
+ description = "Deploy Mcro GPodder Server?"
+ type = bool
+ default = true
+}
+
variable "deploy_nginx" {
description = "Deploy Nginx Server?"
type = bool