[KO] AWS에서 HTTPS로 웹 애플리케이션 디플로이하기

이 포스트는 AWS에서 HTTPS를 이용하는 웹 애플리케이션을 디플로이 하였을 때 작성한 개인적인 기록입니다. 간단하게 무엇을 하였는지에 대해서만 기록해놓았습니다.

첫번째 단계: 인프라 구성

이 단계에서는 웹 애플리케이션을 배포하기 위한 인프라를 구성하도록 합니다.

  1. 메뉴: Services > VPC > Your VPCs > Create VPC
  2. Name tagIPv4 CIDR block을 입력
  3. Create를 눌러 생성
  4. 메뉴: Services > VPC > Your VPCs > Select created VPC > Actions > Edit DNS resolution
  5. DNS resolution에서 enable을 선택
  6. 메뉴: Services > VPC > Your VPCs > Select created VPC > Actions > Edit DNS hostnames
  7. DNS hostname에서 enable을 선택

IPv4 CIDR Block으로 10.0.0.0/16 를 입력하였습니다.

끊기지 않는 웹 서비스를 제공하기 위해 두개 이상의 서브넷을 만들어야합니다.

  1. 메뉴: Services > VPC > Subnets > Create subnet
  2. Name tagIPv4 CIDR Block을 추가하고, 이전 단계에서 생성한 VPC를 선택
  3. 2개의 서브넷을 생성

IPv4 CIDR Block으로 10.0.0.0/2410.0.1.0/24를 입력하였습니다.

  1. 메뉴: Services > EC2 > Instances > Launch Instance
  2. AMI 선택: Amazon Linux 2 AMI 64bit(x86)
  3. 인스턴스 타입 선택: t2.micro
  4. 네트워크 선택: 이전에 생성한 VPC
  5. 서브넷 선택: 이전에 생성한 서브넷
  6. Auto-assign Public IP 선택: Enable
  7. TCP 22번 포트(SSH)에 My IP에서 접속할 수 있도록 설정
  8. TCP 80번 포트(HTTP)에 Anywhere에서 접속할 수 있도록 설정
  9. TCP 443번 포트(HTTPS)에 Anywhere에서 접속할 수 있도록 설정
  10. 확인 및 실행

두번째 단계: 인프라가 인터넷에 접속할 수 있도록 설정하기

문서를 확인해보도록 합니다. VPC 내부의 인스턴스가 인터넷에 접속하기 위해서는 다음의 모든 조건을 만족해야 합니다.

  1. 인터넷 게이트웨이를 VPC에 Attach 합니다.
  2. 서브넷의 라우트 테이블이 인터넷 게이트웨이를 가리키도록 합니다.
  3. 인스턴스는 글로벌적으로 유일한 IP주소를 가지고 있어야 합니다.
  4. 인스턴스로 향하는 트래픽이 네트워크 액세스 컨트롤과 보안 그룹의 규칙에 의해 접근 가능하도록 허용되어 있어야 합니다.

하단의 이미지를 확인해주세요.

  1. 메뉴: Services > VPC > Internet Gateways > Create internet gateway
  2. Name tag추가
  3. Create를 눌러 생성
  4. 메뉴: Services > VPC > Internet Gateways > Select created IGW > Actions > Attach to VPC
  5. 이전에 생성한 VPC 선택
  6. Attach클릭
  1. 메뉴: Services > VPC > Route Tables > 생성한 VPC 선택
  2. Actions > Edit routes
  3. 라우트 추가: Destination 0.0.0.0/0, Target: 생성한 IGW
  4. 라우트 저장
  1. 메뉴: Services > EC2 > Elastic IPs > Allocate Elastic IP address
  2. Allocate를 눌러 IP 할당
  3. 메뉴: Services > EC2 > Elastic IPs > Select created IP address > Actions > Associate Elastic IP address
  4. 생성한 인스턴스 선택
  5. Associate를 눌러 인스턴스에 IP 연결

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
$ 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
$ sudo yum install -y httpd
$ sudo systemctl start httpd
$ sudo systemctl enable httpd
# 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"
$ sudo mkdir -p /var/www/html/<app-name>
$ cd /var/www/html/<app-name>
$ git clone <git-url> .
$ composer install

이 과정은 생략하도록 하겠습니다. 하단의 튜토리얼을 참고해주세요.

$ 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!

  1. 파일에서 elif [ -f /etc/redhat-release ]; then 가 적혀있는 라인을 찾습니다.
  2. 그 라인을 elif [ -f /etc/redhat-release ] || grep ‘cpe:.*:amazon_linux:2’ /etc/os-release > /dev/null 2>&1; then로 변경합니다.

더 자세한 정보 필요하신 분은 다음 포스트를 참고해주세요.

<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.pem
DocumentRoot /var/www/html/<app-name>
<Directory /var/www/html/<app-name>>
AllowOverride All
Options Includes FollowSymLinks Indexes
Require all granted
</Directory>
</VirtualHost>
$ sudo apachectl restart

Korean, live in Japan. The programmer. I love to learn something new things. I’m publishing my toy projects using GitHub. Visit https://www.jangwook.net.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store