From 67bd585dfbb4ab2ddc78c376127a4d8b4b8f0d58 Mon Sep 17 00:00:00 2001 From: Boluwatife Adesina Date: Sun, 2 Jun 2024 14:43:27 -0400 Subject: [PATCH 01/21] Add Docker build and push workflow --- .github/workflows/docker-image.yml | 43 ++++++++++++++++++++++++++++++ Dockerfile | 2 +- mysql/Dockerfile | 6 +++++ mysql/schema.sql | 3 +++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/docker-image.yml create mode 100644 mysql/Dockerfile create mode 100644 mysql/schema.sql diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 0000000..275f1a8 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,43 @@ +name: Build and Push Docker Images + +on: + push: + branches: + - main + - development + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + with: + region: your-region + + - name: Build, tag, and push MySQL image + env: + ECR_REGISTRY: your-account-id.dkr.ecr.your-region.amazonaws.com + ECR_REPOSITORY: my_db + IMAGE_TAG: latest + run: | + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile_mysql . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + + - name: Build, tag, and push WebApp image + env: + ECR_REGISTRY: your-account-id.dkr.ecr.your-region.amazonaws.com + ECR_REPOSITORY: my_app + IMAGE_TAG: latest + run: | + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + diff --git a/Dockerfile b/Dockerfile index 9dded45..c7b6bd2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,4 +10,4 @@ RUN pip install --upgrade pip RUN pip install -r requirements.txt EXPOSE 8080 ENTRYPOINT [ "python3" ] -CMD [ "app.py" ] \ No newline at end of file +CMD [ "app.py" ] diff --git a/mysql/Dockerfile b/mysql/Dockerfile new file mode 100644 index 0000000..8916ab4 --- /dev/null +++ b/mysql/Dockerfile @@ -0,0 +1,6 @@ +# mysql/Dockerfile +FROM mysql:5.7 +ENV MYSQL_ROOT_PASSWORD=root +ENV MYSQL_DATABASE=mydb +COPY schema.sql /docker-entrypoint-initdb.d/ + diff --git a/mysql/schema.sql b/mysql/schema.sql new file mode 100644 index 0000000..77108b1 --- /dev/null +++ b/mysql/schema.sql @@ -0,0 +1,3 @@ +-- mysql/schema.sql +CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255)); + From a72118ca290cb610b7e5668c0cea46b361784255 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sun, 2 Jun 2024 20:10:17 +0000 Subject: [PATCH 02/21] Add GitHub Actions workflow for Docker build and push --- .github/workflows/docker-build-push.yml | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/docker-build-push.yml diff --git a/.github/workflows/docker-build-push.yml b/.github/workflows/docker-build-push.yml new file mode 100644 index 0000000..f632fc0 --- /dev/null +++ b/.github/workflows/docker-build-push.yml @@ -0,0 +1,36 @@ +name: Build and Push Docker Images + +on: + push: + branches: + - master + + jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Log in to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + with: + region: us-east-1 + + - name: Build and push MySQL image + run: | + docker build -t my-mysql:latest -f Dockerfile.mysql . + docker tag my-mysql:latest ${{ steps.login-ecr.outputs.registry }}/mysql:latest + docker push ${{ steps.login-ecr.outputs.registry }}/mysql:latest + + - name: Build and push webapp image + run: | + docker build -t my-webapp:latest . + docker tag my-webapp:latest ${{ steps.login-ecr.outputs.registry }}/webapp:latest + docker push ${{ steps.login-ecr.outputs.registry }}/webapp:latest + From b0ce961f7dc4d9e6f99b1f69d13e1a2a0e808371 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sun, 2 Jun 2024 22:24:25 +0000 Subject: [PATCH 03/21] Update application --- app.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app.py b/app.py index 3ac7116..548e158 100644 --- a/app.py +++ b/app.py @@ -14,6 +14,8 @@ COLOR_FROM_ENV = os.environ.get('APP_COLOR') or "lime" DBPORT = int(os.environ.get("DBPORT")) + + # Create a connection to the MySQL database db_conn = connections.Connection( host= DBHOST, From 78e3950bc66c23e8cf0f6ce6072261002a095edf Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sun, 2 Jun 2024 22:50:51 +0000 Subject: [PATCH 04/21] Trying workflow functionality --- app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app.py b/app.py index 548e158..ff4412f 100644 --- a/app.py +++ b/app.py @@ -7,6 +7,7 @@ app = Flask(__name__) + DBHOST = os.environ.get("DBHOST") or "localhost" DBUSER = os.environ.get("DBUSER") or "root" DBPWD = os.environ.get("DBPWD") or "passwors" From 71bc084ff5598fc8bd45d08f32d52c603b43811f Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 4 Jun 2024 03:18:15 +0000 Subject: [PATCH 05/21] edited app.py --- app.py | 7 ++----- mysql80-community-release-el7-3.noarch.rpm | Bin 0 -> 26024 bytes 2 files changed, 2 insertions(+), 5 deletions(-) create mode 100644 mysql80-community-release-el7-3.noarch.rpm diff --git a/app.py b/app.py index ff4412f..c7c12a8 100644 --- a/app.py +++ b/app.py @@ -7,7 +7,6 @@ app = Flask(__name__) - DBHOST = os.environ.get("DBHOST") or "localhost" DBUSER = os.environ.get("DBUSER") or "root" DBPWD = os.environ.get("DBPWD") or "passwors" @@ -15,8 +14,6 @@ COLOR_FROM_ENV = os.environ.get('APP_COLOR') or "lime" DBPORT = int(os.environ.get("DBPORT")) - - # Create a connection to the MySQL database db_conn = connections.Connection( host= DBHOST, @@ -104,7 +101,7 @@ def FetchData(): output["primary_skills"] = result[3] output["location"] = result[4] - except Exception as e: + except Exception as e: print(e) finally: @@ -136,4 +133,4 @@ def FetchData(): print("Color not supported. Received '" + COLOR + "' expected one of " + SUPPORTED_COLORS) exit(1) - app.run(host='0.0.0.0',port=8080,debug=True) + app.run(host='0.0.0.0',port=8080,debug=True) \ No newline at end of file diff --git a/mysql80-community-release-el7-3.noarch.rpm b/mysql80-community-release-el7-3.noarch.rpm new file mode 100644 index 0000000000000000000000000000000000000000..157528137c5ae222501540f459016b10eaaff64f GIT binary patch literal 26024 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 literal 0 HcmV?d00001 From 5885a12e54946de1471ec25bc34e4344b7f2ae23 Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Mon, 3 Jun 2024 23:29:38 -0400 Subject: [PATCH 06/21] Add files via upload --- main.tf | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 main.tf diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..c0c2766 --- /dev/null +++ b/main.tf @@ -0,0 +1,67 @@ +provider "aws" { + region = "us-east-1" +} + +resource "aws_vpc" "default" { + cidr_block = "10.0.0.0/16" + tags = { + Name = "default-vpc" + } +} + +resource "aws_subnet" "public" { + vpc_id = aws_vpc.default.id + cidr_block = "10.0.1.0/24" + availability_zone = "us-east-1a" + map_public_ip_on_launch = true + + tags = { + Name = "public-subnet" + } +} + +resource "aws_instance" "web" { + ami = "ami-00beae93a2d981137" # Amazon Linux 2 AMI + instance_type = "t2.micro" + subnet_id = aws_subnet.public.id + associate_public_ip_address = true + key_name = "my-key" # Reference the newly created key pair + + tags = { + Name = "web-server" + Public_Key = "bsabbah@gmail.com" + } +} + +resource "aws_ecr_repository" "webapp" { + name = "webapp" +} + +resource "aws_ecr_repository" "mysql" { + name = "mysql" +} + +# resource "aws_internet_gateway" "example" { +# vpc_id = aws_vpc.default.id + +# tags = { +# Name = "example-igw" +# } +# } + +# resource "aws_route_table" "example" { +# vpc_id = aws_vpc.default.id + +# route { +# cidr_block = "0.0.0.0/0" +# gateway_id = aws_internet_gateway.example.id +# } + +# tags = { +# Name = "example-route-table" +# } +# } + +output "web_instance_public_dns" { + value = aws_instance.web.public_dns +} From 9158adfe3f4a7e63bf8438513ee3df4e9c29049f Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 4 Jun 2024 18:29:02 +0000 Subject: [PATCH 07/21] file added --- main.tf => terraform_code/main.tf | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename main.tf => terraform_code/main.tf (100%) diff --git a/main.tf b/terraform_code/main.tf similarity index 100% rename from main.tf rename to terraform_code/main.tf From 594d8db4edae1ffb89e4f098a1889a84d24035a1 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 4 Jun 2024 18:31:07 +0000 Subject: [PATCH 08/21] ignore file added --- terraform_code/.gitignore | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 terraform_code/.gitignore diff --git a/terraform_code/.gitignore b/terraform_code/.gitignore new file mode 100644 index 0000000..24782fe --- /dev/null +++ b/terraform_code/.gitignore @@ -0,0 +1,20 @@ +# Terraform state files +*.tfstate +*.tfstate.* + +# Backup files created by Terraform +*.backup + +# Crash log files +crash.log + +# .terraform directory +.terraform/ + +# Local .terraform configurations +.terraform.tfstate +.terraform.tfstate.backup + +# Terraform plan files +*.tfplan + From 7dc13c460f784323b00dae88c5352be7be9bc15f Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:45:33 -0400 Subject: [PATCH 09/21] Delete .github/workflows/docker-build-push.yml --- .github/workflows/docker-build-push.yml | 36 ------------------------- 1 file changed, 36 deletions(-) delete mode 100644 .github/workflows/docker-build-push.yml diff --git a/.github/workflows/docker-build-push.yml b/.github/workflows/docker-build-push.yml deleted file mode 100644 index f632fc0..0000000 --- a/.github/workflows/docker-build-push.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Build and Push Docker Images - -on: - push: - branches: - - master - - jobs: - build-and-push: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Log in to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - with: - region: us-east-1 - - - name: Build and push MySQL image - run: | - docker build -t my-mysql:latest -f Dockerfile.mysql . - docker tag my-mysql:latest ${{ steps.login-ecr.outputs.registry }}/mysql:latest - docker push ${{ steps.login-ecr.outputs.registry }}/mysql:latest - - - name: Build and push webapp image - run: | - docker build -t my-webapp:latest . - docker tag my-webapp:latest ${{ steps.login-ecr.outputs.registry }}/webapp:latest - docker push ${{ steps.login-ecr.outputs.registry }}/webapp:latest - From b16ed796fea79281a590bf914f0d0dbd846bc60f Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:46:55 -0400 Subject: [PATCH 10/21] Update docker-image.yml --- .github/workflows/docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 275f1a8..647b076 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Build and Push Docker Images +name: Build and Push Docker Images changed on: push: From 9e8125d84920dc373f8039203b587f076334704d Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:50:10 -0400 Subject: [PATCH 11/21] Update docker-image.yml --- .github/workflows/docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 647b076..eccb2c7 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -21,7 +21,7 @@ jobs: id: login-ecr uses: aws-actions/amazon-ecr-login@v1 with: - region: your-region + region: us-east-1 - name: Build, tag, and push MySQL image env: From 48170df4f8c16c4a36afad415c0b982b914d039e Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:53:23 -0400 Subject: [PATCH 12/21] Update docker-image.yml --- .github/workflows/docker-image.yml | 61 +++++++++++++++--------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index eccb2c7..b520541 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Build and Push Docker Images changed +name: Build and Push Docker Images modified on: push: @@ -11,33 +11,32 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - with: - region: us-east-1 - - - name: Build, tag, and push MySQL image - env: - ECR_REGISTRY: your-account-id.dkr.ecr.your-region.amazonaws.com - ECR_REPOSITORY: my_db - IMAGE_TAG: latest - run: | - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile_mysql . - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG - - - name: Build, tag, and push WebApp image - env: - ECR_REGISTRY: your-account-id.dkr.ecr.your-region.amazonaws.com - ECR_REPOSITORY: my_app - IMAGE_TAG: latest - run: | - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile . - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG - + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + with: + region: us-east-1 + + - name: Build, tag, and push MySQL image + env: + ECR_REGISTRY: your-account-id.dkr.ecr.us-east-1.amazonaws.com + ECR_REPOSITORY: my_db + IMAGE_TAG: latest + run: | + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile_mysql . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + + - name: Build, tag, and push WebApp image + env: + ECR_REGISTRY: 579349033092.dkr.ecr.us-east-1.amazonaws.com + ECR_REPOSITORY: my_app + IMAGE_TAG: latest + run: | + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG From a8b43f178ab69e9b03d79d836bdd0bd963578c66 Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 15:03:42 -0400 Subject: [PATCH 13/21] Update docker-image.yml --- .github/workflows/docker-image.yml | 33 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index b520541..404bf90 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,42 +1,45 @@ -name: Build and Push Docker Images modified +name: Deploy to ECR on: push: branches: - main - - development jobs: build: + name: Build Image runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + - name: Check out code + uses: actions/checkout@v3 - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 with: region: us-east-1 + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_SESSION_TOKEN: ${{ secrets.AWS_SESSION_TOKEN }} - - name: Build, tag, and push MySQL image + - name: Build and Push Application env: - ECR_REGISTRY: your-account-id.dkr.ecr.us-east-1.amazonaws.com - ECR_REPOSITORY: my_db + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + ECR_REPOSITORY: webapp IMAGE_TAG: latest run: | - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile_mysql . + ls -ltra # List files for debugging + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile . docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG - - name: Build, tag, and push WebApp image + - name: Build and Push SQL env: - ECR_REGISTRY: 579349033092.dkr.ecr.us-east-1.amazonaws.com - ECR_REPOSITORY: my_app + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + ECR_REPOSITORY: mysql IMAGE_TAG: latest run: | - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile . + ls -ltra # List files for debugging + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile_mysql . docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG From d01a9ad24a0ff997095242b1c27325f36f27be9e Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 15:05:32 -0400 Subject: [PATCH 14/21] Update docker-image.yml --- .github/workflows/docker-image.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 404bf90..a45bdf0 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,5 @@ -name: Deploy to ECR + +name: Deploy to ECR phase1 on: push: From 231ba533d4e7c2a43cf9a7ddb87422b6f66ff6a1 Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 15:19:16 -0400 Subject: [PATCH 15/21] Update docker-image.yml --- .github/workflows/docker-image.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index a45bdf0..5a67209 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,3 @@ - name: Deploy to ECR phase1 on: @@ -18,12 +17,11 @@ jobs: - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - with: - region: us-east-1 env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_SESSION_TOKEN: ${{ secrets.AWS_SESSION_TOKEN }} + AWS_REGION: us-east-1 - name: Build and Push Application env: From 87a37fed6e5a283fb647131457b81cfa5f644d1a Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 4 Jun 2024 19:39:32 +0000 Subject: [PATCH 16/21] terrafrom code agged --- mysql80-community-release-el7-3.noarch.rpm | Bin 26024 -> 0 bytes terraform_code/.gitignore | 20 ---- .../dev/instances/.terraform.lock.hcl | 20 ++++ terraform_code/dev/instances/config.tf | 0 terraform_code/dev/instances/main.tf | 112 ++++++++++++++++++ terraform_code/dev/instances/output.tf | 4 + terraform_code/dev/instances/variables.tf | 22 ++++ terraform_code/main.tf | 67 ----------- terraform_code/modules/globalvars/output.tf | 13 ++ 9 files changed, 171 insertions(+), 87 deletions(-) delete mode 100644 mysql80-community-release-el7-3.noarch.rpm delete mode 100644 terraform_code/.gitignore create mode 100644 terraform_code/dev/instances/.terraform.lock.hcl create mode 100644 terraform_code/dev/instances/config.tf create mode 100644 terraform_code/dev/instances/main.tf create mode 100644 terraform_code/dev/instances/output.tf create mode 100644 terraform_code/dev/instances/variables.tf delete mode 100644 terraform_code/main.tf create mode 100644 terraform_code/modules/globalvars/output.tf diff --git a/mysql80-community-release-el7-3.noarch.rpm b/mysql80-community-release-el7-3.noarch.rpm deleted file mode 100644 index 157528137c5ae222501540f459016b10eaaff64f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26024 zcmeFXWmsInmNwd0aCZqb?(Q1g-5nZe+-ZVKfMCHjkf1?>TaW<3f@>g1@Zhe2;9rw) z=A1b*bHC?4_s{(?o2T~LZ!N7=wX4?d?_ zU`H^>1I!9`>{Ja)CmYf#6)>dGC9v%Tfs51b-^0;FM zCRB9qzG~R8m0x!0vr-XHBXJ>e55 zedG^6;WH?Gci?iVLT{>#sF&#rO%<5K15A-$N;Mj^K%&_>b=l^u2;7 ze&RpQ%OfWFi{ad!@N+1I+Jj4h(no#rC;mU|Q9R+%Cq4s|LgRsZnh$sZD1Ov`^oI?7 zd|cAdc;LyNu+U$OWb%Y%p%ki*stTo#s6MJIls@KL{t5d(;m36YwTBw{g!P~J zF;My#ufY@lAMqPM@pGZ{(cYuqNB#0AZ2E*B*WIJO1(ZVLL3>&+@K#UwBa}YI2Y$j; zPuThi*FIs#CtUx8Ay5h(585!4KKl23!jJiR#4n)~8V}k!ls@|Rdg32H@x7n$?GyHe z(#Q7`s`L1M;wJy)qZ2_Xj1=I1+T*#iP{bo?veVh!{FLp)vC|4q-%5$pjq>*i_a z4z_w!L-}{Lzn)$H8ukEM_&hpd135mRT zPF?vW*Hh%0e@_#jjI)iMGZ^e{=WGKM`7>x%3r{;oD{&VOkAJZu2GH{HfPkH#@-OY& zU7Vf3&JcD<=y3$Fg+N?|*x9YXFWLU6|MBT)=j`bXaCQN?TiQYcfL@N((CHC@HnLX* zkAHuAp)p(jqw!kuar0Yof_Om!oP1nhOHM0ZK7KwfZY~QR9&QeP3qA`AK^`kE3vTG< z&u_`k2LfAwI5|1MU_omz4^$Dr#l_1hU}b5+!NnnH#U}t3;D$XVC4Pyhtt;{$PWb8-m?SXqI1 z!Tf@pTs$CNYkolvs3Cr9UOqlc5Ql{T$Px?!f%yb@toS%AxjFuh>FExAX93vmE-nzj z|9JZ!*Vx}Pp3TGElFi-qaR#C1%zs>e7YxJysLc5Puy&yf9SQpKq5Nz6zuSYx;Am&T zAm!rZ>JIks09(mISE(w<3GBfLc;Y?wNZZ+fJs|(=QwRAtx`6%&d&q-cg4Nx@)^^_i zq4LC5@X+^Ve0-^(MGZF_2OAG7CxC~IkB#FGeZ2FsaY66@as6GS|D`VaJ8EA3|5`CY zHF?-LIoY@$-x0MAV{vD3!{}CV1DHi|{q+TLeZ}`3ded(^bdP?D>jF1BwD)Z~wBts^ zHPbo7HB*;5G=qCPG)>sVH31vq8b_TSk|0Nrho^-*$O+_Z2XY1~ft;;C9v~+lpoqnP zX0bW^gC+jY_fZU>?hf*>1vx{2+F%EFJ1>wUP{j4Aiw*MB^`8{}KYRRN17d*x&B6cX zz{TnR4>@23>bP2gAb*c{;GgXbXzAz)Jzm{`0?-|hlMiU++hG2N$;-yiCip*( zMcT#E0XpJ;2Jo)~l?7WtH(oBze_?Baom^f*v-!t3FYiB33!t^TixbcVVhgqQ_elI3 z;A3P!u(u`H6#@i1^8HJUkHz2LBJNN4KrcIpEzlV{Fb{~krzOPG9gM;XRQco0!^P9x z68y)Y2hh$L;_}!3KfSa5m0)|c`7bV@6#x(_{G@K@{9khRFR~WUYRuE!@loE@1?mIn z>h59%jpMN#{W~8}VHszTg(GzMkIP31?DLPr0HFsJ(DP|kLQ?>IDldV~&{O_zX8t7X zp8-F*`M0ir{6YbBV+Z}k!VY?{{V62@|4mg2R`tX zt!7wlTy59^e|jG4>OU1en-x2NRgDYCY6E0-wQ~gnS@ocWJoN6$!YXYhtEQ=~AZuWz zrKY1PB_j$Iv;MnYpqcl80%+B5>A(t|4G7p0`l-MQT^=sbYMYhS6$C9JL_IuQp(VGq zH5kgV^976YK;5{5EnVELSZypVSv{c3%F-74Q2+$8I`Ki7P7qILu&52#8CtYk0xVta zTmas_0IsKM8#)PAwjc=Wp9-AS#`*Cx>Azfm^DLnyrJw+WfW03-t^WIq-7ms8P?xH4 zk5t24B47IzRO)dq{`|J_@Ng>*ea5=u_tiIq)|9I^XnC*zN*EkyCv{T<%Sw=vW`+rX z2z?RWg6ql?H8{TwQ{$Omj}nn-8UC79mtmla&%VtM{3aC~kbvL4N@{@b3=z2m(l=GE zs`D@^{TaH>x&6tAZ2|zgAMfXgogp6U)F?BaK7mhB!g^M_$And^{C7AxH_scq2wn;~ zx3jE|ufOLr{&WWh_EvdR?mEPpdeX&6bqA485s#Bg6Y;p-1wQ z<^|JqS6r6{g4`}AdDtL#sC9VrqJZ4i!^2K8d{R}d1yeo8d}btxkso&V&12riF7l&$A8mAq`}&N4j48p$ z6*y$`fQ!v}8`MRLU*3WAK_TP&&73=-Ouacd*T8Fr&$`TCz|~_IExpY6OIEV-mYa># z`AEOx`Kgmds@+%mi%~KXRHd+S(oaX$KV8SruIE*eO;Yx=pImabrj@JQ+!xH|=dST5 zJ31w#r&x-un`xWxRUQ9aIJ3KQCu>aaPCiIHo`K791i;ojsfAn(5%CvZ(7^>78 z1uXb)oyC4e$o{0|AdwcHrngBz^vfe7MDI-= zWSA=~`gm_FIHu`kyLxow*Nt}pYJmdtS9k)Y1C-@aEKG;qE?7&0f%!1_7U2^%y)@J+P1v6TRO%%@3k0&V%dtdF9PTt`vy z*#(kSL2V7+3am^mqKxPTC3i(6z0YW(PqsJw?^5y-@7j9^ceB#=BJAO%pcJ+Atgas);K+gR==+s07a(ai9-cH>MJ7v*w$Nm1cT6Y znc|~am4NuNC}`?Ucc5;Gt!O^ZMq1;_R7?dR6KyN3i)FEmIMC*Gw%D&E2`LJhFiOhf z!{jv}?!FfstmzuDCI2rVQ`{lpjr>&xy`H^tC8On(chTKYaSNle*bw2Ebwr@yH11)M z6%hlx94ys^f7t#a3D~Gj+Kn&ZFeomQjFvtf;(QG7ojB+8z^Cd|e$nSsLrb{S$Kc|}P1916d z6}qTUS#x^y1i&N9Ep9$vzl@cx6YJOSiIr?X&D@ZWeD4U0tjArW)FF02n?~uza0pF)wMb(Bz7K&3ubk3P*eSOL_7aMYPBQ7qzFH=Vg+KN2zTR z7wH5nyYRWXLZS}cM320fh*c@4MnFV8fZ4X3*rP*jWn2E0b3QRP`6aLDFIdh#+azS> z~t!EdB5i38rm&p2#4P}mp3cmxwMs3q`qzg{J3nCF?;_f)O2#|Q1QGW+9 zb!x>Vnrk9VO>XQuUL^DFAvyL4xns;Rpm&9L=wHkdE4Bbs#fg|Or4UX$)xGD|+PSNE zlime3VSPlmYf6nS)INs2k7&?rjIxRUVk{>#ZE!P&j{8%BgSBK+zidINPCm(VKnQhi zZQoZp+-%M`_hKMv{8zyjS@X>ubrX_hqAQQ*f~mD(p894Xn!MrsRs*aud#0ZdSefydW`S>RfO%^j+!VLu0j$C}!|)TJGy#=v0b~J5n@K z+08x<8ZZ^jW^-XSTr8ZgIWUsa5g=bq5zsrd<9!$CnC3P*;AL%I`py{locQZwUK^F9 zWhfUQpBgDl=Q($9ZW2r3fka}-TiN&%tqkHgY!5R&+)mvk!g=1?ye~a%jhoj&i0T&I zyMi14>2bVP-DxC*0()L;w_IfTqkB9?)l1N^0nt^9glC;yKGtT_)+m`@Az7@xg;nh9 zZOmxO>&04a!tMQs+g8N2*XoF?3GvcT~rB5~J6MCGm>O(nY?yb$P_UEiC z5A~**+}{q6K>_{a5cGYWN^$=+xVLBl2A>t0_S~&Cn3-9=)qbc42JJAQ@8&*V(A)ee zaox6oE7?YD1PEZ%zMOsg0^QP{!SN=-6(^^S7yBb$>TzzOooc=wzWoFAmKf}AXZ?c&{^=E{+(uE3D(Ct;Z*d*gDHWAYq7!Znq=P3%twHx zp_>>S?@A`o|3@uHh%JMb1@uvG66z?>lj{M(uFzi{;QkHRrln$e=7TcV!o}=a($p>=eRv* zm=Zx!u+EWZWA2zWu4aW^VJwAi;J}XCt%E3`G>$dW%pQMxWNlFGM0zkGJr+D&_Kj$f zUT($Op0c=Nx&A!jRB!m`{hOIhoy{9yz(a?SK@C8RpCm|{z+ds;Vjqt7Zo1?P__J^8 z%#|6Qj{ELR)LnrO`I2(6P`hi~wWQNZ<9vZO^@mfv@2UP32{OMbzl!yD8})_0qQhPb z!XK8seP&a-fo)dMdIpR?9Ou?L{c0IwuL^eDdi|>=!OH#wpVf(axmS&y&yjPJhc;)N zT@D$jbR}c?D_-Ee8(BQ0k|Ww`Pr0=>z#yTCE+v)E**E&A}j7m$A6%%QY zN`JmHT7CsP=9VZNy;<>10G*&?33rL_%24;hg}l*vDsnJ}12^=hh_`eNUtV>oM86?Ok-q14 zYRuw?!1J{^4Sqjbs{O>1%SH?WZBoo#VT=I-FLSLF5!i+%@i zhI5fb<;_n$TW)NQG~>zG5coFnMQ}hZag%`O9`vnnr{U!<@Ky{TfhVo7{=4#*Ry~sC zs)T?j!B`-+v&3g)Upleu1nYV4r8Jo$`F^tIVbpe%(XC$(PFD#(t}i1!4@HVe(_j{p zEt84|3cwg@2C>8$?|Cry;AC!t4#IVhJxiZE>1u$4@c20hMVhHRN|Yg(>jx)x*qf9N zsHID=at&A3yCMdzR3PE`z30lY$hIAT=6mARi{HChQKQwr(<(nl_u+P;SLO4yd6L+i zCF_JN|A2+bcBqa2RuM=QJ8Am~j~Nx{$4Q>*BX#Ih)Y{;)+*RrQmW7lHN0m6hmH64a z@rF-bJ+OL*5({KDM)N)yVsgJcVy6)9>R#yL8dK|xXMOs*jZ7Hp@1CSwKX;hNaLI62 z5aJ_{PIQ9=UY2q1k*;KCfV@^yGEv zCQRsl4P%)BZG>Kh3@$(#NW=du8Hi`lG&nz~e`Vl$$1I zhhX=f8sg6R(Hu-NeZfpW>C4K9>8M2!=VvHv>`Qt_Bjb*6=OwS_5Efv{Z7TOwu9?-e zg5Aer(`r*`^RIaoe<-1{>;C@f0(Se5hNt8LoUFg*%1)O?35*!3X=iWNz0+q~zKv<> zskjX7|J1704E$8 z5_zUS2?fr{YfhoKyDeimw4MCD3We5{lwSHf@sBY6g)Xu2W4VC}$m8Ab6Ixh0zOnMzI*0@LB>?#yHd)~%?G#BJ&+tbG%@f=y_wE?!O z89_-w()f@mgaHKC=Ch|(93cWM6a=JHrDv3f_WCr}IPpIC-J9W=y8yJsT>Fk!pLV7D0#mw= zri*gsPo)y`tx12Oth64J?h}PS_jc(%u4Zb#z}fnNSv?+3hQI(b*y*!NuFv}JnSJax ztxC>Si8Xf1?`IX$BHLf~bC!-_RwagH8&d+N>L$YQYe?w`H9d>I_=e7G@svu{OXYmz zOrctCEY!(I#$zqiJN!@xo}F7-MGjx_3jp2iy=gs*eZ7P|gQoMgb9cyltM_mhKi(8@ za8317|E=3YHLvHHD>_%t=uoby7y7H{BG2ZR2+H3E0rmTwJ#yqB;~X!#(52S|lS1-! zSX$0r)xX$$Nb{H5^_A(N`4qi&Sj>6xBNyw9&F61NF*v&)Eo@h^ITj3x+758=Er6y8 zEQz6$-#2?Q9^60Xq>1&M)7?3^cG3lHn)-#{ zgVh1(R>CJC?z9Br3I_Z*@wF0EQEIQ)!+U9Em>`TylQJ+%#;BL4EvFD#{a4|V0x?W1 z;jRk)Uoejhy>d~b(`@h&xjHD!KE)o!Xcn;N=UF9A)L;wIFsv=gg&Zsl!YMxk=-P`? zeP=SyRP`MM>og+bvP{e4TXzgzH`Ur`)?-J0$?I0{&S~s+csr`9z*!?)Ujv}uS}s=u z8=csjskodG=->>*nki^W)_SU?ZqvheeMG}U4mz9r1(GKZ;j6BESC7&yN@9YsTT1jH z-V^Tnvl>c33)*5^8c{rukeT@<{)?VYkeaeRhn~RC9~~6NY4t9%0hB%IDL9`lyOm~c zlF4vhYiDkcriDweJcx2yE#-D1SlAH}6ed~=y!Aq>7aJu-cpkx~U&zKNpS+Eovzo!% z;F8ipZi3l^afMfNOcRsS4^U{C1bL9eEubyC?E+tTIyB)OnRDq%NGEJ zw=)v^%Dbtg$l_LmWVV5W{iJb6Z}M3f*3+-K z`+x7&$ay(S&L`>aL(1t{{j_M-laF@PU>4j@P^U7t@rq;|;(-RcR;OA2ci zh_p6^QP4lYdX+6LuyZ{(sv4oO63g;K`ioUgUVRuSAEWa*4<;hYr9qsi+`>xo)C z6^6QAUr-X?*{5zAy>KkiKL0wMApeYq4G6@-d9`+IMNgJgS+Z5O_vqH&m zV%(pTg}LjpGrnkwwpM@UEoBHp6F76gjia-46H3y^_T0bz&dS-J0D-E~ANA7L%a6<3 zqku5I>4lR!$xt6De|4k0F_iVOGUC-UTe`L3BKFr%343UXA<+C^v6%{Ime(+Vk8!|LgCvEi(gWF zKNYDcg9Wb2GJ7#8Y5Ox&hx}nsv+GQuR7?#d{7gS;lBd+p;KQaBAh7x8aksn%$ z7o+0^i?~HwGsU16+yy)GaxCt0iam>>2%czshPoZXC^wyXnMR+A$NLWout+` z{=7!9fxKm)_3?SpZTK-P{xdTzc}~UW5~H2y?hRwgKN5yb)7^z8)gj#>X?PN7+?vm` zn3m%x^Qp$*ujt<54zwYL+L(>O$+}Q8y*eu&KGhj$CoO0<6eT-?WiVnum|}9T-&_f# ztyhJ_J9w2V-N@6#zhCE7f@izaF%9SdAxOAI4v~AX9afCZEEz|w4u1a3JelLRk-U&i z&3zIUC|$E^Vp>nF{Y(E`Z&o?uUD!oOLG5a@L$L7{kS4|msW9lf-o!|lZV?al+wFMOV z<$Akl4V4M5!WAUhy@q1K$#m!7$PcfDtovELm6ewP-t(LJB53W*;8iNE;e0E zwN=`<F<7wrIH^VG}0*oIuWV5C?{>wx^w33@G=sY=Xj4! zCzy%eX)jKQ6Ze+Gti3J}p7|y>ply;*#zBElRwqhR1stSUp&v(_CDi%+MaWi+j#Ri+ zbCWe5eieiCr`C|l#i!eANi`!aZgm$dv8-e&^FZt((9&}(@6UvXs<*yg4JW_jGQ1Jf zEDypaOJ{W&P{`}&&Ur^fy#~HCKa@w{GQY*m<5r6BX8Vnn+(C{-Oh;iWztey9+SsO> zR)h#h={;ht+c!YA+l4i%3VZj=e~l04)LkiFz|J-N#JkufW~98!1BbZts=#nsQj*o@ z_nMmeIcYok!ezab8-`#tVmq)Wadrx$HVc(TESViM+sqA927C6BZ8+fy(5pX~dZrZH zcTxIcizGf}HRrql?X(b9f|8Q71_4cZ=*0Q6Ltag>YCjJ)_8FM? z{KG5p&co~wwOk_|(Z05EGkf$Gc0U|jKuWYH=uR%dW z+-!P^)6(Ren{8JLv2T5Hwi_~rsI;t^W6d~Kxcwzxfaud4Gj?B0r|7nESMPNIk;|J0QTc?{FUUk{!69ZyN=x38^E!>{zkrGUeBv)vN7BGR}|Ti-to)8*2IwR^bAnKvfxMd9lIduNMADsTD+svN+cO zt2ihA_~u9&V%YEN4leE@#DZUkOB8i-apF=~A)DiG@2y27#C{KH9fjwQF%4TPxQ(Wl zXl6H?il>$kQTu=OsnlIO( zD!f~%+ru^cxn{~z%n;Dn6qXfE1^<^#wZ*fr)56jiRjeHm_hfONn~uF(1oU*aIQT<; zftNEnumCnyxXkZE=YD1MKNK)Nze%U}?Uf=Se`c?}#~yUQ#()Gno_)I~MX}k^`fj@i z_Y+2;uETEQl7U(7f)K6CHAf;7^+UefhP*_J1k49lpN_z@OT_(@86OK_lyodh4XbG<-7@ts|;G@~iLXpPL!u8cI{v zZY!kw@YuVW%}pFxuwh)%^SA+U@NroLICRbI5vtymtcEBP98Nf{F7jw2wn)<$4;ew^ zk@NR5UgF}f)ADYS;4$B+897`g=rqZU&wu-)XO(}uTXk6jrq8SV{9bxhhiVEczvE;v=R_Q-HIf`nd|wXdtc*PxLeCGJ7UK=jcY=% zAJ{+TfR;7(b0QSc?VVFaB;H(T^WbczR=<)^;qN+2tbXgQ5sS*rz^=;}X>yVHo0?)FIh{^cuV48IM=gNE@w~QN|I;iD#nw z&+5gqTXbcVm405xAjg|UozwtA%k~yo;Doo+Yq#3&?F;GoHaJRgwb=9zVc?2YHCL`2 zs!i1cjX5!2f)H=8;P!iSkxNC!ya>Nox!9g58yIg`Si=n|MPN+%Re^RskS?Ma-e*eW zR8TG&xA~d8*w@4?L8#}=DgIAYC%T|TX-dJZCJ|-1%3A^3fo}jUc~wh3 z#Tk9Ml=HGFGd@O?3C&O06&MfAfqLl8aS|;H+Bx+VDBLi=jsRPVv$Z;_7Y&r6BjZx4 zO&}i3dJT$ihPXke-GV}n=Y`#$ha-_R6hbSmB+Pso5zxo(Y4!>w5Z;jC(sSB;$OC=IC!}g+TO%f2gi_H7V%}pXtIwDzsnoY{ zX^QjCm10m_g<5%z9FYKRO%4$s*=2Ykrj4Qz^^s|QFb@Qu*3!_%pF!Nddsv#RwM7WR z!bhdHk(qxqEWC2X`ZhN@emUV%yhCpTv%=#h{!Lctz`)`1NZST?(89`A)8MP`Xk|TC zkXK<5^ncXWUU_#JKfqsoL(O@4L#m%7K&2@)t?-djg8OzWtM{()`#Vlv zwq=QV2GyW$xpwh7M{}3x0;KB2&w(FY4joYgc^7S;y?6zSPu7sLS3+3LchE=p>$BB( zW?amd(8wviw@4nczdMIaG(J=jJ6l?{2@u;F&hgia(C)wPOnv6HT_;-aBS-(Rb~KBb zG-yQiT;$l4;3BL1c1N53knaWGmyfF-xV^RCso*R0Y!VB*8t`z>orXy1)RNO(9Ncw_ z!w&d-a|=lhIo}Vy-o+~lzm-=37NIJ?DuwtN!Be_?vwMadEXnNsI=6woOv&zUIpQLk=tsor$-Eda#o*Hxk8X8~@8QJeT=EL2CyAy&zcK{pM0!~;*(~wR zr8BH(JDkzIt5$8fxxqmkR)Z~T$k61&Y52w7Y)vDjJPs?Gc?xTEm>@zZ-!JSsx{oQU zM!xnMow``xBVggh3#}S75sW_nnv-;B+zDm6(;ld$$7Hzp)KlWW|COdm5NB$lrjF?$ z$K;q5e^Fda{l#5@ADN5sbkE)zRy+64(gcAl#d>#!kq1Pn3#98;MVBLWAJpsX4#KUM z?moj|xKS8})p3ij_sBBjSA$sCFA$N3YNmRlGaRj*H>4g@;7!coAh-TpGH3FTM zptn%M(AOfPlM)TJVLp+rfe69Aj*FKn+)M9zY*I2=h{`lR+l(VM-l_JMsFnP#+`uak ze3{lxdLegCP6W@PKF+o!qaisNPODQ~m7hP`dd<%}nI{%IUUObeB3hAeP>_!?5rcN$ zr*@ZUTQtNFkeD+z5X(L=vW$L>x$S9#-!2f~W}h??elbP}3B2R~%Z^WrEw}OeHKe<}OJ_Rg3RDltTY-n((pG0Dq5b>#3YgTj z9>RIkJmrV^5*@s}z_u2Nbm!L;2eCi#oNb1ASOp(?f6eZ6$z`8B9=P zIAiWbqB^t9*RVdzK}0*>9b193_YLOgdEs*&Mboixdl&>GAHTW^hMwGZqN)~V5Ejf3+etF zu3ew^b4(XnX`66W%?6gPm zT~$@DxR)wHDJJ_p{uSrSMKthoKGiFd?dx({&ZS34E2<@JY`GzFn*&o|oHv5>Pq(g! z*beWIg`?IXlj3=2GC2|MHeQJDhi%J&QsV6$ND>S#!`@JXnUOj6BG6ul4Bu zFv0dVFxVVBOR20PWDNT6a{?Z?pZ(mXX7&l$Ns5>~-?r7Ys3)@DP4eb0vd@v*8Grij zm1=DD$s!f=`gH*7YH#UKS``jX<|@URaMeMX4Vc^&JCt0D1ew#~l6Tf`>RQ|Ns#4C^ z8BkYgwa*9>)b2tN64CR+bQiO&Lb>`uN14?;s{8%(iTF5Jh~%q&5@7YotKqlA?9Z7R zs0g+56YSm25~#eg>wi;|L?=gFAkS}Hv(q83%UVkHB#%1hHNN5!0?2?isk;Plj>$D8 zoL-K)MD9xdpmjsr%EpsvX$LD9l=vr?f4o2T6IwB>!whUz9g)lMHs}#~%e+QS(?Do0 z-miGbCWg^Vm%DIQe7aTP6ibaOODFa5LcO+`?^qt4&&Q6{w0fPu;4KVkP8YG&m55}? zz?<3Z-!Dc5IQN;~Q+Hd_ZY!`Z=7lL$ZHRN#4{DNafROflIfdVqaw7S0J7>d#YAL zp+s6*W~l94wneqrxP!D@drUOa}?~^W1pty=R8y=_&2iyYTfWNT+FN z?T4_0`~KlTY3^JFjs^Moud4I+M)w2BDJxTuuPrNiduIoo<ux zFEg4~uheVDtBFcs%>3^89^$eKi}Ja^Ccc6pX?(uymdDe9^iqsE%L;&r)TC&D-MD&YIksWYaq04N>5v%|foC0GI0)4YWMw;`&j`^yw!o;HT?9t;qnV|t5adTldrAj<|=vYnS-WT7*PZ0xqsv0 z`(`BoZQo%n zM_xkHeV${6?@_LXJN)HWkVs|thX|Q?q9mKvW1p6+9Eq3%A|BAI+6I$(36w2cDVPFX zX?)MflLb=wE92GxAKN9&)#7BX-#*ZvBR0w9XHI5#CJe+~cV-W!C3cuWdk8fo3BG8e zYW=d(;-S&gfmPuW_+9vhqYL_&c@;yVt0=9!v2l3On_DbVF<08s1*8wfaiYIId@QhD zV-+rCOi5%Zcpr1N!iK6L7yd@3V#3Ds^>=3?oWh3_5o;+pKYQX?utot*^cQ_u=iML_ zKbS39aPQ(|DCVH~0tN}e=Pr>>>8XU8ou8Ju4O2{jvgU7Rqk`b@Mh-5+7PVwW#=SYqhX)yahe@)&Fgnn^>SE9QI zlI-v$i}PhoMLG8kc_fZzj=xvNrJCg0O?NeN3p>0?b2Lf4m0byTNTr4~ z#j%FbnDFo4l?ZkxrFb1581jK?!+x(k&;KZ=yP(JvHB(TfyHTTwm`Q2cZO|Hi39jm6 zt&$qCt-jB)dlCUYME4_#F)CfAuEAQ5K*DIoF!Pu_K8>p|EGP;8hUv(YINU!Fh3-UtjG?bbEBYqK!bC82#dw+x%Nsi@f&gsZ z;VJWpMkfT1k~_;FapgQnej)JrzJGCQ)6CcB@7{*LeqSu*)!p1IMS=QaEso<=xUTN( zyDc$i^6reOV$|$snD~3Pr{A*khGU#U4i5V+#RiH2qxa`K@I({Zs11y13M(<$6dQ8@d7EEHnFPo2c9e2`JZJ&A^Vt$zn$65j zP4NX+u^*Tg4Hw3dUVUw9?Io;2v{vhL%0tSV!OqhG1`P>?Yh~GywmN0vv=mwhO zw4{FBF|`Wx5RDvFrHg-WZftK|wxH(Vd3Ew?ca#wv>R6T-JGGD+NNpRPw~^c{AC+hH z0u)iL${#At)R%u~Rl{lzdCmHglCjY6{b#XbRm+xL#Z21n(!5F)ZuGabmYlBwjb@$K ze{Uz4R&DRu>bIH8lUdFMIy6x%iHmxNrkG$cQcGq}%6np}1!5kyiy8i^!eV?tUFXQl z%2GMVPb)gzn^i>H>Nfpg2g)?@%Uamow+SZYK z(Pc-O*}L>Is+d~TPTi(QW<43e*UZz*voMhk(db!w5W{RyULda3#3!S8Q_$)eftNOT zt=FJn`>Ni<$Q|7|{gr~*fDUbgTZ1Ip7Yf~@RjvK+#o2X|`3ury4c5OsiFmh;Y-Lai zdpx8$e$IX&KjRfx9MQ%rCzFjg#IQ5^41AZdm}I72t)f?-tlF)U%4obQ=v+n#jFkB; zCdapx$X^l&BWFHZGco0eYJxMvNXqzzj)tz!!bX+_caBL&-M_I{?`o+5!CT2|buU#c z2~>s5iz+nD1Deh@ffSkNpUBE@CjuR>al1#$(kYbh;=zaWmc9;om~@F=n6Ne*?`F-( zummg{u`(gp5EbOHi{`Kb@r3}552hED2T@o{$o_(j7r%}9Nbqk`lJc27t3gW3J1Gw) z!UJ*RXcbH=s-~9sgM#_9oFQ_v!{($ps{*oxSIk2!+aFXX9zrqDzWev=@h-B4Ns|O= zpd8(<&-$!Xwx!MIm|W59dwXlY;qkqOrTmudbH3qw^!{6=ZU{zMv2Zht4Bme39&W$v z>caDi&dAP@sD&XD7q5x;-_U<-^9TqmI-LU^6w5vD5!qYinw)2=mr^wN1_Cmo;n8z~ z`N&fGD2mVPZZZL1nyogO}Q2R5Qv3gUdMpFvZ9@Pw_YQU;9(^=ro z@_a&VkY(w-6dmA0l@>_Ig*u$3S8i@ni&Ah`#QM^Hnsf3;;Y;KNpMq!81n?n)pk9p( zQBZNu?`-02vs?1kN*Tg6K5CcGlT!Xff85uB4ZmfWtHot9Qp$K{SL zW@m<+U#ok!#N*(a$C92|NmrgdNmWk1K?hDoRO$ctnWqTus(ak0kO&DQT>DwaI7B&k zS&UZov%^5U3fw1IWr=j{^)_wOdX0QfvD}6INEVK1ZkFdnU{*l`DT+I!fbN-y$Wuk6 zvkW2H1($B-rRRgr?wDOO7M6~IMn|ddCK&`i2xh*7WthMX>KTWvk3c9W0CZB)Wn4Q% z9!2FL*2;HO&UZb-KQOSE$AUdIJ;xjb+0}kCpKzpzf&=~{R*WT-RMF`_eL-N8jp85{ zTA3l^U`;7kz6g<=$2k(>PfJuU0q@!7$&Av^I#`vpM+p9m{a!K@rHr_UyXO)vIvoY} zEk01dRCahPO%1fR=1EY^B1yO6tQp{UP7gEb6)gY^?2cT~7F?R)@duWi`60Bh&G2=h z;1V#A`kZCHJbT&Z5z2WD7h10G$|6)PRDWQ#6naRPrGaua@}j+5)On{g1a=j;tz1>) zsC+WSlhxOJrTX%6oSimcqj=$c3K8gm2zNVQjx&G*o;YCw-h)=;ENOon_Ic`ME`ry4 zSx;%!H>opcE4VNQ=Ci-i5Zx#>7)hGbuy1OF-OF0JC4jVp))+R{L<{oFkbw|Gg8TiD z$(jk5(k90R*7t%~!$y-|kvS7sG;L&D1U(WGbRkC9$OCxmWp92*GwTL19h~Q~7s9b0 z!oU5s*`vqC=4`Y0q3BB-Yh5WZ%$DJDwgnIUoNU&1|b}R*lNY2jaK*P?JTEsX^ zoeb!GfbR!88sVQV+sE}&>ZoUn8Dr=Yk3Eo^*B#JVl5a_bWOG_6!3DIL4ceMlFA#p; zW(wP@RRuAmUWl!Ei{W7Tk#I6<3e{WmdR`@Mqh^6PhRT9|nxCha>|+mK-gIl_`*|9Z z%Lx2T1uY?RyYdtuk>h-q<#yvNSVZFD3{FUhm=I1O5eh25g`r&%8De`sElXo=F@5xg zO-D6m^tcRO$@*qV850*1`%dn6@32x!u;6^l_=BR@ni}rrxp*s}fFJu=IYE!h9ZY~Q zUg4b#$=5EL+VR+CpO(pclQ4U*%#lz14h$7ZILzHWMs6adn=`@-Gx;2fP&dM7Mzy{c zbRIFeEXu8v2v*3$DA)$mu_en+h|w~goRx-}{o2I>WJB|^GCr2*Z){!#?tgzbg=0o! z6fWu@S)0_f6&L*r)<6qriq;sY_NrEOZjcMs|Mf%NFxzuJi{H;K2e1f!oJKTWV09(Z zb{O$Yy7H#KK|IwHpFQJd8Gms!3P%i?Ap|(Jt&6_JZqwF62Lv^mu9VF5@eH8A#EvJk z-1-0yf!b?HCAuh-1>m!5-{$t^=LQ!s#vg?TK?*7(Wu$+I}q)s zRVxdQ(%>xSvhh0M6m}Y(Tgpn_55XqkK(2fPe=Nmlq)n9W;wZ@PZn4Pl?E-a-NS?!%}V|=Yl;|wf;7lDW)@DP`BH-mUb zbaG&~MXI-wAbz1SUtR+H{TE(-jN&(lWgRuYPGry)0!pgXe`L(|_%>8nxmNlq-}osi z`dZV-NVn|VCZC1huKdEV!HYDalHGnWgg zx?W}l5c_@?jq>i^3~Q|S6;6Fk>Z^wQZg;LHdRyI1Q*66je%HZ?_|&S1GJihyH0liT z`sNobfdI11)iN?#{ zeNB2V_D>HqrFB)!{BvH%AJD$V2~lS3NqwR>m7sKUkc_|xHuBWtLecxYMX2JFa>3A* zeWm7%^a<$}Re6eZlOxW4S>Bm+^@`@1+vOl)-1f7O=*%$Kyd(#ysw>Ef`Dk{FdXTU5 zAUrM{gzzF84TkDjiM+j`^WCS`ESxL|-dE1xhU>%qxMb=kePV0A*D)TVA7lrmEb=#3 zkq4Js%EF8-dBZt|M{ZN)vWlXsd2uwJSG;XRB{}g7uTW5}$!Bt$P2s_Hi?M0ySS1cl zmE@M#+l{GLD|qe1t)dJchn>xnFp$=YD=7p%QKw$f3R~x!yO3sQ)Ji}>QO#5lsS}3B>HkjvyBS30Qww}v{Bxn? zkhs~m0z~|Pv0Q*|MFzs}`lZg--PbL=AD=dX3V!a$KxqbuVyUpS##Hz;MBydhZE2XD zANu~Q);rV@q=9lsQX0CmeKVjQbn*~KUlFKC4m*E|S z458+JoWE!!cKRkg8#rB1`6IHvwaN0YJc_R3JfDZR?!;l7D2V4zTUof6hz$2ES4fe1f74t# z+~C5s@v1pMe=-<(!QS#_H8EN3|25X7^?)nk?A>w3!9PFjQgpgSfXLQLjZZ3QQY8L3 zCZKVi-#ytQodh$AgdBqK^-CY6u&OF-bD0a%v7n*v6m45H2Dq8&v|z7zNn4we2D#MA z-mlQt|HsQ#_WwKGUtf=nP60>e-Y$c`%aVDBjqvo7gfB(K#5g|{doyNBvsYfi&czC? zm=)-y>&c!(sAWJ;ksrgMGeVf}40tq^LzOq%U@q#-%+*jxf&RM>u){rGuEvPR+c`wW zW{7dMR{F0=e(MQrfEYGj@sv*fy^Rl@Y^gU=#kTkNPlApnJ%uY^f*CQ#a9xrU?+zdv zB!^@p(hXvzCaNdxSQ(81cCov(9Tfcf*)W?(c37ChDXM5!in@ECmFPa(ZmhdKQy`#T zk)h$py_E-eW0>%y9Pl(JeoEB#`=vIpWy0!FwB;0hTtS4yOdj7of%o4iV99;z4rcOH zc3xSxb=TlnA%})U&O`3>$JZjKAw|h$VX1pO{i0#`2ac8xp$Kk^=guNWEVtx5LbSEVdyTfagY)jy_RVgT0g@hOnS1iP7SG4Hk;Fndbk(4q|9OYg~ z)S2j~W2GLsqOA4O5JdCz2D3>F*PtC%Z~}J4b+MW+SiYK1_i?q zp^L2SX_e;(c(4v_lIzD*Dh7D^6<%rRU8)Oi0}#hZGs%mBQ^|<+Z7eH7D-p5*e-wgV z3v^VXzqkMbt+72%eS~GEgQeYvA*?IO7c}6Ik@P7wuKGc_2r3}t*l&`6_^_i{o>Q{} ztts8<(zx6Z9vpiCaHSw>Xm-?q$))ZgD>#cHhIbFDji(w_hbvCV-;STF>pgJC$rZ|f zFk-d@Zs_dCc8PLZ2h#|K>&9QsB(YWJ6&PB&1}`=0c#GD?nDBE-TcXrg4350q1^qx9 z;D0WoNWe>@6a5BPKLYXOIk5(LXVt}d*7FC)e3|zlJ;>%&2k5ho4;1!S^^`M$8UdRMYhFD_x@`}6}MA2O~15d6kY0P&dgX?As-YpnXW ziLaOj5%N}nLPJ}~)(`#9x_G@0eS&;o6!lsT`&T)WE0vFM_Pd6ow>L&NyT;DbsMI0D zARz7}!nM|>4q~UYI~Ptx>6hY1`tPY1Y3;1DHh9DXcohC5kvL*fu}i}ass67wU>6E` zJe0g<1h=8Q)SI2ErOi>KOos&D&0*j~Cl>83!3^v{PV0IZv(pZI7)-3F6FT=ZHWRO! zcFmU-C9KNWkKHZ~>JL(=#K{hUys8{`N*I?qt`?p2hpj=wvx_gx*ZA%AF}uXRlh-xp zDy1*pD|aSAYdJ=XIvc?Bj3Y_G?P-HVQ2q*iup|hiA%zvouYqXSQNZfoF!rn=xjoo`GQ}1AG{+uCW$N-7$0$*BKM}MwsX4lTqzo_9i!}dp}pXGRiDf z62>Ek8R(~xK7&6^3W`dyHtmq09`ggIDJCLQ1k8n+G`T+}0y7f<;mi~E5;s?sYQCmF z#8WXJW4IHo7Yz^j@PR-yF)m0nTgO+N4AQA|M2U5ts{Y7NQ&p~ALjt$)GD}G)XbSpB?HB(pY2UL>@BEUJ=A4^wIrG#ftt(;~%8V1~6DwRX1o z+j)p(k$LqCH9%Bsc2_*Fw^{9Dv4S9YZAe8<6P-5BPf@A+GfBdcL)XEQFvzcWl~R#6 zSJ63kbsDCQEQn16s@u6)h=W*5l_8m@6F*bkk)!N(6ozS6 z{<9XkxMQ95dw!;C02b99$IRf&f1d!jfpwONbf`XK_`ny<3ONnJlIJP4e$q+{e<@&t zP?@YA;Jjoi%D^#WF-v30`(lfhOE{L1Su3=dUvL85l0i|b#Fp&n2e-EKc7o_z|k-};Ja4fP@{RQ0DV2*{Aa&w>QC}g z)fK#%k;yV-c{Fwrn>Py%I@Kp7-c?8=0)z70ciE`v8d6c*3ndEbIs-F-L%pO(S~nI%2DcnTA0?{zd`cQ&__?n!Hq5CR&>1P2%q5;s&Ogop}{FL{`vMqW>4KWl#anEB`11_^9t7_Gx0# z;gG;Qyq29q;eAgDN3gDR9B3Y#NylL-T_I;q0QR=jg~Q4^D=vZtbiMQmPvJWp3=9u^ zBP=BgkE;>8>?{I7z$d?p;Z?4Ue!*CG$L&O7XEP!mWT$Q#vdNRls!}34u^W}VSmnIT zxIFgab$RvJ1GfYw^X-Gcw>z3OtIlHl|)@uk|x0bgw>9FUy;lymA%cbD@h3iq{D85=Q6hJTKoQpZZF#KO>W%TT_K}_3Kuip@`aC#zZeHzSX9@+VKH{` zWYJU~LG}zzhWGdhE0>TG!NT2U)@$;7e{5YZ5tVkKNq~*=&dM?0jKRB<`jlMr4O5~c zhn$q|^7^#rq-Eu0#L^!;M zhbn2&b`XV$&cxT%!`dSC$=4!+DxHkcc{c_fQVMFh0Tk3_ zl7~V*AC!ySJihKI|E5(Zyb$0Iv-KRc!{s$;i~G8~s^C(Dc$+Sl76hPTjYISWek49C*qQrOp-dJg*yf6NSP$E1r z-r6Hr!Nnk_(R_wu7oTeBm)QuGniuMShf{g*NG?;!Wg=rPx&xJhCd`Q%KY`N4Hq>|F z&=%XQ*L73@=3cy*pPY4#d|Ty~xgG}|D{Ok3SQbbI76sQ~eKO~8UL>Ci~M>b$amq}p*vHuD3m2o2-3;Fy=h zrCMGkKqz6uHlV_pbV{#=8WY=Vn@R!%IUW!|aIeE}^VPX160mTUeO-#OdT10&|1U&6 zRxP5Dz#Flu00(~MAI#=g*FsC4Wx0Y=QZT7Zd+dc9t-pvGklr#Gs}AFFDdP9pO1fi6 zu1Q%1uFv`Yn21Dqj>Q4|c^r^4_!{}vH8CSsG^w*a8826@CxE03#;yITx_%hS3t3e^ z7{Hx^WKzTr+AH(h*NPg<$tB`uy`I=el1+0!wjaEHVe;of<4gufzyoY?$^nMBJ}$oC z4-vb;RJF52TT`XO1if@mX7FL!y=;6d@D;YvsT(=-%XwKvp*|sOr%-$NPj6J1ZQn^U z2(z^Us$RyCj&Jr)2zQ6@I2oby&Z3lnxvRK)=VIG4nIA#%S6ooM*d*QkW03i?QkPMM zcMX65b7NZtvU2PxfiLw%`l-)~0M8hdh^{?^Ck}j%kk0iJxF3;Hm0VA1UFstANtr_k zmzXCy)N5G+Q@~MQ>&L#n)LtE{ot^S*xiXibQy*X$&jaZiI~4@CA&f!dye8o*&nL?1 z<_($iMtQ2vr(g`sCBEdbO%)_43#Z5B@Qw3`{13AJF|=^UFoBTR_W85Y+T@MnR<)&Q zForc?I_zDQ>4?!BTm5Av6q!QVmDSCWD9WJ$H2Ah09wgF-&Yo{_q>wa`ApZ?LKxlNF zFWx|Cq|Kb!<~G)*vTDvf@%G*iS9+AC!0qvcm5|5=Da03;iZEVa0=YQ^IH{U{o32_b zaP7{wa6yH~YJlQ>vq$%dp4L2S=qs~Fx8uXg9BVN_0xJ@993woqreK*J+k`4&W!f*l zsW?;kDM$wuL(XXL=k6_Fc0bYFz(HuI=fr4RvClk;0~%b{45jxnjjysz<{0qR)-eQf z`^)&_Miwta+q`E158zXDsW}n|%euwIp!Gw_o5XhSd28=N5;Slw{|7Z12n&JGeJEgc z$lhur>C6}UH_RG_|G4OST>WlLqX`(#lX#NjV6_D?W2FHO7CGUyeO91>Hu4Umsz^%- z6)z)ED3`>CS~{_zr8=q(V45^?KLYvip@AT+`_GSq^5L}sY&Ls2>%)NIR|TMd+5GB< z&_ni4n+#+Q0mFI0ycwdc4kc92xwhQDf)NpOfUs6S{kgoCtWUB4C0#&MOT~Iz6Yp;l zm1M5Y#l{axs^oOMBdgp6(_T-mvIM%Z>Po+nxKN$=ClO#Q{&S3I9Dqx@TCp`H57aMs zUnDX{mtzAWgGddL0iKRO)Y=dVzB@Qt4-O0Ki@&TL-KG%|&=(dg4|Mu*HBt;?9e<1h z(*iS;5{moqn5rUev{9R^VV&l7t6l^?a%MxP?=bu;jU4c_nKuD6j7r?8UEl-IUDk0B zejGryvafJwTGM3aGP};Zdq1LSs<{vZ4eha{E6)(fIM9djk=^QkUNxbetuY1~g&$$i zl*@X)|4;DRy*o34ctth<-u%^EsXlRKig|q@U=`t!d4W#Ejf7TR33TE}5){`4`!8i8 z8Dqd<@=akg_wy3=MRDi73o@71^AaQoITz^GU37Uc=4avz^rxc$I zDUl8GgB{K_LZFfEvHN-O-s-$7`+L19Su-{h8IR*HdYN2Yf6uflViwO5_3>!62@4dv z$YW@YIV<;3SlM8`Urr}*NfQtwqn*_;kZuyMu1%gFRw?T&%^nd%NAZp^ntdO8So8$N zkfTD{j4L00RtIKFec6M=7y?zaj9ZwZB;Vtg$A4RlNdx(;J8AAhg83S=m7d;$R|cPg zNkEOyxe1JYix`Rex#+=w zuYP20KDHpp45RI?;(qploJ&%5za$+&$I35=qe23+&aL}N9t77ZE!ZK%sbW`(|z*4uI>Y@S9I+jBa`EOGqx{k$5n0MOwmeV?IUHb6Ushl z`+G0t#D6y#mW2G7<__RipI^OhDM=RcHZ>iO6V6C;1F{rOLu+G>6u`enj1HmO5jR#9 zVH@tn3}hVQD`bx6XC2tFL{w;NV~3r|)}4?zGLBfaU$m0* z*ASJp@W6W1KBC)Xl(8l6H=UGbk*FW%4Z9E!4k_EM7G@|-&V=XZVI19*yJ~)nK#y1v zuD*;p-PxQbXSFZkd#Jm2sT82m0!v<<2F;59NOlI6g^%}{#t<;AyI@LbUmX{JQ!R1EW^!s)`|6y>|PsjMr%u?>OAwNB?e)U*=_ zGLXi!dleMH$|^11&Hm^S1|pp_98$OVo>H~a5f-zERIb`!(-V0A43&oruPbYk1?jfb zXZ$rG3(?dqOR5}!J~nD=l4zZ8a(8hx)a<1Fj~O}Ch=ZlW8OEYg705DdO7la(JcsajqIuyOzOegdgMuy^B;$co|?v zIUho}?q_Wz;8tQ3uF>$CPSLmAa67&5#sL*<{*qYB)wCT`zk1VHhF5V|)Y?pte zph@1RI>3;s6in!MMz=x)o;c<)pLYPn(F#}6+L-2am~6#Mt2BKw)x-j5|GHH-Vwz03 z*SFWQIKm7IM{~r^+Nw9O8)kPIMln-X`E9aDvjWtYSXz9S4ko}q^$kKHPHVHNa-p_d za_%diN@PuB>_N%7uiTAxe-{90Nt!Mje{?W$fF?E8|3$FJ{+2qRy*Q&$q2#SUZK4!| zgZBj;U+TRxij-CKN-l5rF4HYLc=~q45H3>it=3*T6_b9TU*yUQkHZ5)TTi8!$4AtW zQFq{*?b))Ol4o{tyL2;kTv$tZhoh@>ZUK&;)pf~yR361a?Da2<>8Y^^co1XT2A6Lp z9ng6oWeG_>i047&jXVb?=1a#oDnexHDHRF<6S}R4M%lJTpCWFFT<76(Q-e92!H1D} znr66uiB+G?{69v%+EI|~h~Bn484Y<@ZdUi9O@s|ZwYE)_w?#Hlb~tUY9V5zXsk8n+ z*`-cS1-KE6N)&&yvzCUwiS*Sbjf?dFT5S~W*d?h(GEn_5O-&TRFWwGWaqq<0rX|jEw zSmaEinL%rfe`Fa)m#?E-`&vs_DiQbKqP4l6fQJ|0eT3vl?Os-94jWv=#6e z3RgOToP$(ClN@k_UzSP1_}xVXOvy`;Mb<_i=^HOF+%vV(l5GexKJBerApzc`ZENy2 zj)3iEi?H=H3x@iPt&FfX^c%1M00004+lP*u7C;C5K%gU*bOv4p4$Ct+&xv8rcN!sF ej143J0nMcW%>DtjJ=F`g>E9dz000003RzkX3^=<0 diff --git a/terraform_code/.gitignore b/terraform_code/.gitignore deleted file mode 100644 index 24782fe..0000000 --- a/terraform_code/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# Terraform state files -*.tfstate -*.tfstate.* - -# Backup files created by Terraform -*.backup - -# Crash log files -crash.log - -# .terraform directory -.terraform/ - -# Local .terraform configurations -.terraform.tfstate -.terraform.tfstate.backup - -# Terraform plan files -*.tfplan - diff --git a/terraform_code/dev/instances/.terraform.lock.hcl b/terraform_code/dev/instances/.terraform.lock.hcl new file mode 100644 index 0000000..43c972a --- /dev/null +++ b/terraform_code/dev/instances/.terraform.lock.hcl @@ -0,0 +1,20 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/aws" { + version = "3.74.0" + hashes = [ + "h1:YNOblHBUf+XTjGTfIIsAMGp4weXB+tmQrMPCrpmM1/U=", + "zh:00767509c13c0d1c7ad6af702c6942e6572aa6d529b40a00baacc0e73faafea2", + "zh:03aafdc903ad49c2eda03889f927f44212674c50e475a9c6298850381319eec2", + "zh:2de8a6a97b180f909d652f215125aa4683e99db15fcf3b28d62e3d542f875ed6", + "zh:3ac29ebc3af99028f4230a79f56606a0c2954b68767bd749b921a76eb4f3bd30", + "zh:50add2e2d118a15a644360eabc5a34cec59f2560b491f8fabf9c52ab83ca7b09", + "zh:85dd8e81910ab79f841a4a595fdd8ac358fbfe460956144afb0be3d81f91fe10", + "zh:895de83d0f0941fde31bfc53fa6b1ea276901f006bec221bbdee4771a04f3693", + "zh:a15c9724aac52d1ba5001d2d83e42843099b52b1638ea29d84e20be0f45fa4f1", + "zh:c982a64463bd73e9bff2589de214b1de0a571438d9015001f9eae45cfc3a2559", + "zh:e9ef973c18078324e43213ea1252c12b9441e566bf054ddfdbff5dd62f3035d9", + "zh:f297e705b0f339c8baa27ae70db5df9aa6578adfe1ea3d2ba8edc186512464eb", + ] +} diff --git a/terraform_code/dev/instances/config.tf b/terraform_code/dev/instances/config.tf new file mode 100644 index 0000000..e69de29 diff --git a/terraform_code/dev/instances/main.tf b/terraform_code/dev/instances/main.tf new file mode 100644 index 0000000..e629093 --- /dev/null +++ b/terraform_code/dev/instances/main.tf @@ -0,0 +1,112 @@ + + +#---------------------------------------------------------- +# ACS730 - Week 3 - Terraform Introduction +# +# Build EC2 Instances +# +#---------------------------------------------------------- + +# Define the provider +provider "aws" { + region = "us-east-1" +} + +# Data source for AMI id +data "aws_ami" "latest_amazon_linux" { + owners = ["amazon"] + most_recent = true + filter { + name = "name" + values = ["amzn2-ami-hvm-*-x86_64-gp2"] + } +} + + +# Data source for availability zones in us-east-1 +data "aws_availability_zones" "available" { + state = "available" +} + +# Data block to retrieve the default VPC id +data "aws_vpc" "default" { + default = true +} + +# Define tags locally +locals { + default_tags = merge(module.globalvars.default_tags, { "env" = var.env }) + prefix = module.globalvars.prefix + name_prefix = "${local.prefix}-${var.env}" +} + +# Retrieve global variables from the Terraform module +module "globalvars" { + source = "../../modules/globalvars" +} + +# Reference subnet provisioned by 01-Networking +resource "aws_instance" "my_amazon" { + ami = data.aws_ami.latest_amazon_linux.id + instance_type = lookup(var.instance_type, var.env) + key_name = aws_key_pair.my_key.key_name + vpc_security_group_ids = [aws_security_group.my_sg.id] + associate_public_ip_address = false + + lifecycle { + create_before_destroy = true + } + + tags = merge(local.default_tags, + { + "Name" = "${local.name_prefix}-Amazon-Linux" + } + ) +} + + +# Adding SSH key to Amazon EC2 +resource "aws_key_pair" "my_key" { + key_name = local.name_prefix + public_key = file("${local.name_prefix}.pub") +} + +# Security Group +resource "aws_security_group" "my_sg" { + name = "allow_ssh" + description = "Allow SSH inbound traffic" + vpc_id = data.aws_vpc.default.id + + ingress { + description = "SSH from everywhere" + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = ["::/0"] + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = ["::/0"] + } + + tags = merge(local.default_tags, + { + "Name" = "${local.name_prefix}-sg" + } + ) +} + +# Elastic IP +resource "aws_eip" "static_eip" { + instance = aws_instance.my_amazon.id + tags = merge(local.default_tags, + { + "Name" = "${local.name_prefix}-eip" + } + ) +} diff --git a/terraform_code/dev/instances/output.tf b/terraform_code/dev/instances/output.tf new file mode 100644 index 0000000..ad702fa --- /dev/null +++ b/terraform_code/dev/instances/output.tf @@ -0,0 +1,4 @@ +# Step 10 - Add output variables +output "eip" { + value = aws_eip.static_eip.public_ip +} \ No newline at end of file diff --git a/terraform_code/dev/instances/variables.tf b/terraform_code/dev/instances/variables.tf new file mode 100644 index 0000000..f25e07a --- /dev/null +++ b/terraform_code/dev/instances/variables.tf @@ -0,0 +1,22 @@ +# Instance type +variable "instance_type" { + default = { + "prod" = "t3.medium" + "test" = "t3.micro" + "staging" = "t2.micro" + "dev" = "t2.micro" + } + description = "Type of the instance" + type = map(string) +} + +# Variable to signal the current environment +variable "env" { + default = "dev" + type = string + description = "Deployment Environment" +} + + + + diff --git a/terraform_code/main.tf b/terraform_code/main.tf deleted file mode 100644 index c0c2766..0000000 --- a/terraform_code/main.tf +++ /dev/null @@ -1,67 +0,0 @@ -provider "aws" { - region = "us-east-1" -} - -resource "aws_vpc" "default" { - cidr_block = "10.0.0.0/16" - tags = { - Name = "default-vpc" - } -} - -resource "aws_subnet" "public" { - vpc_id = aws_vpc.default.id - cidr_block = "10.0.1.0/24" - availability_zone = "us-east-1a" - map_public_ip_on_launch = true - - tags = { - Name = "public-subnet" - } -} - -resource "aws_instance" "web" { - ami = "ami-00beae93a2d981137" # Amazon Linux 2 AMI - instance_type = "t2.micro" - subnet_id = aws_subnet.public.id - associate_public_ip_address = true - key_name = "my-key" # Reference the newly created key pair - - tags = { - Name = "web-server" - Public_Key = "bsabbah@gmail.com" - } -} - -resource "aws_ecr_repository" "webapp" { - name = "webapp" -} - -resource "aws_ecr_repository" "mysql" { - name = "mysql" -} - -# resource "aws_internet_gateway" "example" { -# vpc_id = aws_vpc.default.id - -# tags = { -# Name = "example-igw" -# } -# } - -# resource "aws_route_table" "example" { -# vpc_id = aws_vpc.default.id - -# route { -# cidr_block = "0.0.0.0/0" -# gateway_id = aws_internet_gateway.example.id -# } - -# tags = { -# Name = "example-route-table" -# } -# } - -output "web_instance_public_dns" { - value = aws_instance.web.public_dns -} diff --git a/terraform_code/modules/globalvars/output.tf b/terraform_code/modules/globalvars/output.tf new file mode 100644 index 0000000..c06af26 --- /dev/null +++ b/terraform_code/modules/globalvars/output.tf @@ -0,0 +1,13 @@ +# Default tags +output "default_tags" { + value = { + "Owner" = "Dockerintro" + "App" = "Web" + "Project" = "CLO835" + } +} + +# Prefix to identify resources +output "prefix" { + value = "week1" +} \ No newline at end of file From fad92e0d0f6684a536fb3775c46f15f9f5d01244 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 4 Jun 2024 19:45:30 +0000 Subject: [PATCH 17/21] code added --- terraform_code/dev/instances/main.tf | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/terraform_code/dev/instances/main.tf b/terraform_code/dev/instances/main.tf index e629093..b1c1a8d 100644 --- a/terraform_code/dev/instances/main.tf +++ b/terraform_code/dev/instances/main.tf @@ -110,3 +110,11 @@ resource "aws_eip" "static_eip" { } ) } +resource "aws_ecr_repository" "mysql" { + name = "mysql" +} + +# Create ECR repository for WebApp +resource "aws_ecr_repository" "webapp" { + name = "webapp" +} From cc711fedd4e238dc33560b9546381decd755d2c7 Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:06:43 -0400 Subject: [PATCH 18/21] Update docker-image.yml --- .github/workflows/docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 5a67209..60eb62d 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Deploy to ECR phase1 +name: Deploy to ECR phase6 on: push: From 2ee6ac7f0d15f44188f071b34142d50c6f0d31ac Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:22:56 -0400 Subject: [PATCH 19/21] Update docker-image.yml RECORD --- .github/workflows/docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 60eb62d..5a67209 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Deploy to ECR phase6 +name: Deploy to ECR phase1 on: push: From aa328cd774ab3f1017bd075ee44f4aeaa4a35eba Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:30:12 -0400 Subject: [PATCH 20/21] Update docker-image.yml --- .github/workflows/docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 5a67209..f1b60d4 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Deploy to ECR phase1 +name: Deploy to ECR phase2 on: push: From 671f21d6bb946924d4d0006ab52303359e75a911 Mon Sep 17 00:00:00 2001 From: BaderSabbah <159852626+BaderSabbah@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:33:29 -0400 Subject: [PATCH 21/21] Update docker-image.yml --- .github/workflows/docker-image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index f1b60d4..5a67209 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Deploy to ECR phase2 +name: Deploy to ECR phase1 on: push: