【AWS】VPCとEC2でシンプルなサイトを公開するまでの手順!

  • このエントリーをはてなブックマークに追加
  • Pocket

こんにちは。タクマ™ [@suwaru_blog] です。

現在、自分の会社「株式会社 EeeeG」を設立中でして、丁度コーポレートサイトを制作しています。
そこで思いつきですが、リリースするまでのノウハウを公開してみようと思います。

今回、AWS の VPC のパブリックサブネットに EC2 インスタンスを構築して、
シンプルなサイトをネット公開するまでの手順を【徹底解説】します。

この記事で VPC と EC2 の基本的な使い方がわかります!

今回の説明では VPC 用語を頻繁に使います。
VPC を触ったことがない方は以下の記事を読んでおくとよいかと思います。

今回のアーキテクチャ設計

10.0.0.0/16 というレンジの VPC の中に、下記パブリックサブネットを作成します。
( DB を使う予定はないので、プライベートサブネットは作成しません。)

AZパブリックサブネット用途
1a10.0.11.0/24EC2
Web サーバ
1c10.0.12.0/24Elastic Load Balancing
※ 今回、ロードバランサーの設定まではしません
※ サブネット作成するだけなら無料です

VPC 篇

VPC でやることを先にざっくり説明しておきます。

  1. VPC を作成する
    • 同時に AZ:1a にパブリックサブネットも作成します
  2. AZ:1c にもパブリックサブネットを作成する
    • AZ:1a と同じルーティングテーブルを設定する

それではやっていきましょう。

VPC・パブリックサブネット作成手順

VPC のリージョン確認

AWS で VPC のメニューを開いて「東京リージョン」 になっていることを確認する

VPC ウィザードの起動

「VPC ウィザードの起動」を選択して、VPC の作成を行います。

VPC 設定の選択

「1 個のパブリックサブネットを持つ VPC」を選択してください。
これは VPC 作成すると、デフォルトでパブリックサブネットが 1 個付いてくるものです。

VPC とパブリックサブネット (AZ:1a) の設定をする

  • IPv4 CIDR ブロック
    • 10.0.0.0/16 に設定 (デフォルトのまま)
  • VPC 名
    • 今回は eeeeg-vpc としました
  • パブリックサブネットの IPv4 CIDR
    • 10.0.11.0/24
  • アベイラビリティーゾーン
    • 1a を選択
  • サブネット名
    • 今回は eeeeg-web-public-subnet-1a としました
  • サービスエンドポイント
    • VPC にエンドポイントを置いて、アクセスすれば S3 に繋がるみたいなことが可能
    • 今回は未設定です
  • DNS ホスト名を有効化
    • 「はい」を選択
  • ハードウェアのテナンシー
    • AWS のハードウェアを自分専用で貸しきってもらうかどうか
    • 「デフォルト」を選択します

この設定で VPC を作成してください。

このとき同時に作成されるパブリックサブネットには、
ルートテーブルに Internet GW も付与されてきます。

パブリックサブネット (AZ:1c) を作成する

サブネットメニューから「サブネットの作成」を選択してください。
さらにロードバランサー用のパブリックサブネットを作成していきます。

  • 名前タグ
    • 今回は eeeeg-public-subnet-1c としました
  • VPC
    • さっき作成した VPC を選択します
  • AZ
    • 1c を選択
  • IPv4 CIDR ブロック
    • 10.0.12.0/24 に設定

この設定でパブリックサブネットを作成してください。

AZ:1c のパブリックサブネットに Internet GW を設定する

さて、ここで注意しないといけないことがあります。

あとから作成した AZ:1c のパブリックサブネットには Internet GW が付与されていません。

AZ:1a のルーティングテーブルには Internet GW が含まれているので、
同じルーティングテーブルを AZ:1c に反映してあげる必要があります。

AZ:1a のルートテーブルを確認する

AZ:1a のサブネットを選択して、画面下の「ルートテーブル」タブを押してください。
あとで必要になるので、そこにある Route table ID を確認しておいてください。

AZ:1c のパブリックサブネットで「ルートテーブルの関連付けの編集」を行う

AZ:1c のパブリックサブネットを選択して右クリックするか、
画面下の「ルートテーブル」タブの中に、
「ルートテーブルの関連付けの編集」という項目があるので選択してください。

ルートテーブル ID の項目で、さきほど確認した AZ:1a の Route table ID を選択してください。
これで編集を完了すると、AZ:1cAZ:1c のルーティングテーブルが反映されます。

画面下の「ルートテーブル」タブを開くと、以下のようなルートテーブルになっています。

送信先ターゲット説明
10.0.0.0/16localVPC 内の IP に接続可能
※ つまり local 接続できるということ
0.0.0.0/0igw-[ID]それ以外は Internet Gateway から接続可能

ルートテーブルに Name 設定する

ルートテーブルメニューを開いて、名前を付けておきます。
今回は eeeeg-public-rt と設定しました。

Internet GW に Name 設定する

インターネットゲートウェイメニューを開いて、名前を付けておきます。
今回は eeeeg-igw と設定しました。

EC2 篇

EC2 でやることを先にざっくり説明しておきます。

  1. 先ほどのサブネットの中に EC2 インスタンスを作成する
    • セキュリティグループの設定をする
    • Elastic IP を設定する
  2. EC2 インスタンスにログインする
    • 環境設定する
    • Apache のインストール・設定をする

それではやっていきましょう。

EC2 インスタンス作成手順

EC2 のリージョン確認

AWS で EC2 のメニューを開いて「東京リージョン」 になっていることを確認する

インスタンスの作成

「インスタンスの作成」を選択してください。

Amazon マシンイメージ (AMI)

好きなものを使えばよいのですが、今回は Amazon Linux 2 AMI を利用します。

インスタンスタイプの選択

今回は無料利用枠にもなっている t2.micro を選択します。

インスタンスの詳細の設定

  • ネットワーク
    • 作成した VPC を選択する
  • サブネット
    • AZ1a のパブリックサブネットを選択します
  • 自動割り当てパブリック IP
    • 有効
    • グローバル IP が付与されます
      • ただし、インスタンス再起動すると IP アドレスが変わってしまいます
    • 固定的なグローバル IP である Elastic IP をあとで取得します
  • 高度な詳細 (任意)
    • ユーザーデータ
    • 「テキストで」にチェック
    • インスタンス作成と同時に実行されるシェルスクリプトを貼ることができます
高度な詳細から実行できるシェルスクリプト

環境設定を行うシェルスクリプトを用意しておきました。
これを貼っておくと、あとで少しラクになると思います。

#!/bin/bash

# ホスト名 (コピペするときは eeeeg-web-1a の2箇所を修正してください)
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=eeeeg-web-1a/g' /etc/sysconfig/network
hostname 'eeeeg-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

EC2 インスタンスに Name 設定する (タグの追加)

Name タグを付けると、EC2 インスタンスに名前を付けることができます。
今回は「Web-1a-eeeeg」と設定しました。

セキュリティグループの設定

  • セキュリティグループ名
    • Web-eeeeg-sg
  • 説明
    • Web-eeeeg-sg
  • SSH
    • 画像では 0.0.0.0/0 にしていますが、絶対にフルオープンにしないでください
    • 秘密鍵が流出すると、どこからでもアクセス可能になってしまいます
    • 特定の IP アドレスだけ許可しておきましょう
  • HTTP
    • 0.0.0.0/0,::/0 のフルオープンで OK
  • HTTPS
    • SSL 対応は常識となってきているので許可しておきます
    • 0.0.0.0/0,::/0 のフルオープンで OK
セキュリティグループ名を変更したいとき

セキュリティグループ名は後から変更できないので注意してください。

どうしても変更したい場合はセキュリティグループのメニューを開いて、
アクション > コピーして新規作成 でセキュリティグループを作り直します。

そして アクション > ネットワーキング > セキュリティグループの変更 から、
作り直したセキュリティグループを適用してください。

VPC に紐づくセキュリティグループしか表示できないので、複製するしか方法はありません。

秘密鍵を新規作成する

分かりやすいキーペア名を付けて、ダウンロードします。
この pem ファイルは紛失すると再ダウンロードできないので、慎重に保管してください。

ファイルの保管場所ですが、一般には ~/.ssh 配下に置かれることが多いです。

Elastic IP を作成して EC2 インスタンスに割り当てる

Elactic IP アドレスの割り当て

固定されたグローバル IP を取得して、EC2 インスタンスに設定します。
Elastic IP メニューを選択して「Elactic IP アドレスの割り当て」ボタンを押してください。

「割り当て」ボタンを押してください。

「この Elastic IP アドレスを関連付ける」ボタンを押してください。

作成した EC2 インスタンスを選択して、「関連付ける」ボタンを押してください。

IPv4 パブリック IP が Elastic IP になっていれば OK です。
これで EC2 インスタンスを再起動してもグローバル IP が固定されたままになります。

Elastic IP に Name 設定する (タグの追加)

Name タグを付けると、Elastic IP に名前を付けることができます。
画面下「Tags」タブから「タグの管理」ボタンを押してください。

今回は Name キーに「eeeeg-eip」と設定しました。

EC2 インスタンスにログインして環境設定する

SSH ログイン

先ほどの pem ファイルに権限を与えて、EC2 インスタンスに SSH ログインします。
IPv4 パブリック IP をコピペしておいてください。

chmod 400 ~/.ssh/[pemファイル]

# IPv4 パブリック IP で SSH する
ssh -i ~/.ssh/[pemファイル] ec2-user@[IP]
~/.ssh/config

config ファイルを作成しておくと、今後の ssh コマンドがラクになります。

~/.ssh/config

Host eeeeg
    HostName [IP]
    User ec2-user
    IdentityFile ~/.ssh/[pemファイル]

これで ssh eeeeg だけでログインできるようになります。

自分が作業しやすいツールを入れる

無事ログインできたら、このあとサーバのファイル編集をしたりします。

…なので、作業しやすいように僕はこのタイミングで zsh や Emacs  などインストールします。
手順はまとめているので、参考にしてみてください。

epel リポジトリを追加しておくと便利

ちなみに Amazon Linux 2 AMI は CentOS ベースなので yum を使えるのですが、
epel リポジトリを追加すると、便利なライブラリを yum install できるようになります。

# amazon-linux-extras install という便利コマンドから epel リポジトリ追加
sudo amazon-linux-extras install epel
sudo yum update

# たとえば git クライアントの tig などインストールできるようになる
yum install tig

ホスト名の変更

インスタンス作成時 高度な詳細 > ユーザーデータ からシェルスクリプトを流した人は不要です。

/etc/sysconfig/network

# HOSTNAME=localhost.localdomain
HOSTNAME=eeeeg-web-1a

以下のファイルも編集してください。

/etc/hosts

# 先頭行に eeeeg-web-1a 追加する
127.0.0.1   eeeeg-web-1a localhost localhost.localdomain localhost4 localhost4.localdomain4
# EC2 インスタンス再起動して設定を反映する
sudo reboot

言語・文字コード設定

インスタンス作成時 高度な詳細 > ユーザーデータ からシェルスクリプトを流した人は不要です。

/etc/sysconfig/i18n

# LANG=en_US.UTF-8
LANG=ja_JP.UTF-8
sudo cp /usr/share/zoneinfo/Japan /etc/localtime

タイムゾーン設定

インスタンス作成時 高度な詳細 > ユーザーデータ からシェルスクリプトを流した人は不要です。

/etc/sysconfig/clock

# ZONE="UTC"
ZONE="Asia/Tokyo"
UTC=true

日本の現在日時が表示されるか、確認してみましょう。

date

Web サーバ (Apache) 導入・設定

Apache インストール

今回は Apache を導入します。
Amazon Linux 2 AMI では yum コマンドを使うことができます。

sudo yum update
sudo yum install -y httpd

Apache 設定

ServerName で検索して ServerName eeeeg-web-1a を記述する

/etc/httpd/conf/httpd.conf

#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName www.example.com:80
ServerName eeeeg-web-1a

インスタンス起動時に Apache が自動的に起動するようにします。

sudo chkconfig httpd on

情報:'systemctl enable httpd.service'へ転送しています。
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

# 初回起動
sudo service httpd start

お疲れ様でした!

これでブラウザから IPv4 パブリック IP にアクセスすれば、
/var/www/html 配下の index.html が表示されるようになります。

シンプルに静的サイトを公開するだけでも、色々とやることが多かったと思います。
数をこなせば慣れてくるので何度も試してみましょう!

最後に…

パブリックサブネットでロードバランサーを構築したり…
プライベートサブネットで RDS を使ったり…
といったことも、後日、記事にしようと思います。

関連記事

コメント

コメントを残す

*