Security Essentialsのデモ環境の構築方法をまとめてみた-その1

AWS Security Essentialsのコースの中で利用しているデモ環境の構築方法をお伝えします。トレーニングの予習・復習に是非ご活用ください。
2022.04.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS認定トレーニング講師の51shivaです。

クラスメソッドでは2021年1月からAWS認定トレーニングの提供を開始し、現在、5つのトレーニングコースを提供しています。これからトレーニングを受講してみたいと考えていらっしゃる方はトレーニングの選び方ガイドを参考にご検討いただければ幸いです。

それぞれのトレーニングにはトレーニング毎に公式のテキストがあり、そのテキストに記載されている内容に基づいてトレーニングを進めていきますが、受講者の皆さんにわかりやすくAWSのサービスやシステム構築のイメージをお伝えするための材料として、架空のECサイトを作成してデモ用環境として利用しています。

今回から複数回にわたってAWS Security Essentialsのコースの中で利用しているデモ環境の構築方法についてお伝えしていきます。トレーニングを受講された皆さんに復習で使っていただいたり、トレーニング受講前の予習の資料としてご利用いただけたらと思います。

はじめに

ここで紹介する手順はあくまでもトレーニングの配信時に講義内容を補足する目的で利用するデモ環境を作成するための手順としてご紹介していますので、この手順を商用環境の構築手順として利用しないようお願いいたします。

デモ環境の構成

デモ環境の構成ですが、オープンソースのEC-CUBEというアプリケーションを使って、以下のようなベーシックな負荷分散環境を作っています。

デモ環境で使っているEC-CUBEは商用のEコマースサイトを作成できるアプリケーションです。興味のある方は公式サイトを確認してみてください。

今回は第1弾ということで、EC2とRDS環境の作成部分をお伝えしていきます。

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

セキュリティグループはリソース単位(正確にはENIの単位)のパケットフィルタリングができるFirewallの機能です。セキュリティグループの設定は許可する通信を追加していく許可リスト方式になっていて、拒否リストを記述できません。リストに書いていない通信は全て拒否されるような動作になっています。

また、セキュリティグループの動作はステートフルです。ステートフルな動作とは、セキュリティグループに入ってきた通信が許可リストに入っていれば、その戻りの通信が自動的に許可される仕組みのことです。

デモ環境は先に示した構成図のような三層構造のアーキテクチャになっており、Well-Architected Frameworkのセキュリティの設計原則を意識してそれぞれの階層毎でセキュリティグループを作成しています。

各階層のセキュリティグループでは、以下のような内容の設定を実施していきます。

ロードバランサ用セキュリティグループ設定

ここからは順を追って設定内容を記載していきます。まずは、AWSマネジメントコンソールからEC2のダッシュボードを開いて、左ペインにあるネットワーク&セキュリティとたどって、セキュリティグループを選択します。

セキュリティグループのダッシュボードの右上の方にあるセキュリティグループを作成をクリックします。

表示される画面のセキュリティグループの各項目に設定を入力していきます。

名前 インバウンド設定 アウトバウンド設定
albsg インターネット(0.0.0.0/0)から HTTPのアクセスを許可 デフォルト設定
websg ロードバランサーからEC-CUBEへアクセスを許可 デフォルト設定
dbsg Webサーバからデータベースへアクセスを許可 デフォルト設定

基本設定

基本設定には、セキュリティグループ名、説明、セキュリティグループを配置する(リソースが配置される)VPCを選択します。

インバウンドルール

インバウンドルールには、セキュリティグループの外部から入ってくる通信に対して、プロトコル、ポート番号、通信元のIPアドレスなどの設定を追加してきます。インバウンドルールの、デフォルトの設定は許可が何もない状態(全ての通信を拒否)になっていますので、今回のデモ環境では、必要な通信を許可する設定を入れていきます。ロードバランサのセキュリティグループでは、インターネット(0.0.0.0/0)からの通信をロードバランサで受信(HTTP、ポート80番での通信を許可)できるように設定を入れています。

アウトバウンドルール

アウトバウンドルールには、セキュリティグループの外部に出ていく通信に対して同様の設定を追加していきます。セキュリティグループ内部のリソースからの通信を制限する必要がない場合には、デフォルトの全許可の設定で問題ありません。今回のデモ環境では、特別な外部への通信の制限は必要ないためデフォルトの設定を採用しています。

Webサーバ用セキュリティグループ設定

ここまで、ロードバランサ用のセキュリティグループの設定例を記載しましたが、同様にWebサーバ用(EC2)、データベース用(RDS)のセキュリティグループも設定します。Webサーバ用とデータベース用のセキュリティグループは、それぞれ前段のセキュリティグループからの通信を許可するように設定を入れていきます。以下のスクリーンショットのように、ソースにカスタムを設定して、その隣の入力欄に、Webサーバ用であれば、ロードバランサー用のセキュリティグループIDを入力します。

データベース用セキュリティグループ設定

データベース用であれば、Webサーバ用のセキュリティグループIDを入力します。

セキュリティグループのチェーン

Webサーバやデータベース用のセキュリティグループの様に、別のセキュリティグループからの通信許可を設定することで、ロードバランサーからの通信だけがWebサーバへ許可され、Webサーバからの通信だけがデータベースへ許可される、というように設定することができます。

このようなセキュリティーグループをチェーンするように設定することで、意図した場所に配置されているリソースからの接続のみを許可するように設定できるので便利ですね。

データベースの作成

セキュリティグループの設定が完了したら次はデータベースの作成です。EC-CUBEのデフォルトではデータベースにSQLiteを利用する設定が書かれていますが、MySQLやPostgreSQLなども利用することが可能です。今回のデモ環境ではMySQLを利用するのでその設定をしていきます。

サブネットグループの作成

まずは、データベースを配置するためのサブネットグループを作成していきます。AWSマネジメントコンソールからRDSのダッシュボードを開いて、左側のペインからサブネットグループを選択します。

続いて、DBサブネットグループを作成をクリックしてサブネットグループを作成します。

サブネットグループの詳細

サブネットグループの詳細では、名前、説明、サブネットグループを作成するVPCを設定します。

サブネットを追加

サブネットグループにサブネットを追加します。

構成図を見てお分かりのようにデータベースも複数のアベイラビリティー・ゾーンを利用するMulti-AZの構成を組むために、データベースを配置したい複数のサブネットをサブネットグループに割り当てています。

データベースの作成

サブネットグループの作成が完了したら次にデータベースを作成します。RDSのダッシュボードで、左側のペインからデータベースを選択します。

画面の右上にあるデータベースの作成をクリックしてデータベースを作成します。

データベース作成方法を選択

デモ環境で利用するので不要なオプションを無効に設定したいので標準作成を選択しています。

エンジンのオプション

MySQLのバージョンを5.7.37に設定していますが、EC-CUBEの動作環境として、MySQL5.7.xが対象となっているため、ブログ執筆時点でRDSのMySQLで利用可能な5.7.xの最も新しいリリースを選択しています。

テンプレート

デモ環境ですので、開発/テストを選択しています。

可用性と耐久性

構成図に書いたような複数のアベイラビリティゾーンで可用性を高めたいのでマルチAZ DBインスタンスを選択しています。

設定

DBインスタンスの識別子はデモ用であることがわかる名前にしています。名前やパスワードはお好みで設定してください。

DBインスタンス

インスタンスのクラスもデモ用なのでコストも考えてdb.t3.microを選択しています。

ストレージ

容量も最小のディスク容量、自動拡張をOFFで設定しています。

接続

セキュリティグループをデータベース用のセキュリティグループにする以外はデフォルト設定にしています。

データベース認証

データベース認証はデフォルトのパスワード認証で設定しています。

追加設定

EC-CUBE用のデータベースをeccubeで作成し、バックアップやモニタリングなどデモ環境として必要ないものは全て設定なしにしています。

概算月間コスト

月間の概算コストの表示を確認し、内容に問題がなければデータベースの作成をクリックします。

EC-CUBE環境の作成

冒頭に記載をした構成図のように最終的には2台のEC2インスタンスで負荷分散が図れるような構成にしていきますが、まず1台目を構成までを今回のブログではご紹介します。

Webサーバの作成

EC2のダッシュボードを開いて、左ペインからインスタンスを選択します。

右上の方にあるインスタンスを起動をクリックします。

AMIの選択

AMIはAmazon Linux2を選択しています。

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

デモ用途なのでt2.microを選択しています。

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

1台目のインスタンスは、アベイラビリティゾーン1dのパブリックサブネットを選択して設定しました。他の設定はお好みで。

ストレージの追加

デフォルト設定で作成しています。

タグの追加

デモ環境であることがわかるように、EC2インスタンスのNameタグをEC-CUBE Demo Server1に設定しました。

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

最初に作成したwebsgを設定しています。

確認

設定した内容に問題がなければインスタンスを起動します。EC2インスタンスが起動したらOSにログインをしてEC-CUBEをインストールするための設定をしていきます。

Docker環境の作成

今回ご紹介するデモ環境ではEC-CUBEのDockerイメージを利用して構築をしているため、DockerやGitなどのツール類のインストールを実施します。

Dockerのインストール

$ sudo su - ec2-user
$ sudo yum install -y docker
$ sudo systemctl start docker
$ sudo usermod -a -G docker ec2-user
$ sudo systemctl enable docker

インストール後にDockerの操作権限の反映をさせるため一旦ログアウトして再ログインします。

$ exit
$ sudo su - ec2-user

docker-composeのインストール

docker-composeのバージョンはgithubで確認をしてダウンロードしたいバージョンをURLに指定してください。手順ではこのブログ執筆時点のlatestであるv2.3.3を指定してダウンロードしています。

$ sudo curl -L https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

gitのインストール

EC-CUBEをgithubからダウンロードしてくる際に必要となるgitをインストールします。

$ sudo yum install -y git

EC-CUBEのダウンロード

EC-CUBEをダウンロードするためdockerディレクトリを作成していますがこの辺は皆さんのお好みで実施してください。作成したディレクトリ配下にEC-CUBEをダウンロードします。

$ mkdir docker
$ cd docker
$ git clone https://github.com/EC-CUBE/ec-cube.git

ダウンロードが完了するとec-cubeというディレクトリができていると思いますので、これ以降の設定はec-cube配下に移動して設定を実施します。

$ cd ec-cube

docker-compose.ymlの編集

ダウンロードしたEC-CUBEのdocker-compose.ymlに作成したRDSのデータベースを利用するための設定を実施していきます。今回はenvironmentセクションに記載されている環境変数を以下のように設定しています。設定内容の詳細はEC-CUBE4 開発者向けドキュメントを確認ください。

$ vi docker-compose.yml
DATABASE_URL: "mysql://RDSのマスターユーザ名:RDSのマスターパスワード@エンドポイント/データベース名"
DATABASE_SERVER_VERSION: 5.7
MYSQL_ROOT_PASSWORD: RDSのマスターパスワード
MYSQL_DATABASE: データベース名 ※DBインスタンス識別子ではない
MYSQL_USER: EC-CUBEのインストール時に作成されるDBユーザ名
MYSQL_PASSWORD: EC-CUBEのインストール時に作成されるDBユーザのパスワード
ECCUBE_AUTH_TYPE: HMAC
ECCUBE_ADMIN_USER: "EC-CUBEの管理者ユーザ名"
ECCUBE_ADMIN_PASS: "EC-CUBEの管理者パスワード"
ECCUBE_AUTH_MAGIC: "EC-CUBEの管理者パスワード"
APP_DEBUG: 0

EC-CUBEのセッション情報をDBに格納する設定

公式ドキュメントの記載通りに設定をしています。

$ vi app/config/eccube/packages/session.yaml
services:
    db_session_handler:
        class: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
        public: false
        arguments:
            - '%env(DATABASE_URL)%'

Eccube\Session\Storage\Handler\SameSiteNoneCompatSessionHandler:
    arguments:
        - '@db_session_handler'

起動スクリプト作成

手動でコマンドを実行するのでもいいのですが、起動や停止たびに実行コマンドを全て記載して実行するのも煩わしいのでEC-CUBEを起動するためのスクリプトを作成します。エラー処理などは全くしていませんのでこの辺はよしなに調整してください。

$ vi ec-cube.sh
#!/bin/bash

case $1 in
    "build")
        docker-compose build
        ;;
    "up")
        docker-compose up -d
        ;;
    "console")
        docker container exec -it ec-cube-ec-cube-1 bash
        ;;
    "install")
        docker-compose exec -u www-data ec-cube bin/console eccube:install
        ;;
    "down")
        docker-compose down --volumes --remove-orphans
        ;;
    "start")
        docker-compose start
        ;;
    "stop")
        docker-compose stop
        ;;
esac

実行権限の付与

スクリプトへの実行権限を付与します。

$ chmod +x ec-cube.sh

EC-CUBEのBuild

ダウンロードしてきたEC-CUBEのDockerfileをビルドします。

$ ./ec-cube.sh build

EC-CUBEのコンテナの起動

ビルドしたEC-CUBEのコンテナを起動します。

$ ./ec-cube.sh up

EC-CUBEの初期設定の実施

EC-CUBEの初期設定を実施します。基本的には先に設定しているdocker-compose.ymlの設定内容で初期設定がされますが、プロンプトで確認を求められますので設定に問題がなければEnterキーを押して初期設定を進めてください。

$ ./ec-cube.sh install

EC-CUBE Installer Interactive Wizard
====================================

 If you prefer to not use this interactive wizard, define the environment valiables as follows:

  $ export APP_ENV=prod
  $ export APP_DEBUG=0
  $ export DATABASE_URL=database_url
  $ export DATABASE_SERVER_VERSION=server_version
  $ export MAILER_URL=mailer_url
  $ export ECCUBE_AUTH_MAGIC=auth_magic
  ... and more
  $ php bin/console eccube:install --no-interaction


 Trusted hosts. ex) www.example.com, localhost ...etc [^127.0.0.1$,^localhost$]:
 > <Enter>

 Database Url [mysql://RDSのマスターユーザ名:RDSのマスターパスワード@エンドポイント/データベース名]:
 > <Enter>

 Mailer Url [smtp://mailcatcher:1025]:
 > <Enter>

 Auth Magic [EC-CUBEの管理者パスワード]:
 > <Enter>

 !
 ! [CAUTION] Execute the installation process. All data is initialized.
 !

 Is it OK? (yes/no) [yes]:
 > Yes<Enter>

 Run doctrine:database:create --if-not-exists...
 Database `eccube` for connection named default already exists. Skipped.

 Run doctrine:schema:drop --force...

 Dropping database schema...

 [OK] Database schema dropped successfully!


 Run doctrine:schema:create...

 ! [CAUTION] This operation should not be executed in a production environment!

 Creating database schema...

 [OK] Database schema created successfully!


 Run eccube:fixtures:load...
   > Finished Successful!

 Run cache:clear --no-warmup...

 // Clearing the cache for the dev environment with debug
 // false

 [OK] Cache for the "dev" environment (debug=false) was successfully cleared.



 [OK] EC-CUBE installation successful.


$

セッション情報保存用のテーブルの作成

EC-CUBEの初期設定を実行するとデータベースにスキーマが作成されるのでデータベースにセッション情報を格納するためテーブルを公式サイトのSQL利用して作成します。作成にあたってはRDSのMySQLへ接続が必要になるためMySQLのツールをEC2にインストールします。他に使い慣れたツールがあればそちらを利用しても良いと思います。

MySQL用のツールのインストール

ここではコミュニティ版のMySQL5.7のクライアントをインストールしています。

$ sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
$ sudo yum-config-manager --enable mysql57-community
$ sudo yum-config-manager --disable mysql80-community
$ sudo yum install -y mysql-community-client

セッション保存テーブル作成SQL

公式サイトに記載のあるSQL文をSQLファイルとして作成します。

$ vi create_session_table.sql
CREATE TABLE `sessions` (
    `sess_id` VARCHAR(128) NOT NULL PRIMARY KEY,
    `sess_data` BLOB NOT NULL,
    `sess_time` INTEGER UNSIGNED NOT NULL,
    `sess_lifetime` MEDIUMINT NOT NULL
) COLLATE utf8_bin, ENGINE = InnoDB;

データベースへ接続してSQLを実行

作成したSQLを利用してデータベースへ接続してセッション保存用のテーブルを作成します。

$ mysql --version
$ mysql -h <RDSのエンドポイント> -P 3306 -u admin -p

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| eccube             |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

mysql> use eccube

mysql> source create_session_table.sql
Query OK, 0 rows affected (0.04 sec)

mysql> show tables;
+-------------------------------+
| Tables_in_eccubedemo |
+-------------------------------+
| dtb_authority_role |
| dtb_base_info |
| dtb_block |

(中略)

| mtb_tax_display_type |
| mtb_tax_type |
| mtb_work |
| sessions |     ※このテーブルが作成されます
+-------------------------------+
65 rows in set (0.00 sec)

EC-CUBEへのアクセス確認

ここまでエラーなく実行できればEC-CUBEの構築は完了していますので実施にサイトにアクセスして動作を確認することになります。ここまでの手順で設定をした場合はEC2インスタンスで起動しているEC-CUBEはALB経由でないとアクセスができないようセキュリティグループの設定をしていますのでこのままでは動作確認のための接続ができません。 そのため、一時的な動作確認の用としてtemp-httpというセキュリティグループを作成してEC2インスタンスへ割り当てアクセスを許可します。

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

起動のポート番号を変更していなければEC-CUBEのデフォルトは8080でリッスンしているはずなので8080への接続を許可するように設定をします。この時インターネットに全開放するよりはアクセスするご自身の端末のIPアドレスからのみ接続を許可した方が安心です。

作成したインスタンスへのセキュリティグループの割り当て

作成したtemp-httpセキュリティグループをEC2に割り当てます。EC2インスタンスには複数のセキュリティグループを割り当て可能ですので現在のものに追加でセキュリティグループを割り当てます。

ブラウザからサイトにアクセス

EC2のダッシュボードからインスタンスのパブリックホスト名を確認してブラウザからアクセスをしてサイトが閲覧できれば1台目の構築は完了です。

最後に

今回は1台目のEC2インスタンスでEC-CUBEのインストールと動作確認まで実施しました。トレーニングの振り返りをしつつベーシックな環境の構築方法に関して実際に手を動かして確認していただくと理解が深まると思います。次回は1台目のEC2インスタンスのバックアップを作成してそのバックアップから2台目のEC2インスタンスを作成しロードバランサに組み入れるところまでを解説していきます。