본문 바로가기
프로그래밍/리눅스

프로그래밍 「 리눅스 편」AWS에서 2티어 아키텍처 구축: Apache 웹 서버 및 MySQL 데이터베이스 배포

by grapedoukan 2023. 6. 11.
728x90

이 자습서에서는 퍼블릭 서브넷에서 Apache 웹 서버를 호스팅하는 EC2 인스턴스와 프라이빗 서브넷에서 MySQL 데이터베이스를 호스팅하는 <>계층화된 아키텍처를 생성합니다.

2계층 아키텍처는 웹 서버 계층(프런트 엔드)과 데이터베이스 계층(백 엔드)을 분리하여 더 나은 성능, 보안 및 확장성을 제공합니다. 퍼블릭 서브넷에 웹 서버를 배포하고 프라이빗 서브넷에 데이터베이스를 배포함으로써 민감한 데이터가 보안 계층 뒤에서 보호되는 동시에 웹 애플리케이션에 대한 퍼블릭 액세스를 계속 제공합니다.

이 튜토리얼에서 무엇을 할 것인지 살펴보겠습니다

당신은 나와 함께 따라갈 수 있습니다, 여기 내 GitHub 코드입니다.

필자는 이전에 AWS 콘솔에서 3계층 아키텍처를 만드는 유사한 프로젝트를 진행한 적이 있으며, 이것이 이 자습서에서 다룰 내용의 기초가 될 것입니다. AWS 3계층 아키텍처에 익숙하지 않은 경우 AWS 콘솔을 통해 동일한 구조를 생성하는 방법에 대한 가이드가 있습니다.

자격 증명 설정 Terraform Cloud

Terraform 클라우드에서 AWS 자격 증명을 설정하는 방법에 익숙해지기 위해 Hashicorp의 공식 문서는 자습서 형식으로 작성되어 방법을 배울 수 있는 좋은 방법입니다.

VPC 생성

이제 Terraform Cloud에서 자격 증명과 조직이 생성되었으므로 VPC에 대한 Terraform의 레지스트리를 살펴 보겠습니다. 우리는 그들의 모듈을 사용하고 우리 자신의 이익을 위해 수정할 것입니다. 우리는 두 개의 서로 다른 가용 영역에서 두 개의 프라이빗 및 퍼블릭 서브넷을 활용할 것입니다. 이 모듈은 NAT 게이트웨이를 생성합니다.

Terraform VPC 모듈

다음은 탄력적 IP(EIP)에 대한 리소스이며, 두 개의 퍼블릭 서브넷만 필요하므로 이를 2로 수정합니다.

이제 프로젝트에 가장 적합하도록 몇 가지 변경 사항을 적용하겠습니다. 1) Terraforms 모듈과 자체 cidr 블록 "10.10.0.0/16"을 사용합니다. 2) 프라이빗 및 퍼블릭 서브넷과 가용 영역을 선언합니다. 3) DNS 지원, dns 호스트 이름을 추가하고 탄력적 IP를 사용합니다. 4) NAT 게이트웨이에 탄력적 IP를 사용하고 5) VPC에 이름을 태그합니다.

VPC 모듈

EC2 모듈 생성

이제 EC2 모듈도 시작할 수 있으며 다음은 Terraform 레지스트리의 모듈입니다.

Terraform EC2 모듈

이제 이 모듈을 사용하여 수정 사항을 추가할 수 있습니다. 서브넷 목록을 순환하기 위해 Terraform의 for 루프 버전을 사용해야 한다는 점을 지적하고 싶습니다. VPC의 프라이빗 및 퍼블릭 서브넷을 다시 살펴보면 각 항목에 액세스하기 위해 Terraform의 for_each 내장 함수를 사용하는 list 유형임을 알 수 있습니다.

1) for_each 루프를 사용하여 퍼블릭 서브넷을 순환하고 퍼블릭 서브넷 맵의 각 서브넷에 인스턴스를 배포합니다. 2) variables.tf 파일에서 설명한 Amazon Linux AMI를 사용합니다. 또한 모든 보안 그룹(다음 단계에서 생성)도 포함됩니다. 3) EC2 인스턴스에서 실행될 로컬 .sh 파일도 포함하며 퍼블릭 IP 주소를 포함하는 것을 잊지 마십시오.

이제 EC2 인스턴스용 모듈이 준비되었으므로 EC2 인스턴스를 생성할 때 모듈을 사용할 수 있으며 물론 프로젝트에 맞게 각 인스턴스를 수정할 수 있습니다. 모듈을 사용하여 인스턴스를 만드는 방법을 살펴보겠습니다. 1) 우리는 우리가 만드는 각 인스턴스에 대해 모듈을 사용할 것이며, 이것이 for 루프를 통해 우리가 할 수있는 것입니다. 2) SSH 연결을 설정하고 생성시 EC2 인스턴스에 배포 할 파일도 설정합니다. 이전 자습서에서 일반적으로 Terraform에서 로컬로 개인 키를 생성하고 EC2 생성시 사용한다는 것을 알 수 있습니다. 그러나 Terraform 클라우드에서는 Terraform 클라우드에 배포할 때 로컬 시스템에서 개인 키를 사용해야 하며 개인 키를 로컬에 저장할 수 없습니다. 3) 프로비저너 remote-exec를 사용하여 인스턴스의 각 IP를 인쇄합니다.

EC2에서 Apache Server 설정

이제 EC2 인스턴스가 생성되면 실행되는 "user-data.sh" 스크립트를 살펴보겠습니다. 1) 인스턴스를 업데이트하고, Apache 서버를 설치, 시작 및 활성화합니다. 우리는 또한 MySQL을 설치할 것이고, EC2에서는 MariaDB를 설치하여 이를 수행해야 합니다. 2) 색인.html 파일을 보다 개인적으로 수정하고 마지막으로 3) 몇 가지 유용한 정보를 브라우저 화면에 인쇄합니다.

RDS 리소스 생성

이제 AWS RDS의 경우 Terraform RDS 모듈을 처음 사용하려고 시도했기 때문에 이것이 어려웠지만 모듈의 소스는 기본적으로 로컬 VPC에 모든 데이터베이스(DB) 인스턴스를 생성하며 사용자 지정 VPC를 생성하기 때문에 작동하지 않습니다. "오류 : RDS DB 인스턴스 (db-terraform) 생성 : InvalidParameterCombination : DB 인스턴스와 EC2 보안 그룹이 서로 다른 VPC에 있습니다"라는 메시지가 계속 발생했습니다.

Terraform에서 제공되는 리소스 예제를 살펴보겠습니다. DB 인스턴스에 대해 채우고 제공할 수 있는 모든 인수를 볼 수 있습니다.

이제 우리는 우리 자신의 DB 인스턴스를 만들 수 있습니다, 우리는 1) MySQL의 최신 버전, 버스트 가능한 t3.micro를 사용하고 2) 우리는 우리 자신의 사용자 및 암호를 사용할 것입니다. 3) 다음 단계에서 생성할 보안 그룹을 사용합니다. 자격 증명을 파일에 저장하는 것은 권장되지 않으며 CLI를 통해 "export TF_VAR_db_password=<your_password>" 형식으로 비밀번호를 내보낼 수 있습니다.

서브넷 그룹 생성

DB 서브넷 그룹을 소싱해야 하며, "aws_db_subnet_group"을 사용하면 EC2 인스턴스에 대해 위에서 사용한 것과 같은 for_each 기능을 사용하지 않고도 여러 서브넷을 정의할 수 있습니다.

보안 그룹 생성

이제 DB 리소스가 완료되었으므로 보안 그룹(SG)으로 넘어가겠습니다. 먼저 인스턴스에 대한 보안 그룹을 정의하고 연결을 허용하기 위해 몇 개의 포트를 열어야 합니다. 1) SSH 연결을 통해 인스턴스에 직접 연결하고 필요한 경우 변경할 수 있습니다 (예 : 서버 또는 데이터베이스가 제대로 설치되지 않는 경우). 2) "HTTP"와 "HTTPS"모두 인터넷 트래픽을 허용해야하며 포트 80과 3) 포트 443이 필요합니다. 4) 또한 앞서 정의한 VPC를 사용하여 인스턴스에 아웃바운드 네트워크 기능을 제공합니다.

이제 DB용 SG의 경우 1) 데이터베이스 연결을 위해 포트 3306에 대한 트래픽을 허용하고 다른 보안 그룹이 배스천 연결을 허용하도록 허용해야 합니다. 2) 대부분의 경우 DB가 인터넷에 접속할 수 있도록 허용해서는 안되며 외부 API에 대한 외부 연결이 필요하거나 이메일을 보내는 경우에만 비공개로 유지해야합니다. 3) VPC를 계속 사용하겠습니다.

배스천 호스트의 경우 SG인 이 보안 그룹은 1) DB에 연결하는 방법인 포트 22에 대한 연결만 허용하고 2) 3) VPC에서 아웃바운드 연결을 허용합니다.

아파치 서버 테스트

EC2 대시보드로 이동하여 두 AZ의 EC2 Apache 서버를 확인해 보겠습니다. 공용 IP 주소를 복사하고 나란히 봅니다. 각 EC2 인스턴스가 서로 다른 가용 영역인 us-east-1a 및 us-east-1b에 있는 것을 볼 수 있으며, 각 영역에 대해 정의한 올바른 IP 주소에 있는 것을 확인할 수 있습니다.

데이터베이스 테스트

이제 RDS 연결을 확인해야하며 EC2 인스턴스에서만 액세스 할 수 있으므로 1) 인스턴스에 SSH를 사용해야하며 2) 연결되면 스크립트가 MariaDB를 통해 DB (이 경우 MySQL)를 설치했는지 확인합니다.

스크립트가 올바르게 실행된 것을 볼 수 있습니다. 이제 우리가 만든 MySQL 데이터베이스에 연결할 수 있는지 봅시다.

output.tf 파일로 설정했는데 간단히 복사하여 터미널에 붙여 넣을 수 있습니다.

EC2 인스턴스에 잘라내어 붙여넣기만 하면 이 인스턴스에 대한 더미 암호를 설정할 수 있지만 CLI에서 명령을 실행하는 것이 좋습니다.

export TF_VAR_db_password="hashicorp"

이제 명령을 복사하여 터미널에 붙여넣을 수 있습니다.

데이터베이스 테이블 만들기

자, 이제 간단한 테이블을 만들 수 있습니다. 이 명령을 실행하여 데이터베이스를 만들고 테이블을 만듭니다.

CREATE DATABASE the_office_characters; --creates our database

USE the_office_characters; --allows us to use our DB


CREATE TABLE cast ( --create our table
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Occupation varchar(255),
    NiciName varchar(255)
);

이제 다음 명령을 실행할 수 있습니다.

DESCRIBE cast; 

테이블을 살펴보면 테이블을 성공적으로 만들었다는 것을 알 수 있습니다. 테이블에 추가 정보를 만드는 데 더 이상 진행하지 않겠지만 새 데이터베이스에 액세스하는 방법을 이해해야 합니다.

테라폼 클라우드 CICD

이제 Terraform 클라우드를 살펴보고 조직 > 프로젝트 및 작업 공간 -> <name_of_workspace> 로 이동합니다. 그런 다음 "my-cicd-workspaces"응용 프로그램이있는 경우 응용 프로그램을 볼 수 있으며 실행을 확인하고 세부 정보를 볼 수 있습니다.

세부 사항을 살펴 보겠습니다.

각 섹션을 자세히 살펴보면 1) 개요 및 2) 로컬 컴퓨터의 CLI를 통해 트리거된 실행에 대한 세부 정보를 볼 수 있습니다.

이제 Terraform 작업 영역 애플리케이션을 확인하고 만든 내용과 기록된 내용을 살펴보겠습니다.

그리고 우리는 그것을 가지고 있습니다! 파일을보다 명확하게 만들기 위해 VPC, EC2 및 RDS를 변수가있는 모듈로 만듭니다.

환경 삭제

환경을 파괴하는 것을 잊지 마세요, 그렇지 않으면 그 요금이 쌓일 것입니다. 우리는 환경과 인프라를 파괴 할 것입니다.

terraform destroy -auto-approve

Terraform 클라우드 작업 공간에 현재 프로세스가 표시됩니다.

우리는 우리의 자원이 1) 적용되고 2) 파괴되는 것을 볼 수 있습니다.

응용 프로그램이 파기된 것을 확인할 수 있습니다.

728x90