あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

AWSでVPCを使いEC2のWeb/DBサーバーを立てる

はじめに

この記事は、VPC(Virtual Private Cloud) を使い、Amazon Web Services (AWS) で Web サーバーと DB サーバーを構築する方法についてご紹介します。備忘録を兼ねたものになります。

SSH の操作などは Mac で行っていますが、Windows でもツールを使えば同じように操作可能と思います。

目次

概要

今回作成するネットワークは以下のような構成になります。

f:id:fnyablog:20180921190000p:plain

VPC 内に、インターネットアクセスができるパブリックなサブネットを作成し、Web サーバーをここに配置します。いわゆる DMZ ですね。

また、インターネットからアクセスできないプライベートなサブネットを VPC 内に作成し、DB サーバーをここに配置します。

インターネットにアクセスできるようにインターネットゲートウェイを作成し、プライベートサブネットがインターネットを参照できるよう、パブリックサブネットに NAT ゲートウェイを作成します。

この構成では、DB サーバーに外部からアクセスできませんので、Web サーバーを踏み台にして DB サーバーにアクセスするようにします。

ネットワークの構築

まず、Web/DB サーバーのインスタンスを作成する前に、ネットワークの構築を先に行ってしまいます。

VPC の作成

マネジメントコンソールより、VPC にアクセスします。

[VPC の作成]より以下の手順で VPC を作成します。

  • ステップ1

    • 1 個のパブリックサブネットを持つ VPC を選択
  • ステップ2

    • IPv4 CIDR ブロック: 10.0.0.0/16
    • VPC 名: my-vpc
    • パブリックサブネットの IPv4 CIDR: 10.0.1.0/24
    • アベイラビリティーゾーン: ap-northeast-1a
    • サブネット名: my-public-subnet-1a
    • 他はデフォルトで VPC を作成

ルートテーブルの作成

VPC のルートテーブルメニューを選択し、[ルートテーブルの作成]より以下の2つのルートテーブルを作成します。

  • パブリックサブネット用

    • 名前タグ:my-public-rt
    • VPC: my-vpc
  • プライベートサブネット用

    • 名前タグ:my-private-rt
    • VPC: my-vpc

それぞれのルートテーブル ID を控えておきます。

NAT ゲートウェイの作成

プライベートサブネットは、そのままではインターネットにアクセスできないため NAT ゲートウェイという仕組みを使用する必要があります。

事前に、my-public-subnet-1a のサブネット ID をコピーしておきます。

VPC の NAT ゲートウェイメニューを選択し、[NAT ゲートウェイの作成]をクリックして以下の内容で NAT ゲートウェイを作成します。

  • サブネット: 先ほどコピーしたサブネット ID を貼り付けリストより選択
  • Elastic IP 割り当て ID: [新しい EIP の作成] をクリックし、NAT ゲートウェイを作成

セキュリティグループの作成

EC2 サービスのセキュリティグループのメニューを選択し、[セキュリティグループの作成]をクリックして以下の内容でセキュリティグループを作成します。

  • パブリックサブネット用

    • セキュリティグループ名:my-public-sg
    • 説明:my-public-sg
    • VPC:my-vpc
    • ルールは、SSH, HTTP, HTTPS を追加
      • SSH, TCP, 22, カスタム,0.0.0.0/0
      • HTTP, TCP, 80, カスタム, 0.0.0.0/0, ::/0
      • HTTPS, TCP, 443, カスタム, 0.0.0.0/0, ::/0
  • プライベートサブネット用

    • セキュリティグループ名:my-private-sg
    • 説明:my-private-sg
    • VPC:my-vpc
    • ルールは、SSH,MYSQL/Aurora を追加
      • SSH, TCP, 22, カスタム, my-public-sg のセキュリティグループ ID
      • MYSQL/Aurora, TCP, 3306, カスタム, my-public-sg のセキュリティグループ ID

サブネットの作成

パブリックサブネットの修正

パブリックサブネットは VPC 作成時に作成されているので、VPC のサブネットメニューから my-public-subnet-1a を選択します。

ルートテーブルタブで、[ルートテーブルの変更]をクリックし、先ほど作成したルートテーブル ID で検索しルートテーブル(my-public-rt)に変更します。

その後、ルートテーブルの編集に入り、以下のようにルートテーブルを編集します。

  • 10.0.0.0/16 local
  • 0.0.0.0/0 igw-xxxxxxx (インタネットゲートウェイの my-vpc を割り当て)

プライベートサブネットの作成

VPC のサブネットメニューを選択し、[サブネットの作成]をクリックし、以下の内容でプライベートサブネットを作成します。

  • 名前タグ: my-private-subnet-1a
  • VPC : my-vpc を選択
  • アベイラビリティゾーン: ap-northeast-1a
  • IPv4 CIDR ブロック:10.0.2.0/24

次に、my-private-subnet-1a のルートテーブルを、事前に作成したルートテーブル(my-private-rt)に変更し以下のように編集します。

  • 10.0.0.0/16 local
  • 0.0.0.0/0 nat-xxxxxxxxxxxxxxxxx (NAT ゲートウェイを割り当て)

Web サーバーの構築

以上でネットワークの構築が終了したので、今度は EC2 で Web サーバーの構築を行います。

マネジメントコンソールより、EC2 にアクセスします。

インスタンスメニューより、[インスタンスの作成]をクリックし、以下の手順で Web サーバーのインスタンスを作成します。

  • ステップ 1: Amazon マシンイメージ (AMI)

    • Amazon Linux 2 AMI (HVM), SSD Volume Type を選択
  • ステップ 2: インスタンスタイプの選択

    • t2.micro を選択し、詳細設定へ
  • ステップ 3: インスタンスの詳細の設定

    • インスタンス数:1
    • ネットワーク: my-vpc
    • サブネット: my-public-subnet-1a
    • 自動割り当てパブリック IP:有効化 ※重要:間違えると後が大変
    • 高度な設定
      • ユーザーデータ:テキストで
      • 入力が終わったら次の設定へ

ユーザーデータには、以下の内容を設定します。

#!/bin/bash

# ホスト名
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=web-1a/g' /etc/sysconfig/network
hostname 'web-1a'

# タイムゾーン
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock

# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
  • ステップ 4: ストレージの追加

    • デフォルトのまま次の設定へ
  • ステップ 5: タグの追加

    • キー:Name、値:web-1a を追加
    • 次の設定へ
  • ステップ 6: セキュリティグループの設定

    • 既存のセキュリティグループを選択する
    • セキュリティグループ名:my-public-sg
    • 確認と作成へ
  • ステップ 7: インスタンス作成の確認

    • 作成

キーペアでは以下の設定を行いキーペアをダウンロードします。

  • 新しいキーペアの作成
  • キーペア名: aws-key

インスタンスが立ち上がったら、Web サーバーに SSH でログインします。

なお、ec2-user というのは、Amazon Linux の固定のログインユーザーです。

$ ssh -i aws-key.pem ec2-user@WebサーバーのパブリックIPアドレス

Apache をインストールして起動します。MariaDB のクライアントもここでインストールしておきます。

$ sudo yum -y update
$ sudo yum -y install httpd mariadb
$ sudo systemctl start httpd

Apache が起動したら、ブラウザにパブリック IP アドレスを入力して以下の画面が表示されれば、設定は無事にできています。

f:id:fnyablog:20180921190040p:plain

DB サーバーの構築

今度は DB サーバーの構築を行います。

マネジメントコンソールより、EC2 にアクセスします。

インスタンスメニューより、[インスタンスの作成]をクリックし、以下の手順で DB サーバーのインスタンスを作成します。

  • ステップ 1: Amazon マシンイメージ (AMI)

    • Amazon Linux 2 AMI (HVM), SSD Volume Type を選択
  • ステップ 2: インスタンスタイプの選択

    • t2.micro を選択し、詳細設定へ
  • ステップ 3: インスタンスの詳細の設定

    • インスタンス数:1
    • ネットワーク: my-vpc
    • サブネット: my-private-subnet-1a
    • 自動割り当てパブリック IP:無効化 ※重要:間違えると後が大変
    • 高度な設定
      • ユーザーデータ:テキストで
      • 入力が終わったら次の設定へ

ユーザーデータには、以下の内容を設定します。

#!/bin/bash

# ホスト名
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=db-1a/g' /etc/sysconfig/network
hostname 'db-1a'

# タイムゾーン
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock

# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
  • ステップ 4: ストレージの追加

    • デフォルトのまま次の設定へ
  • ステップ 5: タグの追加

    • キー:Name、値:db-1a を追加
    • 次の設定へ
  • ステップ 6: セキュリティグループの設定

    • 既存のセキュリティグループを選択する
    • セキュリティグループ名:my-private-sg
    • 確認と作成へ
  • ステップ 7: インスタンス作成の確認

    • 作成

キーペアでは以下の設定を行いキーペアをダウンロードします。

  • 既存のキーペアの選択
  • キーペア名: aws-key
  • チェックボックスにチェックを入れ、インスタンスを作成する

Web サーバーから DB サーバーにログインするために、秘密鍵を Web サーバーに転送します。

その後、Web サーバーにログインしたら、Web サーバーから DB サーバーに SSH でログインします。

$ scp -i aws-key.pem aws-key.pem ec2-user@WebサーバーのパブリックIPアドレス:/home/ec2-user/
$ ssh -i aws-key.pem ec2-user@WebサーバーのパブリックIPアドレス
[ec2-user@web-1a ~]$ ssh -i aws-key.pem ec2-user@DBサーバーのプライベートIPアドレス
[ec2-user@db-1a ~]$ #←切り替わる

SSH で DB サーバーにログインできたら、ネットワークの設定がうまくいっています。

また、DB のネットワーク設定を確認するために、MariaDB を DB サーバーにインストールして起動します。

[ec2-user@db-1a ~]$ sudo yum -y update
[ec2-user@db-1a ~]$ sudo yum -y install mariadb-server
[ec2-user@db-1a ~]$ sudo systemctl start mariadb

もし、yum コマンドの応答がなかったら、NAT ゲートウェイの設定がうまくいっていない可能性があります。

MariaDB の root ユーザーに 'password' というパスワードを仮に設定します。実際に使用する場合は、強固なパスワードを設定してください。

[ec2-user@db-1a ~]$ mysqladmin -u root password

MariaDB にログインして、外部のサーバーから MariaDB にログインできるよう設定します。

[ec2-user@db-1a ~]$ mysql -u root -p
MariaDB [(none)]>  grant all privileges on *.* to root@"%" identified by 'password' with grant option;
MariaDB [(none)]>  exit
[ec2-user@db-1a ~]$ exit

今は、SSH でDB サーバーからログアウトして、Web サーバーにログインしている状態です。

この状態で、以下のコマンドを実行し、MariaDB にログインできれば全ての設定の確認終了です。

[ec2-user@web-1a ~]$ mysql -h DBサーバーのプライベートIPアドレス -u root -p 
MariaDB [(none)]> 

うまくいったようですね。

これで、全ての設定が終了です。

あとかたづけ

EC2 のインスタンスは起動しておくと課金されてしまうので、EC2 の管理画面から[停止]もしくは[削除]します。

また、VPC の管理画面で NAT ゲートウェイを削除します。こちらも残しておくと課金されてしまいます。

なお、DB サーバーはインストールが済んだので、この後で DB サーバーを使用する場合も NAT ゲートウェイは削除して問題ありません。

この作業では Elastic IP は使用してませんが、Elastic IP も使用条件によって課金がされるので、不要なら削除した方がよいでしょうね。

おわりに

手順がある程度分かっていたので、さくさく進むかと思ったら、意外なところでひっかかり記事にするのにかなり時間がかかってしまいました。

聞いてわかった気になっていても、実際に手を動かすとうまくいかないものですね。

あと、記事では対応しませんでしたが、SSH の設定はポート番号を変更することと、アクセス元 IP アドレスを制限するとより安全になります。

この記事がみなさんのお役に立てば幸いです。