
AWSのEC2とかRDSを使ってみる
お久しぶりです。
本日はEC2とRDSを使用してサーバーを構築する入門レベルの内容をお伝えします。
以前は主にサーバーレス環境で開発を行ってきましたが、今回はEC2を使用してサーバーを操作する基礎的な部分に触れていきたいと思います。
以下が今回の作業の概要です。

本日の作業の流れは以下の通りです。
1.VPS周りを設定する
1-1.まずはVPCを作成します

1-2.サブネットを作成する
EC2とRDSの2つが必要なので、合計で3つのリソースを作成します。
● 作成したサブネット一覧
①ec2-rds-app-subnet
②ec2-rds-db-subnet
③ec2-rds-db-sub-subnet

1-3.インターネットゲートウェイを作成

1-4.作成したインターネットゲートウェイをVPCにアタッチ

2.EC2にサーバーを立てる
EC2はAmazon Elastic Compute Cloud (Amazon EC2)の略称であり、クラウド上にサーバーを作ることができるサービスです。
サーバーのスペックを自由に決めて構成することができますし、さまざまなミドルウェアを簡単に組み合わせてサーバー環境を構築することも可能です。
まずはAWSのコンソールからEC2を選択し、AMIを作成します。
お試しの場合はどのAMIでも構いませんが、無料枠の適用されているAmazon Linux 2 AMIを選択しておくことをおすすめします。

選択後、次の画面に進みます。
そこで、無料枠の適用されているt2.microインスタンスタイプを選択します。
EC2の作成時には、先程作成したVPCとサブネットを選択するようにします。

セキュリティグループも一緒に作成してしまいましょう。
2-1.セキュリティグループの設定を行う。
そもそもセキュリティグループって何なのかという話ですが、セキュリティグループはAWSの標準的なファイアウォール機能です。
セキュリティグループでは、インバウンドグループとアウトバウンドグループという2つのグループがあります。
● インバウンド:デフォルトですべて拒否。
未設定の場合通信は全て遮断し、許可した通信のみを通過させます。
● アウトバウンド:デフォルトですべて許可
自動的にデフォルトのセキュリティグループが適用されます。

● インバウンドルール
HTTP:0.0.0.0を設定(全公開)
クライアント側からアクセスするのでHTTPを設定。
SSH:自分のIPを設定
自分のPCからサーバーにSSH接続するのでSSHを設定。
● アウトバウンドルール
デフォルトのまま
その後も細かく色々な設定ができますが、今回はデフォルトのままでAMIの作成を進めます。
簡単ですがこれだけでEC2が作成されました。
SSH接続のためには、keypair.pemというキーペアファイルが必要になりますので、キーペアの作成とダウンロードを忘れずに行いましょう。
4.RDSでDBを作成
次にDBを作成します。
4-1.サブネットグループの作成
その前に、RDSの作成にはサブネットグループの作成が必要ですので、コンソールのサイドバーからサブネットグループの作成を行います。

RDSでは、アベイラビリティーゾーンが2つ必要ですので、2つを選択し、事前に作成しておいたRDS用のサブネットを2つ選択して作成します。
4-2.RDS用のセキュリティグループを追加
RDSへの直接アクセスを制限するため、セキュリティグループに設定を追加し、EC2からのみのアクセスを許可します。
ソースには作成したEC2のセキュリティグループを指定しましょう。
セキュリティグループの設定を行わないまま運用してしまうと、DBのパスワードなどが漏洩した場合に直接DBにアクセスできるインシデントが発生する可能性がありますので、EC2サーバーからの通信のみを許可しましょう。
アウトバウンドルールはデフォルトのままで問題ありません。

いよいよ、AWSのコンソールからRDSを選択し、データベースの作成に進みましょう。
今回はMySQLのデータベースを作成してみます。

DBのマスターユーザー名、マスターパスワード、DBインスタンスサイズ、およびストレージなどの設定を決めていきましょう。

注意点ですが、MySQLへの接続ができるようにするためには、パブリックアクセスを「あり」に設定する必要がありますので、そのように設定しましょう。
最初に作成したVPCと、先程作成したサブネットグループとセキュリティグループを設定します。
これにより、RDSインスタンスが正しくネットワーク内に配置され、必要な通信が許可されます。

ここで1点注意があります。
DB作成時に「Cannot create a publicly accessible DBInstance. The specified VPC does not support DNS resolution, DNS hostnames, or both. Update the VPC and then try again」というエラーメッセージが表示された場合、VPC側のDNSを有効にする必要があります。
VPC側のDNSを有効にしておかないとDBの作成が行えないため、事前にVPCでDNSを有効にしておく必要があります。
作成が完了したら、DBのエンドポイントをメモしておきましょう。

簡単ですが、これでRDSでのDB作成が完了しました。
準備が整ったので、まずはEC2へのSSH接続を試してみましょう。
SSH接続を行うために、事前にローカルPCのconfig設定を行います。
$ cd ~/.ssh
EC2作成時にDLしたec2_keypair.pemを配置する
$ vi config
```
Host ec2 // ssh ec2のように接続できる任意名を入れる。
HostName // EC2のホスト名 → EC2インスタンスのパブリック IPv4 DNSが入る。
User ec2-user // デフォルトのユーザー。
IdentityFile ~/.ssh/ec2_keypair.pem // 配置したpemを参照。
```
これでSSH接続の準備ができました。
$ ssh ec2
sshコマンドを入力すると、EC2サーバーにSSH接続できるようになっています。
ec2-userでSSH接続した後、都度rootユーザーに切り替えることもできますが、毎回行うのが面倒です。
そのため、rootユーザーでのSSH接続を可能に修正します。
// EC2に入る
$ ssh ec2
// rootユーザーに切り替える
$ sudo su -
// rootのauthorized_keyをバックアップ
$ cp /root/.ssh/authorized_keys /root/.ssh/authorized_keys.bk
// ec2-userのauthorized_keyをroot側のauthorized_keyに上書き
$ cp /home/ec2-user/.ssh/authorized_keys /root/.ssh/authorized_keys
// SSHサーバを再起動
$ sudo service sshd restart
$ exit;
$ cd ~/.ssh
$ vi config
```
Host ec2
HostName // EC2のホスト名
User root // ← rootに変更する
IdentityFile ~/.ssh/ec2_keypair.pem
```
これにより、SSH接続時のデフォルトユーザーをrootユーザーとして接続できるようになりました。
5.EC2からRDSに接続する
$ sudo yum install mysql // MySQLをインストール
.
.
.
Complete!
mysqlのインストールが完了しました。
$ mysql -u 設定したユーザー名 -p -h 作成時にメモしていたRDSのエンドポイントを張り付け
Enter Passwordと表示されるので、RDSデータベース作成時に設定したパスワードを入力します。
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 5323
Server version: 8.0.20 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
これにより、EC2サーバーからMySQLへの接続が確立されました。
その後、このEC2サーバーにNginxやPHPをインストールし、クライアントからMySQLへのデータのCRUD処理を行うことで、Webアプリケーションを作成できます。
比較的簡単に環境を構築できたと思います。
最近のフロントエンドでは、サーバーについてあまり意識しないことが多いですが、こうした基本的なサーバー構築に触れることはエンジニアとして非常に重要です。
それでは。