2-2 : AWSの設定1(サーバーの作成)

2019/05/29

概要

自分のコンピューター上で開発したWebサイトを公開するために、サーバーを立てて、開発環境と同じようにWebサーバーやデータベースをインストールし、Webサイトが動く環境を構築していきます。
AWSの設定1ではまずAmazonのWebサービスであるAWSを利用し、サーバーを作成した後に、初期設定とWebサーバーであるApacheをインストールするところまでを行います。

事前知識・準備

事前準備として次の内容に目を通してください。

AWS EC2について

AWSとは Amazonのクラウドサービスです。クラウドでサーバーを立てるには、 EC2 というサービスを利用します。
EC2にはCPUやメモリサイズ、ネットワーク帯域幅などの構成を定義しているインスタンスタイプ、モデルが用意されており、インスタンスの作成時にはそのモデルの種類を選んでサーバーを構築します。
今回は学習用に汎用タイプとされている一番手軽なモデルt2.microを利用します。

事前にやっておくべきコンテンツ

システム構成・Web サーバーの構成

以下は今回構築するEC2のシステム構成です。各項目は今は深く理解する必要はありません。このような構成でサーバーを作成するんだなということだけ意識してもらえれば大丈夫です。

システム構成

項目 設定値
インスタンスモデル t2.micro
ディスク EBS 汎用 8GiB
ネットワーク デフォルトVPC
ファイヤウォール 22: マイIP、 80: 全て、 443: 全て

Webサーバーの構成

項目 設定値
OS Amazon Linux 2
Webサーバー Apache 2.4
ミドルウェア php 7.2
DB MySQL 5.7
その他 SFTP

全体の手順

以下の手順でサーバーを設定します。

  • インスタンスの設定
  • サーバー初期設定
  • 各種パッケージインストール
  • Apache設定

インスタンスの設定

EC2 を利用してサーバーを作っていきます。インスタンスというのはサーバーのことです。
AWS EC2 で サーバーである インスタンスを作成し、さらにサーバーにSSHで接続してコマンドラインベースでサーバーを設定していきます。

インスタンスの作成

インスタンスを作成していきましょう。
ウィザードベースで設定自体は簡単ですが、各項目の意味が最初はあまり理解できないと思います。簡単に説明はしていきますが、わからなければ深く考えずに、同じ手順で設定していきましょう。

AWSのマネジメントコンソールを開き、EC2のメニューを開きます。

EC2を開くと、ダッシュボードという画面が開きます。ここで、インスタンスに関する様々な設定をすることができます。
インスタンスの作成をクリックしましょう。

Amazon Linux 2 を選択します。
Amazon Linux は2種類ありますが、必ず の方を選択するようにしてください。 2がないAmazon Linux を選択すると、後で説明しているコマンドが通らなくなります。

インスタンスタイプの選択では、 t2.micro を選択し、次の手順:インスタンスの詳細設定 をクリックします。

インスタンスの詳細設定での項目はデフォルトのままとし、次の手順:ストレージの追加 をクリックします。

ストレージの追加でディスクの設定を行うことができます。ディスクはデフォルトの汎用SSD、8GiBを利用するのでデフォルトの8Gのままとし、次の手順:タグの追加 をクリックします。

次にタグの設定を行います。タグとは、そのサーバーにつける名前のようなものです。
タグではインスタンスに識別しやすいような名前をつけます。好きな名前をつけてもらっても構いませんが、今回は手順を説明しやすいようキーに Name 、値にtest-webserverと設定してください。次の手順に進みます。

セキュリティグループの設定をします。これはこれはファイヤウォールの機能です。
ファイヤウォールとは、意図しない場所からのアクセスを機能別にブロックできるものと考えてください。
今回は、SSH(22)でターミナル接続、HTTP(80)、HTTPS(443)のポートを解放します。SSHは自分だけが接続できるようにします。
新しいセキュリティグループを作成するを選択して、セキュリティグループ に test-webserver-security 、説明にwebserver security group と入力します。

SSHは、ソースをマイIPに変更します。変更すると、自分のネットワークのIPが自動的に設定されます。
ルールの追加 を2回クリックします。タイプ をそれぞれ HTTP、HTTPSに変更します。ソース は変更せずに 0.0.0.0/0, ::/0 のままにします。 0.0.0.0/0 は全てのIPがアクセスできる事を表しています。
確認と作成 をクリックします。

インスタンス作成の確認画面で今まで設定した内容を確認できます。確認できたら起動 をクリックします。

アクセスキーを聞かれるので、新しいキーペアの作成 を選択し、test_keyと入力したら、必ずキーペアのダウンロード をクリックしてアクセスキーファイルをダウンロードしましょう。
またダウンロードしたキーファイルは無くさないよう保管します。キーファイルをなくすとアクセスできなくなります。
インスタンスの作成 をクリックします。

同じ名前のキーペアは作成できません。2度目の実行で同じtest_key を指定すると、エラーになります。同じキーペアを利用したい場合は、自分のコンピューター上に test_key.pem というファイルが存在していることを必ず確認してから、 既存のキーペアを利用する を選択して、次に進んでください。

インスタンスの作成には少し時間がかかります。
数分後EC2ダッシュボードに戻り、一覧を確認します。test-webserver のインスタンスの作成が完了していれば、インスタンスの状態 が runnning になっているはずです。
サーバーのIPをコピーしておきます。このIPにSSHでアクセスします。

SSH の設定

サーバーへの接続はコマンドラインベースのSSH通信で行います。
ターミナルを起動します。
ホームディレクトリ直下に .ssh というディレクトリを作成します。既に作成されている場合は次に進んでください。

$ mkdir ~/.ssh

ダウンロードしたtest_key.pemを.sshディレクトリに移動します。

$ mv ~/downloads/test_key.pem ~/.ssh/

SSHで接続する際に、キーペアのパーミッションが適切に設定されていないとエラーで接続できません。パーミッションを600に変更します。

$ chmod 600 ~/.ssh/test_key.pem

キーペアをsshに登録します。

$ ssh-add ~/.ssh/test_key.pem 
Identity added: /Users/xxx/.ssh/test_key.pem (/Users/xxx/.ssh/test_key.pem)

サーバーに接続します。
sshコマンドは次の形式で実行します。

ssh <ユーザー名>@<サーバーのIP>

EC2のインスタンスを生成すると自動でec2-userが作成されます。初回は必ずこのユーザーで接続します。ec2のパブリックIP には先ほどec2の画面でコピーしたIPを利用します。

$ ssh ec2-user@<ec2のパブリックIP>

ssh -i <キーペア> user@xxx.xxx.xxx としてキーペアを直接指定する方法で接続もできますが、毎回指定するのが手間なのでssh-addでkeyファイルを登録しています。

接続できると、以下のようなコンソールが表示されます。

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
9 package(s) needed for security, out of 14 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-xx-xx-xx-xx ~]$ 

サーバーの設定

ここからは作成したサーバーにSSHで接続し、サーバーの設定やミドルウェアのインストールを行なっていきます。
*SSH接続を切断してしまった人は、再度sshコマンドでサーバーに接続してください。

初期設定

yumというパッケージマネージャをアップデートします。

$ sudo yum update -y

次にec2-userとroot ユーザーのパスワードを設定します。

$ sudo passwd ec2-user
$ sudo passwd root

localeの設定

OSの言語設定を変更します。まず現在の設定を確認します。

$ localectl status

次に設定を日本の“ja_JP.UTF8”に変更します。

$ sudo localectl set-locale LANG=ja_JP.UTF8

timezoneの設定

次に時間を日本時間に変更します。
まず現在の設定確認します。

$ timedatectl
      Local time: 金 2019-04-26 07:09:49 UTC
  Universal time: 金 2019-04-26 07:09:49 UTC
        RTC time: 金 2019-04-26 07:09:49
       Time zone: n/a (UTC, +0000)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

Local timeを日本時間のAsia/Tokyoに変更します。

$ sudo timedatectl set-timezone Asia/Tokyo

Development tools

development tools は開発関連のツール群です。
gitなどがはいっています。
以下を実行してdevelopment toolsをインストールします。

$ sudo yum groupinstall "Development tools" -y

Apache のインストール

ApacheはWebサーバーです。Webサーバーをインストールすることで、開発したWebプログラムやHTMLを公開することができます。

Apache2.4のインストール

Apacheはバージョン2.4をインストールします。最初から入っているパッケージのバージョンは2.4なのでそのままインストールします。

$ sudo yum install -y httpd

Apacheのバージョンを確認します。

$ httpd -v
Server version: Apache/2.4.39 ()
Server built:   Apr  4 2019 18:09:28

Apacheを起動します。

$ sudo systemctl start httpd

正常に動いているかステータスを確認します。

$ sudo systemctl status httpd

サーバーが起動していると次のように Active: active (running) と表示されます。

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: active (running) since 木 2019-05-02 14:29:59 JST; 6s ago
     Docs: man:httpd.service(8)
 Main PID: 20543 (httpd)
   Status: "Processing requests..."

ブラウザでサーバーのIPを開いてみましょう。アドレスバーにこのサーバーの接続IPを入力します。

図のようなApacheのテストページが表示されれば、Webサーバーは起動しています。

自動起動設定

再起動時にWebサーバーも自動的に起動するように設定を変更します。

$ sudo systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

Apache設定ファイルの変更

設定ファイルで次の変更を行います。

  • ディレクトリインデックスの表示を無効化
  • .htaccessでのディレクティブ設定を有効化

ディレクトリインデックス

ディレクトリインデックスとは、ディレクトリ内に存在するファイルやフォルダを一覧で表示する機能です。よく、オープンソースのミラーサイトで表示される次のような画面はディレクトリインデックスを利用しています。

.htaccessで許可されるディレクティブ種類について

Webサーバーの構成やアクセス権限などは、大元の設定ファイルhttpd.confで設定できますが、.htaccessファイルを利用することでディレクトリごとに個別の設定が可能です。その設定可能な種類をhttpd.confのAllowOverride ディレクティブで設定できます。
いくつか種類がありますが既定ではNone に設定されていて、htaccessでの設定が無効になっています。これをAllに指定して全ての項目を設定可能に変更します。

apacheのドキュメントではサーバーの性能やセキュリティの面で、htaccessでの個別設定は避け、極力httpd.confでの設定に集約させた方が良いとしています。

httpd.confの変更

それでは、apacheの設定ファイル/etc/httpd/conf/httpd.conf を変更していきます。

/etc/httpd/conf/httpd.conf

$ sudo vi /etc/httpd/conf/httpd.conf

以下の箇所を修正します。

    # Further relax access to the default document root:
    <Directory "/var/www/html">
        #
        # Possible values for the Options directive are "None", "All",
        # or any combination of:
        #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        #
        # Note that "MultiViews" must be named *explicitly* --- "Options All"
        # doesn't give it to you.
        #
        # The Options directive is both complicated and important.  Please see
        # http://httpd.apache.org/docs/2.4/mod/core.html#options
        # for more information.
        #

-       Options Indexes FollowSymLinks
+       Options FollowSymLinks

        #
        # AllowOverride controls what directives may be placed in .htaccess files.
        # It can be "All", "None", or any combination of the keywords:
        #   Options FileInfo AuthConfig Limit
        #

-       AllowOverride None
+       AllowOverride All

        #
        # Controls who can get stuff from this server.
        #
        Require all granted
    </Directory>

上書き保存をし、サーバーを再起動します。

$ sudo systemctl restart httpd

ドキュメントルートと作業グループの設定

ドキュメントルートとは、Webサイトのトップ階層となるディレクトリの場所です。
例えば、"http://www.example.com/" のサイトを開いた場合表示されるページはトップ階層となるドキュメントルートに存在します(リダイレクトやシンボリックリンクなど細かい設定は除き)。このドキュメントルートはApacheでは通常 "http://www.example.com/" /var/www/html に設定されています。
ドキュメントルートに対し、Webサイト制作に関わる作業グループ dev を作成し、devグループであれば編集可能なように設定を変更します。
作業グループ「dev」というグループを作成します。

$ sudo groupadd dev

dev 作業グループへ ec2-user を追加します。

$ sudo usermod -aG dev ec2-user

apacheと作業グループをオーナーにします。

$ sudo chown -R apache:dev /var/www/html

作業グループでの編集ができるようにグループ編集権限を設定します。

$ sudo chmod -R 2775 /var/www/html

umask でファイルやディレクトリが新しく作成された時のアクセス権限を設定します。

$ sudo vi /etc/sysconfig/httpd

(存在しない場合は新規作成)
最後の行に追加します。

umask 002

保存して終了し、再起動します。

$ sudo systemctl restart httpd

最後にec2-userに行なった変更(groupの追加)を反映させるために、一旦ログアウトして再ログインします。

$ logout
Connection to xx.xx.xx.xx closed.

ssh接続が終了するので、sshで再度ログインします。

$ ssh ec2-user@<サーバーIP>