ドメイン取得およびSSL/TLSサーバ証明書取得しWebサイト(EC2:Tomcat+RDS)を構築する
Route53でドメイン取得し、CertificateManagerによりWebサーバに対するSSL/TLSサーバ証明書を取得し、WebサイトをEC2:TomcatとRDSで構築する。
目次
1.概要
Route53で新規ドメインを取得し、
CertificateManagerによりWebサーバ(www)に対するSSL/TLSサーバ証明書(無償)を取得する。
サーバ証明書をELB(ALB)に設定し、マルチAZ構成かつHTTPSでアクセス可能なWebサイト(EC2:Tomcat+RDS)を構築する。
2.構成図
構成図は以下の通り。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_abstract.png)
3.構築手順
以下手順で構築する。
3-1.EC2インスタンスを作成する
以下の構成でEC2インスタンスを作成する。
AMI | CentOS Linux 7 x86_64 HVM EBS ENA 1805_01 |
インスタンスタイプ | t2.micro |
サブネット | ap-northeast-c1 |
自動割り当てパブリック IP | 有効 |
パブリックIPを控える。※起動する毎に動的に変更される
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_ec2_publicip-1-1024x550.png)
EC2インスタンスCentOSへJava及びTomcatを導入し、パブリックIPでアクセス可能であることを確認する
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_ec2_tomcat-1024x625.png)
サンプルwarファイルを作成しておき、tomcatにデプロイする。(以下はjspファイルのみ抜粋)
サンプルwarでは以下を表示させることとした。
- サーバ上の現在日時
- サーバのホスト名
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
response.setDateHeader ("Expires", 0);
%>
<html>
<head>
<meta charset="UTF-8">
<title>HelloWorldApp</title>
</head>
<body>
<body>
<p><%= new java.util.Date() %></p>
<p><%= java.net.InetAddress.getLocalHost().getHostName() %></p>
</body>
</html>
サンプルアプリへアクセスできることを確認する
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_ec2_sampleapp-1-1024x626.png)
3-2.RDSインスタンスを作成する
以下の要領でRDSインスタンスを作成する。
エンジンのタイプ | MySQL |
エディション | MySQL Community |
バージョン | MySQL 8.0.20 |
DBインスタンスクラス | db2.t2.micro |
RDSの構築が完了したらEC2からRDSへログインし、テーブル作成をする。
RDSのエンドポイント名をコピーする。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_rds_endpoint-1024x562.png)
EC2にログインし、必要なパッケージをインストールする。
sudo yum -y install mysql
mysqlコマンドにて接続し、テーブル作成、データ登録する。
以下の要領でDB設定を行った。
- M_USERというテーブルを作成
- ユーザID、ユーザ名を列として持つ
- テストデータとして “t_yamada”, “山田太郎”を登録
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_rds_term.png)
以下ソースコードからwarファイルを作成しておき、EC2上のtomcatにデプロイする。
※ServletにてDB接続を行い、ユーザ名を取得するようにした。
@WebServlet("/sample")
public class HelloWorld extends HttpServlet{
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
String url = "jdbc:mysql://mysql8-test.chefzrjnu934.ap-northeast-1.rds.amazonaws.com:3306/mysql_test1";
String user = "*******";
String password = "************";
String sql = "SELECT USER_ID, USER_NAME FROM M_USER WHERE USER_ID=?";
String sqlResult = "";
try {
Class.forName("com.mysql.jdbc.Driver");
try (Connection con = DriverManager.getConnection(url, user, password)) {
try(PreparedStatement ps = con.prepareStatement(sql)) {
ps.setString(1, "t_yamada");
try(ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
sqlResult = rs.getString("USER_NAME");
}
}
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
request.setAttribute("msg", sqlResult);
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Hello.jsp");
dispatcher.forward(request,response);
}
}
サンプルwarでは以下を表示させることとした。
- サーバ上の現在日時
- サーバのホスト名
- ServletでDB接続を行い取得したユーザ名
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
response.setDateHeader ("Expires", 0);
%>
<html>
<head>
<meta charset="UTF-8">
<title>HelloWorldApp</title>
</head>
<body>
<body>
<p><%= new java.util.Date() %></p>
<p><%= java.net.InetAddress.getLocalHost().getHostName() %></p>
<p><%= request.getAttribute("msg") %></p>
</body>
</html>
EC2にwarファイルを配布してブラウザからアクセスし、動作を確認する。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_rds_sampleapp-1024x640.png)
3-3.ALBを設定する
ALBにて負荷分散をさせるため、EC2インスタンスを複製する。
その際、アベイラビリティゾーンは別となるように構築する。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_alb_az-1024x548.png)
ALBを以下の要領で作成する。
ロードバランサーの種類 | Application Load Balancer |
ルーティングの設定(プロトコル) | HTTP |
ルーティングの設定(ポート) | 8080 |
ALBのtargetsを参照し、アベイラビリティゾーンが別となっていること、ステータスがhealthyとなっていることを確認する。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_alb_targets-1024x548.png)
ALBのエンドポイント名をコピーする。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_alb_endpoint-1024x548.png)
ブラウザのURLにてコピーしたエンドポイント名を指定し、アクセスする。サンプルwarの画面にEC2のホスト名が表示された。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_alb_sampleapp-1024x626.png)
もう一度アクセスすると、ラウンドロビンされてもう一方のEC2のホスト名が表示された。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_alb_sampleapp2-1024x627.png)
3-4.Route53にてドメインを入手する
AWSでドメインを購入する。今回は「z-frontier.com」とする。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_route53_cart-1024x564.png)
必要な情報を登録するとメールが届き、メールのリンクをクリックすると登録が完了する。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_route53_verification-1024x599.png)
使えるドメインとして登録された。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_route53_registration-1-1024x573.png)
ドメインに対してシンプルルーティングレコードを追加し、ALBへルーティングするよう設定する。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_route53_simplerecord-1024x553.png)
3-5.CertificateManagerでサーバ証明書を発行する
CertificateManagerにて証明書のリクエストをする。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_acm_request-1024x572.png)
証明書とドメイン名を紐づけする。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_acm_adddomainname-1024x572.png)
登録完了。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_acm_registered-1024x533.png)
3-6.ALBの設定修正と動作確認
ALBに対して、HTTPSからの接続が可能なようにリスナーを追加する。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_alb2_listner-1024x548.png)
ブラウザでhttps://www.z-frontier.comでアクセス可能なことを確認する。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_alb2_sampleapp-1024x627.png)
ブラウザからサーバ証明書の詳細情報を確認してみると以下のようになっている。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_alb2_certification_info.png)
httpでの経路は不要なので、リスナーを削除する。
![](https://www.a-frontier.jp/wp/wp-content/uploads/2020/11/aws09_alb2_listner2-1024x548.png)
以上。