diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 6137b27..0000000 --- a/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM python:3.7.11-slim - -WORKDIR /python-api - -COPY requirements.txt requirements.txt - -RUN pip install -r requirements.txt - -COPY . . - -CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"] diff --git a/app/Dockerfile b/app/Dockerfile new file mode 100644 index 0000000..912b87a --- /dev/null +++ b/app/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.7.11-slim + +WORKDIR /app/python-api + +COPY . /app/python-api + +RUN pip install --no-cache-dir -r requirements.txt + +EXPOSE 5000 + +CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"] diff --git a/app.py b/app/app.py similarity index 100% rename from app.py rename to app/app.py diff --git a/requirements.txt b/app/requirements.txt similarity index 100% rename from requirements.txt rename to app/requirements.txt diff --git a/infra/terraform/main.tf b/infra/terraform/main.tf new file mode 100644 index 0000000..45b495b --- /dev/null +++ b/infra/terraform/main.tf @@ -0,0 +1,45 @@ +provider "aws" { + region = "us-west-2" +} + +resource "aws_ecr_repository" "flask_ecr" { + name = "flask-api-repository" +} + +resource "aws_ecs_cluster" "flask_cluster" { + name = "flask-cluster" +} + +resource "aws_ecs_task_definition" "flask_task" { + family = "flask-api-task" + network_mode = "awsvpc" + cpu = "256" + memory = "512" + requires_compatibilities = ["FARGATE"] + + container_definitions = jsonencode([{ + name = "flask-api" + image = "${aws_ecr_repository.flask_ecr.repository_url}:latest" + cpu = 256 + memory = 512 + essential = true + portMappings = [{ + containerPort = 5000 + hostPort = 5000 + protocol = "tcp" + }] + }]) +} + +resource "aws_ecs_service" "flask_service" { + name = "flask-service" + cluster = aws_ecs_cluster.flask_cluster.id + task_definition = aws_ecs_task_definition.flask_task.arn + desired_count = 1 + + network_configuration { + subnets = ["subnet-xxxxxxxx"] + security_groups = ["sg-xxxxxxxx"] + assign_public_ip = true + } +} diff --git a/infra/terraform/outputs.tf b/infra/terraform/outputs.tf new file mode 100644 index 0000000..02d7249 --- /dev/null +++ b/infra/terraform/outputs.tf @@ -0,0 +1,3 @@ +output "ecr_repository_url" { + value = aws_ecr_repository.flask_ecr.repository_url +} diff --git a/infra/terraform/terraform.tfvars b/infra/terraform/terraform.tfvars new file mode 100644 index 0000000..d078194 --- /dev/null +++ b/infra/terraform/terraform.tfvars @@ -0,0 +1 @@ +aws_region = "us-west-2" diff --git a/infra/terraform/variables.tf b/infra/terraform/variables.tf new file mode 100644 index 0000000..452d655 --- /dev/null +++ b/infra/terraform/variables.tf @@ -0,0 +1,3 @@ +variable "aws_region" { + default = "us-west-2" +} diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100644 index 0000000..5a69f70 --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +AWS_REGION="us-west-2" +ECR_REPOSITORY="flask-api-repository" +DOCKER_IMAGE_NAME="flask-api" +ECR_URI=$(aws ecr describe-repositories --repository-names $ECR_REPOSITORY --query "repositories[0].repositoryUri" --output text) + +aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_URI + +docker build -t $DOCKER_IMAGE_NAME . + +docker tag $DOCKER_IMAGE_NAME:latest $ECR_URI:latest + +docker push $ECR_URI:latest + +echo "Docker image pushed to ECR: $ECR_URI:latest" + +HEALTH_CHECK_URL="http://your-ecs-service-public-ip:5000" +STATUS_CODE=$(curl --write-out "%{http_code}" --silent --output /dev/null $HEALTH_CHECK_URL) + +if [ $STATUS_CODE -eq 200 ]; then + echo "Health check passed. Flask API is running!" +else + echo "Health check failed." + exit 1 +fi