Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

converting cloudformation template to terraform #1260

Merged
merged 12 commits into from
Jan 6, 2025
10 changes: 8 additions & 2 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,16 @@ jobs:
aws --profile $AWS_PROFILE configure set aws_access_key_id $AWS_ACCESS_KEY_ID
aws --profile $AWS_PROFILE configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY

- name: Configure Terraform
uses: hashicorp/setup-terraform@v3

- name: Prepare settings
env:
PARAM_JSON: ${{ secrets.PARAM_JSON }}
run: echo "$PARAM_JSON" > sys/cloudformation/parameters.secrets.prod.json
PARAM_TFVARS: ${{ secrets.PARAM_TFVARS }}
run: echo "$PARAM_TFVARS" > sys/terraform/terraform.tfvars

- name: Terraform init
run: terraform init

- name: Deploy
env:
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,7 @@ sys/nginx/certs/ca-key.pem
sys/nginx/certs/server.csr
sys/nginx/certs/server.key
sys/nginx/certs/server.pem
sys/terraform/.terraform
sys/terraform/terraform.tfvars
sys/terraform/terraform.tfstate
###< custom ###
20 changes: 3 additions & 17 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -80,23 +80,9 @@ PREVIOUS_TAG=$(shell git ls-remote --tags 2>&1 | awk '{print $$2}' | sort -r | h
ECR_REGISTRY = $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com

deploy_prod: build_prod_images push_prod_images ## deploy to prod
cat sys/cloudformation/parameters.prod.json \
| sed -e 's/{"ParameterKey": "EcrImageTagNginx", "ParameterValue": ".*"}/{"ParameterKey": "EcrImageTagNginx", "ParameterValue": "'$(VER)'"}/' \
-e 's/{"ParameterKey": "EcrImageTagPhp", "ParameterValue": ".*"}/{"ParameterKey": "EcrImageTagPhp", "ParameterValue": "'$(VER)'"}/' \
| tee sys/cloudformation/parameters.prod.json.new; \
mv sys/cloudformation/parameters.prod.json sys/cloudformation/parameters.prod.json.bak; \
mv sys/cloudformation/parameters.prod.json.new sys/cloudformation/parameters.prod.json; \
cat sys/cloudformation/parameters.secrets.prod.json \
| sed -e 's/{"ParameterKey": "EcrImageTagNginx", "ParameterValue": ".*"}/{"ParameterKey": "EcrImageTagNginx", "ParameterValue": "'$(VER)'"}/' \
-e 's/{"ParameterKey": "EcrImageTagPhp", "ParameterValue": ".*"}/{"ParameterKey": "EcrImageTagPhp", "ParameterValue": "'$(VER)'"}/' \
| tee sys/cloudformation/parameters.secrets.prod.json.new; \
mv sys/cloudformation/parameters.secrets.prod.json sys/cloudformation/parameters.secrets.prod.json.bak; \
mv sys/cloudformation/parameters.secrets.prod.json.new sys/cloudformation/parameters.secrets.prod.json; \
aws --profile=$(AWS_PROFILE) cloudformation create-change-set --capabilities CAPABILITY_NAMED_IAM \
--stack=poser-ecs \
--change-set-name=poser-ecs-$(VER) \
--template-body=file://$$PWD/sys/cloudformation/stack.yaml \
--parameters=file://sys/cloudformation/parameters.secrets.prod.json
# TODO: convert to terraform apply
# TODO: modify IAM policy to allow only the creation of ECS tasks via pipelines
terraform plan -var="ecr_image_tag_nginx=$(VER)" -var="ecr_image_tag_php=$(VER)"

build_%: export BADGE_POSER_REGISTRY = $(ECR_REGISTRY)/badge-poser
build_%: export DOCKER_BUILDKIT = 1
Expand Down
19 changes: 0 additions & 19 deletions sys/cloudformation/parameters.prod.json

This file was deleted.

Binary file removed sys/cloudformation/stack.png
Binary file not shown.
18 changes: 17 additions & 1 deletion sys/cloudformation/stack.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ Resources:

# SECURITY GROUP
sgelb:
DeletionPolicy: Retain
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub '${ServiceName}-elb'
Expand All @@ -210,6 +211,7 @@ Resources:
- Key: env
Value: !Ref ServiceName
sgecs:
DeletionPolicy: Retain
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub '${ServiceName}-ecs'
Expand All @@ -233,6 +235,7 @@ Resources:
- Key: env
Value: !Ref ServiceName
sgredis:
DeletionPolicy: Retain
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub '${ServiceName}-redis'
Expand All @@ -254,13 +257,15 @@ Resources:

# CLOUDWATCH LOGS
cloudwatchloggroup:
DeletionPolicy: Retain
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub '${ServiceName}-logs'
RetentionInDays: 30

# ELB
elb:
DeletionPolicy: Retain
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: !Sub '${ServiceName}-elb'
Expand All @@ -273,6 +278,7 @@ Resources:

# ELB LISTENER
elblistener80:
DeletionPolicy: Retain
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
Expand All @@ -286,6 +292,7 @@ Resources:
Protocol: HTTP

elblistener443:
DeletionPolicy: Retain
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
Expand All @@ -303,6 +310,7 @@ Resources:

# ECS CLUSTER
ecscluster:
DeletionPolicy: Retain
Type: AWS::ECS::Cluster
Properties:
ClusterName: !Sub '${ServiceName}-cluster-${Environment}'
Expand All @@ -318,6 +326,7 @@ Resources:

# ECS SERVICE
ecsservice:
DeletionPolicy: Retain
Type: AWS::ECS::Service
Properties:
Cluster: !Ref ecscluster
Expand All @@ -342,8 +351,8 @@ Resources:

# ECS TASK DEFINITION
ecstask:
Type: AWS::ECS::TaskDefinition
DeletionPolicy: Retain
Type: AWS::ECS::TaskDefinition
UpdateReplacePolicy: Retain
Properties:
ExecutionRoleArn: !Ref ExecRoleArn
Expand Down Expand Up @@ -430,6 +439,7 @@ Resources:

# AUTO SCALING
asscalabletarget:
DeletionPolicy: Retain
Type: AWS::ApplicationAutoScaling::ScalableTarget
DependsOn:
- ecsservice
Expand All @@ -443,6 +453,7 @@ Resources:

# ELB TARGET GROUP
elbtargetgroup:
DeletionPolicy: Retain
Type: AWS::ElasticLoadBalancingV2::TargetGroup
DependsOn:
- elb
Expand All @@ -468,6 +479,7 @@ Resources:

# ELB LISTENER RULE
elblistenerrule80:
DeletionPolicy: Retain
Type: AWS::ElasticLoadBalancingV2::ListenerRule
Properties:
Actions:
Expand All @@ -485,6 +497,7 @@ Resources:
ListenerArn: !Ref elblistener80
Priority: 1
elblistenerrule443:
DeletionPolicy: Retain
Type: AWS::ElasticLoadBalancingV2::ListenerRule
Properties:
Actions:
Expand All @@ -501,6 +514,7 @@ Resources:

# SCHEDULED TASK
eventrulecontributorsupdate:
DeletionPolicy: Retain
Type: AWS::Events::Rule
Properties:
Name: 'app-contributors-update'
Expand All @@ -522,6 +536,7 @@ Resources:

# IAM USER
iamusergithubactions:
DeletionPolicy: Retain
Type: AWS::IAM::User
Properties:
Policies:
Expand Down Expand Up @@ -576,6 +591,7 @@ Resources:

# IAM ACCESS-KEY
iamkey:
DeletionPolicy: Retain
Type: AWS::IAM::AccessKey
Properties:
UserName: !Ref iamusergithubactions
Expand Down
25 changes: 25 additions & 0 deletions sys/terraform/.terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions sys/terraform/cloudwatch.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# TODO: import dashboard

resource "aws_cloudwatch_event_rule" "eventrulecontributorsupdate" {
name = "app-contributors-update"
schedule_expression = "rate(24 hours)"
state = "DISABLED"
// CF Property(Targets) = [
// {
// Id = "phpfpm"
// Arn = aws_ecs_cluster.ecscluster.arn
// RoleArn = var.exec_role_arn
// Input = "{"containerOverrides":[{"name":"phpfpm","command":["./bin/console","app:contributors:update"]}]}"
// EcsParameters = {
// TaskDefinitionArn = aws_ecs_task_definition.ecstask.arn
// LaunchType = "FARGATE"
// NetworkConfiguration = {
// AwsVpcConfiguration = {
// SecurityGroups = [
// aws_security_group.sgecs.arn
// ]
// Subnets = var.subnets
// }
// }
// }
// }
// ]
}
3 changes: 3 additions & 0 deletions sys/terraform/data.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
data "aws_region" "current" {}

data "aws_caller_identity" "current" {}
114 changes: 114 additions & 0 deletions sys/terraform/ecs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
resource "aws_security_group" "sgecs" {
description = "${var.service_name}-ecs"
name = "${var.service_name}-ecs"
egress {
cidr_blocks = ["0.0.0.0/0"]
protocol = "-1"
from_port = 0
to_port = 0
}
vpc_id = var.vpc_id
}

resource "aws_security_group_rule" "sgecs_ingress_http" {
type = "ingress"
security_group_id = aws_security_group.sgecs.id
cidr_blocks = ["0.0.0.0/0"]
from_port = 80
protocol = "tcp"
to_port = 80
}
resource "aws_security_group_rule" "sgecs_ingress_https" {
type = "ingress"
security_group_id = aws_security_group.sgecs.id
cidr_blocks = ["0.0.0.0/0"]
from_port = 443
protocol = "tcp"
to_port = 443
}

resource "aws_cloudwatch_log_group" "cloudwatchloggroup" {
name = "${var.service_name}-logs"
retention_in_days = 14
}

resource "aws_ecs_cluster" "ecscluster" {
name = "${var.service_name}-cluster-${var.environment}"
// CF Property(CapacityProviders) = [
// "FARGATE",
// "FARGATE_SPOT"
// ]
setting {
name = "containerInsights"
value = "disabled"
}
}

resource "aws_ecs_service" "ecsservice" {
cluster = aws_ecs_cluster.ecscluster.arn
desired_count = 1
health_check_grace_period_seconds = 15

capacity_provider_strategy {
base = 0
capacity_provider = "FARGATE_SPOT"
weight = 2
}
capacity_provider_strategy {
base = 1
capacity_provider = "FARGATE"
weight = 1
}

load_balancer {
container_name = "nginx"
container_port = 80
target_group_arn = aws_lb_target_group.elbtargetgroup.id
}
name = var.service_name
task_definition = "${var.service_name}:${aws_ecs_task_definition.ecstask.revision}"
network_configuration {
assign_public_ip = true
security_groups = [aws_security_group.sgecs.id]
subnets = var.subnets
}
}

resource "aws_ecs_task_definition" "ecstask" {
execution_role_arn = var.exec_role_arn
container_definitions = templatefile("ecs/task-definition.json", {
account_id = data.aws_caller_identity.current.account_id
aws_region = data.aws_region.current.name
service_name = var.service_name
ecr_image_tag_nginx = var.ecr_image_tag_nginx
ecr_image_tag_php = var.ecr_image_tag_php
cloudwatchloggroup = aws_cloudwatch_log_group.cloudwatchloggroup.name
env_appdebug = var.env_appdebug
env_appenv = var.env_appenv
env_appsecret = var.env_appsecret
env_appxdebug = var.env_appxdebug
env_appxdebughost = var.env_appxdebughost
env_bitbucketauthmethod = var.env_bitbucketauthmethod
env_bitbucketsecret = var.env_bitbucketsecret
env_bitbuckettoken = var.env_bitbuckettoken
env_circlecitoken = var.env_circlecitoken
env_githubauthmethod = var.env_githubauthmethod
env_githubsecret = var.env_githubsecret
env_githubusername = var.env_githubusername
env_gitlabtoken = var.env_gitlabtoken
env_phpfpmhost = var.env_phpfpmhost
env_redishost = var.env_redishost
env_redishost = var.env_redishost
env_resolverip = var.env_resolverip
env_sentrydsn = var.env_sentrydsn
env_trustedproxies = var.env_trustedproxies
})
memory = "2048"
family = var.service_name
requires_compatibilities = [
"FARGATE"
]
network_mode = "awsvpc"
cpu = "1024"
skip_destroy = true
}
Loading