[KO] AWS에서 HTTPS로 웹 애플리케이션 디플로이하기
이 포스트는 AWS에서 HTTPS를 이용하는 웹 애플리케이션을 디플로이 하였을 때 작성한 개인적인 기록입니다. 간단하게 무엇을 하였는지에 대해서만 기록해놓았습니다.
첫번째 단계: 인프라 구성
이 단계에서는 웹 애플리케이션을 배포하기 위한 인프라를 구성하도록 합니다.
1. VPC 생성
- 메뉴: Services > VPC > Your VPCs > Create VPC
Name tag
와IPv4 CIDR block
을 입력Create
를 눌러 생성- 메뉴: Services > VPC > Your VPCs > Select created VPC > Actions > Edit DNS resolution
- DNS resolution에서
enable
을 선택 - 메뉴: Services > VPC > Your VPCs > Select created VPC > Actions > Edit DNS hostnames
- DNS hostname에서
enable
을 선택
IPv4 CIDR Block
으로 10.0.0.0/16
를 입력하였습니다.
2. Subnet 생성
끊기지 않는 웹 서비스를 제공하기 위해 두개 이상의 서브넷을 만들어야합니다.
- 메뉴: Services > VPC > Subnets > Create subnet
Name tag
와IPv4 CIDR Block
을 추가하고, 이전 단계에서 생성한VPC
를 선택- 2개의 서브넷을 생성
IPv4 CIDR Block
으로 10.0.0.0/24
와 10.0.1.0/24
를 입력하였습니다.
3. EC2 인스턴스 생성
- 메뉴: Services > EC2 > Instances > Launch Instance
- AMI 선택:
Amazon Linux 2
AMI 64bit(x86) - 인스턴스 타입 선택:
t2.micro
- 네트워크 선택: 이전에 생성한 VPC
- 서브넷 선택: 이전에 생성한 서브넷
- Auto-assign Public IP 선택:
Enable
- TCP 22번 포트(SSH)에
My IP
에서 접속할 수 있도록 설정 - TCP 80번 포트(HTTP)에
Anywhere
에서 접속할 수 있도록 설정 - TCP 443번 포트(HTTPS)에
Anywhere
에서 접속할 수 있도록 설정 - 확인 및 실행
두번째 단계: 인프라가 인터넷에 접속할 수 있도록 설정하기
문서를 확인해보도록 합니다. VPC 내부의 인스턴스가 인터넷에 접속하기 위해서는 다음의 모든 조건을 만족해야 합니다.
- 인터넷 게이트웨이를 VPC에 Attach 합니다.
- 서브넷의 라우트 테이블이 인터넷 게이트웨이를 가리키도록 합니다.
- 인스턴스는 글로벌적으로 유일한 IP주소를 가지고 있어야 합니다.
- 인스턴스로 향하는 트래픽이 네트워크 액세스 컨트롤과 보안 그룹의 규칙에 의해 접근 가능하도록 허용되어 있어야 합니다.
하단의 이미지를 확인해주세요.

1. 인터넷 게이트웨이를 VPC에 Attach 합니다.
- 메뉴: Services > VPC > Internet Gateways > Create internet gateway
Name tag
추가Create
를 눌러 생성- 메뉴: Services > VPC > Internet Gateways > Select created IGW > Actions > Attach to VPC
- 이전에 생성한 VPC 선택
Attach
클릭
2. 서브넷의 라우트 테이블이 인터넷 게이트웨이를 가리키도록 합니다.
- 메뉴: Services > VPC > Route Tables > 생성한 VPC 선택
- Actions > Edit routes
- 라우트 추가: Destination 0.0.0.0/0, Target: 생성한 IGW
- 라우트 저장
3. 인스턴스는 글로벌적으로 유일한 IP주소를 가지고 있어야 합니다.
- 메뉴: Services > EC2 > Elastic IPs > Allocate Elastic IP address
Allocate
를 눌러 IP 할당- 메뉴: Services > EC2 > Elastic IPs > Select created IP address > Actions > Associate Elastic IP address
- 생성한 인스턴스 선택
Associate
를 눌러 인스턴스에 IP 연결
4. 인스턴스로 향하는 트래픽이 네트워크 액세스 컨트롤과 보안 그룹의 규칙에 의해 접근 가능하도록 허용되어 있어야 합니다.
EC2 인스턴스를 생성할 때 보안 그룹에 대한 설정을 이미 완료하였습니다.
내 웹 애플리케이션 실행
1. EC2 에 접속하여 기본적인 설정을 합니다.
# Connect
$ ssh -i <key-file-path> ec2-user@<ip-address> -o ServerAliveInterval=30# add user
$ sudo adduser <user-name># password setting
$ sudo passwd <user-name># group setting
$ sudo usermod -aG wheel <user-name># add content of the public key file to last line
$ sudo mkdir -p /home/<user-name>/.ssh
$ sudo vi /home/<user-name>/.ssh/authorized_keys
2. PHP 7.4를 인스톨합니다.
$ sudo amazon-linux-extras enable epel
$ sudo yum clean metadata
$ sudo yum install -y epel-release
$ sudo rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ sudo yum install — enablerepo remi -y php74 php74-php php74-php-fpm php74-php-mbstring php74-php-dom php74-php-pdo php74-php-posix php74-php-uopz php74-php-xdebug php74-php-soap
$ sudo ln -sf /usr/bin/php74 /usr/bin/php
3. Apache를 설치하고 실행합니다.
$ sudo yum install -y httpd
$ sudo systemctl start httpd
$ sudo systemctl enable httpd
4. 필요한 패키지를 설치합니다.
# git
$ sudo yum install -y git# composer
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
$ mv composer.phar /usr/local/bin/composer
$ export PATH="$PATH:/usr/local/bin"
5. Git을 이용하여 웹 애플리케이션을 설치합니다.
$ sudo mkdir -p /var/www/html/<app-name>
$ cd /var/www/html/<app-name>
$ git clone <git-url> .
$ composer install
6. 도메인을 등록하고 EC2 인스턴스의 IP 주소에 대해 A 레코드를 설정합니다.
이 과정은 생략하도록 하겠습니다. 하단의 튜토리얼을 참고해주세요.
7. HTTPS 통신을 위한 SSL 증명서를 추가합니다.
$ sudo yum install -y mod_ssl
$ wget https://dl.eff.org/certbot-auto
$ chmod a+x certbot-auto
$ sudo ./certbot-auto — debug
하단과 같은 에러가 나타난다면, certbot-auto
파일을 수정할 필요가 있습니다.
Sorry, I don’t know how to bootstrap Certbot on your operating system!
- 파일에서
elif [ -f /etc/redhat-release ]; then
가 적혀있는 라인을 찾습니다. - 그 라인을
elif [ -f /etc/redhat-release ] || grep ‘cpe:.*:amazon_linux:2’ /etc/os-release > /dev/null 2>&1; then
로 변경합니다.
더 자세한 정보가 필요하신 분은 다음 포스트를 참고해주세요.
8. vhost 설정을 추가합니다.
<VirtualHost *:80>
ServerName <domain>
ServerAlias <domain>RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]DocumentRoot /var/www/html/<app-name>
<Directory /var/www/html/<app-name>>
AllowOverride All
Options Includes FollowSymLinks Indexes
Require all granted
</Directory>
</VirtualHost><VirtualHost *:443>
ServerName <domain>
ServerAlias <domain>SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/<domain>/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/<domain>/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/<domain>/fullchain.pemDocumentRoot /var/www/html/<app-name>
<Directory /var/www/html/<app-name>>
AllowOverride All
Options Includes FollowSymLinks Indexes
Require all granted
</Directory>
</VirtualHost>
9. Apache를 재시작합니다.
$ sudo apachectl restart