[JP] 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を入力しました。

持続性のあるウェブアプリを提供するため2つ以上のサブネットを作ります。

  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. IGWをVPCにAttach します。
  2. サブネットのルートテーブルがIGWを指すようにします。
  3. インスタンスはでユニークなIPアドレスを持っています。
  4. インスタンスに向かうトラフィックがネットワークアクセスコントロールとセキュリティーグループのルールによりアクセス可能になっていなければなりません。

下のイメージを確認してください。

Image for post
Image for post
  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