diff --git a/app/__pycache__/app_instance.cpython-311.pyc b/app/__pycache__/app_instance.cpython-311.pyc new file mode 100644 index 00000000..6bd563e3 Binary files /dev/null and b/app/__pycache__/app_instance.cpython-311.pyc differ diff --git a/app/__pycache__/main.cpython-311.pyc b/app/__pycache__/main.cpython-311.pyc index 468cef20..0746e7c6 100644 Binary files a/app/__pycache__/main.cpython-311.pyc and b/app/__pycache__/main.cpython-311.pyc differ diff --git a/app/app_instance.py b/app/app_instance.py new file mode 100644 index 00000000..ba3e2475 --- /dev/null +++ b/app/app_instance.py @@ -0,0 +1,3 @@ +from fastapi import FastAPI + +app = FastAPI() \ No newline at end of file diff --git a/app/directory_generators/terraform_generator.py b/app/directory_generators/terraform_generator.py index 1009a660..c3f541b1 100644 --- a/app/directory_generators/terraform_generator.py +++ b/app/directory_generators/terraform_generator.py @@ -1,66 +1,94 @@ import os + project_name = "app/media/MyTerraform" modules_dir = os.path.join(project_name, "modules") -docker_container_dir = os.path.join(modules_dir, "docker_container") +docker_dir = os.path.join(modules_dir, "docker") # Create project directories -os.makedirs(docker_container_dir, exist_ok=True) +os.makedirs(docker_dir, exist_ok=True) # Create main.tf with open(os.path.join(project_name, "main.tf"), "w") as main_file: main_file.write(''' provider "docker" { - host = var.docker_host + host = "unix:///var/run/docker.sock" } -module "docker_container" { - source = "./modules/docker_container" +module "docker" { + source = "./modules/docker" + + image_name = var.image_name + image_force_remove = var.image_force_remove + image_build = var.image_build + image_count = var.image_count - image = var.image - name = var.name - ports = var.ports - env = var.env + container_image = var.container_image + container_name = var.container_name + container_hostname = var.container_hostname + container_restart = var.container_restart + container_count = var.container_count } - ''') # Create variables.tf -with open(os.path.join(project_name, "variables.tf"), "w") as vars_file: - vars_file.write(''' -variable "docker_host" { - description = "Docker host URL." - type = string +with open(os.path.join(project_name, "variables.tf"), "w") as variables_file: + variables_file.write(''' +variable "image_name" { + type = string +} + +variable "image_force_remove" { + type = bool +} + +variable "image_build" { + type = object({ + context = string + tag = list(string) + }) +} + +variable "image_count" { + type = number } -variable "image" { - description = "Docker image to use." - type = string +variable "container_image" { + type = string } -variable "name" { - description = "Name of the container." - type = string +variable "container_name" { + type = string } -variable "ports" { - description = "List of ports to expose." - type = list(string) +variable "container_hostname" { + type = string } -variable "env" { - description = "Environment variables for the container." - type = map(string) +variable "container_restart" { + type = string +} + +variable "container_count" { + type = number } ''') # Create terraform.tfvars with open(os.path.join(project_name, "terraform.tfvars"), "w") as tfvars_file: tfvars_file.write(''' -docker_host = "tcp://localhost:2375" -image = "nginx:latest" -name = "my-nginx-container" -ports = ["80:80"] -env = { "MY_ENV_VAR" = "value" } +image_name = "my-image" +image_force_remove = true +image_build = { + context = "./" + tag = ["my-image:latest"] +} +image_count = 1 + +container_image = "my-image" +container_name = "my-container" +container_hostname = "my-host" +container_restart = "always" +container_count = 1 ''') # Create versions.tf @@ -76,73 +104,94 @@ } } } - ''') -# Create outputs.tf -with open(os.path.join(project_name, "outputs.tf"), "w") as outputs_file: - outputs_file.write(''' -output "container_id" { - description = "The ID of the Docker container." - value = module.docker_container.container_id +# Create module main.tf +with open(os.path.join(docker_dir, "main.tf"), "w") as module_main_file: + module_main_file.write(''' +resource "docker_image" "app_image" { + count = var.image_count + name = var.image_name + force_remove = var.image_force_remove + + build { + context = var.image_build.context + tag = var.image_build.tag + } } -output "container_ip" { - description = "The IP address of the Docker container." - value = module.docker_container.container_ip +resource "docker_container" "app_container" { + count = var.container_count + image = var.container_image + name = var.container_name + hostname = var.container_hostname + restart = var.container_restart } ''') -# Create module files -# Create docker_container/main.tf -with open(os.path.join(docker_container_dir, "main.tf"), "w") as module_main_file: - module_main_file.write(''' -resource "docker_container" "app" { - image = var.image - name = var.name - ports { - internal = 80 - external = var.ports[0] - } - env = var.env +# Create module variables.tf +with open(os.path.join(docker_dir, "variables.tf"), "w") as module_variables_file: + module_variables_file.write(''' +variable "image_name" { + type = string +} + +variable "image_force_remove" { + type = bool +} + +variable "image_build" { + type = object({ + context = string + tag = list(string) + }) +} + +variable "image_count" { + type = number } -''') -# Create docker_container/variables.tf -with open(os.path.join(docker_container_dir, "variables.tf"), "w") as module_vars_file: - module_vars_file.write(''' -variable "image" { - description = "Docker image." - type = string +variable "container_image" { + type = string } -variable "name" { - description = "Container name." - type = string +variable "container_name" { + type = string } -variable "ports" { - description = "List of exposed ports." - type = list(string) +variable "container_hostname" { + type = string } -variable "env" { - description = "Map of environment variables." - type = map(string) +variable "container_restart" { + type = string +} + +variable "container_count" { + type = number } ''') -# Create docker_container/terraform.tfvars -with open(os.path.join(docker_container_dir, "terraform.tfvars"), "w") as module_tfvars_file: +# Create module terraform.tfvars +with open(os.path.join(docker_dir, "terraform.tfvars"), "w") as module_tfvars_file: module_tfvars_file.write(''' -image = "nginx:latest" -name = "my-nginx-container" -ports = ["80:80"] -env = { "MY_ENV_VAR" = "value" } +image_name = "my-image" +image_force_remove = true +image_build = { + context = "./" + tag = ["my-image:latest"] +} +image_count = 1 + +container_image = "my-image" +container_name = "my-container" +container_hostname = "my-host" +container_restart = "always" +container_count = 1 ''') -# Create docker_container/versions.tf -with open(os.path.join(docker_container_dir, "versions.tf"), "w") as module_versions_file: +# Create module versions.tf +with open(os.path.join(docker_dir, "versions.tf"), "w") as module_versions_file: module_versions_file.write(''' terraform { required_version = ">= 1.0" @@ -154,18 +203,4 @@ } } } -''') - -# Create docker_container/outputs.tf -with open(os.path.join(docker_container_dir, "outputs.tf"), "w") as module_outputs_file: - module_outputs_file.write(''' -output "container_id" { - description = "The ID of the Docker container." - value = docker_container.app.id -} - -output "container_ip" { - description = "The IP address of the Docker container." - value = docker_container.app.ip_address -} ''') \ No newline at end of file diff --git a/app/main.py b/app/main.py index d4f40fca..560f9655 100644 --- a/app/main.py +++ b/app/main.py @@ -1,86 +1,3 @@ - -from .gpt_services import gpt_service -from .services import (write_basic, - write_bugfix, - write_installation, - edit_directory_generator,execute_pythonfile) -from app.models import (IaCBasicInput, - IaCBugfixInput, - Output, - IaCInstallationInput,IaCTemplateGenerationDocker,HelmTemplateGeneration) - -from fastapi import FastAPI, HTTPException,Response -from fastapi.responses import FileResponse -from .prompt_generators import (IaC_basics_generator, - IaC_bugfix_generator, - IaC_installation_generator, - helm_template_generator) - -from app.template_generators.terraform.docker import (IaC_template_generator_docker) - -import os -app = FastAPI() - - -@app.post("/IaC-basic/") -async def IaC_basic_generation(request:IaCBasicInput) -> Output: - - generated_prompt = IaC_basics_generator(request) - output = gpt_service(generated_prompt) - return Output(output=output) - -@app.post("/IaC-bugfix/") -async def IaC_bugfix_generation(request:IaCBugfixInput) -> Output: - - generated_prompt = IaC_bugfix_generator(request) - output = gpt_service(generated_prompt) - return Output(output=output) - - -@app.post("/IaC-install/") -async def IaC_install_generation(request:IaCInstallationInput) -> Output: - - generated_prompt = IaC_installation_generator(request) - output = gpt_service(generated_prompt) - return Output(output=output) - -@app.post("/IaC-template/docker") -async def IaC_template_generation_docker(request:IaCTemplateGenerationDocker) -> Output: - - generated_prompt = IaC_template_generator_docker(request) - output = gpt_service(generated_prompt) - edit_directory_generator("terraform_generator",output) - execute_pythonfile("MyTerraform","terraform_generator") - return Output(output='output') - -@app.post("/Helm-template/") -async def Helm_template_generation(request:HelmTemplateGeneration) -> Output: - - generated_prompt = helm_template_generator(request) - output = gpt_service(generated_prompt) - edit_directory_generator("helm_generator",output) - execute_pythonfile("MyHelm","helm_generator") - return Output(output='output') - - -@app.get("/download/{filename}") -def download_file(filename: str): - folder = "app/media/MyTerraform" # specify your folder path here - file_path = os.path.join(folder, filename) - - # Ensure the file exists - if not os.path.isfile(file_path): - raise HTTPException(status_code=404, detail="File not found.") - - # Return the file response for download - return FileResponse(file_path, media_type='application/octet-stream', filename=filename) - -@app.get("/list-directory") -def list_directory(folder: str): - # Ensure the folder exists - if not os.path.isdir(folder): - raise HTTPException(status_code=404, detail=f"{folder} does not exist.") - - # List the contents of the directory - contents = os.listdir(folder) - return {"folder": folder, "contents": contents} +from app.routes.utils import * +from app.routes.terraform import * +from app.routes.helm import * \ No newline at end of file diff --git a/app/media/MyTerraform/main.tf b/app/media/MyTerraform/main.tf index 48b120be..314d2d31 100644 --- a/app/media/MyTerraform/main.tf +++ b/app/media/MyTerraform/main.tf @@ -1,14 +1,19 @@ provider "docker" { - host = var.docker_host + host = "unix:///var/run/docker.sock" } -module "docker_container" { - source = "./modules/docker_container" +module "docker" { + source = "./modules/docker" + + image_name = var.image_name + image_force_remove = var.image_force_remove + image_build = var.image_build + image_count = var.image_count - image = var.image - name = var.name - ports = var.ports - env = var.env + container_image = var.container_image + container_name = var.container_name + container_hostname = var.container_hostname + container_restart = var.container_restart + container_count = var.container_count } - diff --git a/app/media/MyTerraform/modules/docker/main.tf b/app/media/MyTerraform/modules/docker/main.tf new file mode 100644 index 00000000..c2474234 --- /dev/null +++ b/app/media/MyTerraform/modules/docker/main.tf @@ -0,0 +1,19 @@ + +resource "docker_image" "app_image" { + count = var.image_count + name = var.image_name + force_remove = var.image_force_remove + + build { + context = var.image_build.context + tag = var.image_build.tag + } +} + +resource "docker_container" "app_container" { + count = var.container_count + image = var.container_image + name = var.container_name + hostname = var.container_hostname + restart = var.container_restart +} diff --git a/app/media/MyTerraform/modules/docker/terraform.tfvars b/app/media/MyTerraform/modules/docker/terraform.tfvars new file mode 100644 index 00000000..7b8b3aed --- /dev/null +++ b/app/media/MyTerraform/modules/docker/terraform.tfvars @@ -0,0 +1,14 @@ + +image_name = "my-image" +image_force_remove = true +image_build = { + context = "./" + tag = ["my-image:latest"] +} +image_count = 1 + +container_image = "my-image" +container_name = "my-container" +container_hostname = "my-host" +container_restart = "always" +container_count = 1 diff --git a/app/media/MyTerraform/modules/docker/variables.tf b/app/media/MyTerraform/modules/docker/variables.tf new file mode 100644 index 00000000..b100b54a --- /dev/null +++ b/app/media/MyTerraform/modules/docker/variables.tf @@ -0,0 +1,39 @@ + +variable "image_name" { + type = string +} + +variable "image_force_remove" { + type = bool +} + +variable "image_build" { + type = object({ + context = string + tag = list(string) + }) +} + +variable "image_count" { + type = number +} + +variable "container_image" { + type = string +} + +variable "container_name" { + type = string +} + +variable "container_hostname" { + type = string +} + +variable "container_restart" { + type = string +} + +variable "container_count" { + type = number +} diff --git a/app/media/MyTerraform/modules/docker_container/versions.tf b/app/media/MyTerraform/modules/docker/versions.tf similarity index 100% rename from app/media/MyTerraform/modules/docker_container/versions.tf rename to app/media/MyTerraform/modules/docker/versions.tf diff --git a/app/media/MyTerraform/modules/docker_container/main.tf b/app/media/MyTerraform/modules/docker_container/main.tf deleted file mode 100644 index 86f7d39e..00000000 --- a/app/media/MyTerraform/modules/docker_container/main.tf +++ /dev/null @@ -1,10 +0,0 @@ - -resource "docker_container" "app" { - image = var.image - name = var.name - ports { - internal = 80 - external = var.ports[0] - } - env = var.env -} diff --git a/app/media/MyTerraform/modules/docker_container/outputs.tf b/app/media/MyTerraform/modules/docker_container/outputs.tf deleted file mode 100644 index 863337be..00000000 --- a/app/media/MyTerraform/modules/docker_container/outputs.tf +++ /dev/null @@ -1,10 +0,0 @@ - -output "container_id" { - description = "The ID of the Docker container." - value = docker_container.app.id -} - -output "container_ip" { - description = "The IP address of the Docker container." - value = docker_container.app.ip_address -} diff --git a/app/media/MyTerraform/modules/docker_container/terraform.tfvars b/app/media/MyTerraform/modules/docker_container/terraform.tfvars deleted file mode 100644 index 0c37cb09..00000000 --- a/app/media/MyTerraform/modules/docker_container/terraform.tfvars +++ /dev/null @@ -1,5 +0,0 @@ - -image = "nginx:latest" -name = "my-nginx-container" -ports = ["80:80"] -env = { "MY_ENV_VAR" = "value" } diff --git a/app/media/MyTerraform/modules/docker_container/variables.tf b/app/media/MyTerraform/modules/docker_container/variables.tf deleted file mode 100644 index e6f48f3f..00000000 --- a/app/media/MyTerraform/modules/docker_container/variables.tf +++ /dev/null @@ -1,20 +0,0 @@ - -variable "image" { - description = "Docker image." - type = string -} - -variable "name" { - description = "Container name." - type = string -} - -variable "ports" { - description = "List of exposed ports." - type = list(string) -} - -variable "env" { - description = "Map of environment variables." - type = map(string) -} diff --git a/app/media/MyTerraform/outputs.tf b/app/media/MyTerraform/outputs.tf deleted file mode 100644 index 38d081bc..00000000 --- a/app/media/MyTerraform/outputs.tf +++ /dev/null @@ -1,10 +0,0 @@ - -output "container_id" { - description = "The ID of the Docker container." - value = module.docker_container.container_id -} - -output "container_ip" { - description = "The IP address of the Docker container." - value = module.docker_container.container_ip -} diff --git a/app/media/MyTerraform/terraform.tfvars b/app/media/MyTerraform/terraform.tfvars index 48ee34d2..7b8b3aed 100644 --- a/app/media/MyTerraform/terraform.tfvars +++ b/app/media/MyTerraform/terraform.tfvars @@ -1,6 +1,14 @@ -docker_host = "tcp://localhost:2375" -image = "nginx:latest" -name = "my-nginx-container" -ports = ["80:80"] -env = { "MY_ENV_VAR" = "value" } +image_name = "my-image" +image_force_remove = true +image_build = { + context = "./" + tag = ["my-image:latest"] +} +image_count = 1 + +container_image = "my-image" +container_name = "my-container" +container_hostname = "my-host" +container_restart = "always" +container_count = 1 diff --git a/app/media/MyTerraform/variables.tf b/app/media/MyTerraform/variables.tf index 7c02a3ad..b100b54a 100644 --- a/app/media/MyTerraform/variables.tf +++ b/app/media/MyTerraform/variables.tf @@ -1,25 +1,39 @@ -variable "docker_host" { - description = "Docker host URL." - type = string +variable "image_name" { + type = string } -variable "image" { - description = "Docker image to use." - type = string +variable "image_force_remove" { + type = bool } -variable "name" { - description = "Name of the container." - type = string +variable "image_build" { + type = object({ + context = string + tag = list(string) + }) } -variable "ports" { - description = "List of ports to expose." - type = list(string) +variable "image_count" { + type = number } -variable "env" { - description = "Environment variables for the container." - type = map(string) +variable "container_image" { + type = string +} + +variable "container_name" { + type = string +} + +variable "container_hostname" { + type = string +} + +variable "container_restart" { + type = string +} + +variable "container_count" { + type = number } diff --git a/app/media/MyTerraform/versions.tf b/app/media/MyTerraform/versions.tf index fac08236..b7acf232 100644 --- a/app/media/MyTerraform/versions.tf +++ b/app/media/MyTerraform/versions.tf @@ -9,4 +9,3 @@ terraform { } } } - diff --git a/app/models/__pycache__/terraform_models.cpython-311.pyc b/app/models/__pycache__/terraform_models.cpython-311.pyc index 10bb492f..c17ab7ba 100644 Binary files a/app/models/__pycache__/terraform_models.cpython-311.pyc and b/app/models/__pycache__/terraform_models.cpython-311.pyc differ diff --git a/app/models/terraform_models.py b/app/models/terraform_models.py index d8f80014..24b076ba 100644 --- a/app/models/terraform_models.py +++ b/app/models/terraform_models.py @@ -67,4 +67,16 @@ class IaCTemplateGenerationDocker(BaseModel): docker_image: bool = True docker_container: bool = True - \ No newline at end of file +class IaCTemplateGenerationEC2(BaseModel): + key_pair:bool = True + security_group:bool = True + aws_instance:bool = True + ami_from_instance:bool = True + +class IaCTemplateGenerationS3(BaseModel): + s3_bucket:bool = True + bucket_versioning:bool = True + +class IaCTemplateGenerationIAM(BaseModel): + iam_user:bool = True + iam_group:bool = True \ No newline at end of file diff --git a/app/routes/__pycache__/helm.cpython-311.pyc b/app/routes/__pycache__/helm.cpython-311.pyc new file mode 100644 index 00000000..cf0b190e Binary files /dev/null and b/app/routes/__pycache__/helm.cpython-311.pyc differ diff --git a/app/routes/__pycache__/terraform.cpython-311.pyc b/app/routes/__pycache__/terraform.cpython-311.pyc new file mode 100644 index 00000000..a8eff2c1 Binary files /dev/null and b/app/routes/__pycache__/terraform.cpython-311.pyc differ diff --git a/app/routes/__pycache__/utils.cpython-311.pyc b/app/routes/__pycache__/utils.cpython-311.pyc new file mode 100644 index 00000000..21bb84ab Binary files /dev/null and b/app/routes/__pycache__/utils.cpython-311.pyc differ diff --git a/app/routes/helm.py b/app/routes/helm.py new file mode 100644 index 00000000..8450e5bd --- /dev/null +++ b/app/routes/helm.py @@ -0,0 +1,14 @@ +from app.app_instance import app +from app.gpt_services import gpt_service +from app.services import (write_installation,edit_directory_generator,execute_pythonfile) +from app.models import (HelmTemplateGeneration,Output) +from app.prompt_generators import (helm_template_generator) + +@app.post("/Helm-template/") +async def Helm_template_generation(request:HelmTemplateGeneration) -> Output: + + generated_prompt = helm_template_generator(request) + output = gpt_service(generated_prompt) + edit_directory_generator("helm_generator",output) + execute_pythonfile("MyHelm","helm_generator") + return Output(output='output') \ No newline at end of file diff --git a/app/routes/terraform.py b/app/routes/terraform.py new file mode 100644 index 00000000..f3db5ae8 --- /dev/null +++ b/app/routes/terraform.py @@ -0,0 +1,83 @@ +from app.app_instance import app +from app.gpt_services import gpt_service +from app.services import ( + write_installation, + edit_directory_generator,execute_pythonfile) +from app.models import (IaCBasicInput, + IaCBugfixInput, + Output, + IaCInstallationInput, + IaCTemplateGenerationDocker, + IaCTemplateGenerationEC2, + IaCTemplateGenerationS3, + IaCTemplateGenerationIAM, + ) + +from fastapi import Response + +from app.prompt_generators import (IaC_basics_generator, + IaC_bugfix_generator, + IaC_installation_generator, + ) +from app.template_generators.terraform.docker import (IaC_template_generator_docker) + + +@app.post("/IaC-basic/") +async def IaC_basic_generation(request:IaCBasicInput) -> Output: + + generated_prompt = IaC_basics_generator(request) + output = gpt_service(generated_prompt) + return Output(output=output) + +@app.post("/IaC-bugfix/") +async def IaC_bugfix_generation(request:IaCBugfixInput) -> Output: + + generated_prompt = IaC_bugfix_generator(request) + output = gpt_service(generated_prompt) + return Output(output=output) + + +@app.post("/IaC-install/") +async def IaC_install_generation(request:IaCInstallationInput) -> Output: + + generated_prompt = IaC_installation_generator(request) + output = gpt_service(generated_prompt) + return Output(output=output) + +@app.post("/IaC-template/docker") +async def IaC_template_generation_docker(request:IaCTemplateGenerationDocker) -> Output: + + generated_prompt = IaC_template_generator_docker(request) + output = gpt_service(generated_prompt) + edit_directory_generator("terraform_generator",output) + execute_pythonfile("MyTerraform","terraform_generator") + return Output(output='output') + +@app.post("/IaC-template/aws/ec2") +async def IaC_template_generation_aws_ec2(request:IaCTemplateGenerationEC2) -> Output: + + generated_prompt = IaC_template_generator_docker(request) + output = gpt_service(generated_prompt) + edit_directory_generator("terraform_generator",output) + execute_pythonfile("MyTerraform","terraform_generator") + return Output(output='output') + +@app.post("/IaC-template/aws/s3") +async def IaC_template_generation_aws_s3(request:IaCTemplateGenerationS3) -> Output: + + generated_prompt = IaC_template_generator_docker(request) + output = gpt_service(generated_prompt) + edit_directory_generator("terraform_generator",output) + execute_pythonfile("MyTerraform","terraform_generator") + return Output(output='output') + +@app.post("/IaC-template/aws/iam") +async def IaC_template_generation_aws_iam(request:IaCTemplateGenerationIAM) -> Output: + + generated_prompt = IaC_template_generator_docker(request) + output = gpt_service(generated_prompt) + edit_directory_generator("terraform_generator",output) + execute_pythonfile("MyTerraform","terraform_generator") + return Output(output='output') + + diff --git a/app/routes/utils.py b/app/routes/utils.py new file mode 100644 index 00000000..c0792ed8 --- /dev/null +++ b/app/routes/utils.py @@ -0,0 +1,27 @@ +from app.app_instance import app +from fastapi import FastAPI, HTTPException,Response +from fastapi.responses import FileResponse +import os + + +@app.get("/download/{filename}") +def download_file(filename: str): + folder = "app/media/MyTerraform" # specify your folder path here + file_path = os.path.join(folder, filename) + + # Ensure the file exists + if not os.path.isfile(file_path): + raise HTTPException(status_code=404, detail="File not found.") + + # Return the file response for download + return FileResponse(file_path, media_type='application/octet-stream', filename=filename) + +@app.get("/list-directory") +def list_directory(folder: str): + # Ensure the folder exists + if not os.path.isdir(folder): + raise HTTPException(status_code=404, detail=f"{folder} does not exist.") + + # List the contents of the directory + contents = os.listdir(folder) + return {"folder": folder, "contents": contents} diff --git a/app/template_generators/terraform/__pycache__/docker.cpython-311.pyc b/app/template_generators/terraform/__pycache__/docker.cpython-311.pyc index ca0514bf..d9f84a3f 100644 Binary files a/app/template_generators/terraform/__pycache__/docker.cpython-311.pyc and b/app/template_generators/terraform/__pycache__/docker.cpython-311.pyc differ diff --git a/app/template_generators/terraform/aws/IAM.py b/app/template_generators/terraform/aws/IAM.py new file mode 100644 index 00000000..e69de29b diff --git a/app/template_generators/terraform/aws/__init__.py b/app/template_generators/terraform/aws/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/template_generators/terraform/aws/ec2.py b/app/template_generators/terraform/aws/ec2.py new file mode 100644 index 00000000..e69de29b diff --git a/app/template_generators/terraform/aws/s3.py b/app/template_generators/terraform/aws/s3.py new file mode 100644 index 00000000..e69de29b