はじめに
こんにちは、愛知でWEBエンジニアをしているkokuboと申します。
前回の投稿で踏み台サーバーを介して非公開サーバーへアクセスするという基礎的な構築を行いました。今回は「ロードバランサー」や「RDS」、「S3」等を用いてより実践に近い構築を行なっていきたいと思います。
また、次回の投稿では今回のインフラを元に実際にテストアプリをサーバーに上げるところまでをやろうと思います!
ぜひトライしてみてください!
前回の投稿
【AWS】作って学ぶインフラ構築1
概要
【目標】
AWSを扱う上で必須なシステムを前回作成したWebサーバー(EC2)と連携し、問題なく動作するかを確認する
【学べること】
- 「ブラウザ」から「Webサーバー」までのネットワークの繋がり
- データベース管理サービスの利用方法
- ストレージ管理サービスの利用方法
- メールサーバーの利用方法
出てくる用語を簡単に
※AWSでは略された用語がよく出てくるので、英語に展開すると意味が理解しやすいと思います。
- ロードバランサー(今回は「Application Load Balancer」)
- 複数サーバーへ負荷を分散させる
- WebサーバーよりもSSL処理の処理が早い
- 不正アクセス対策
- RDS (Relational Database Service)
- クラウド上で簡単にリレーショナルデータベースを利用できるサービス
- S3 (Simple Storage Service)
- 写真やWebサイト等、あらゆるデータを格納できるオブジェクトストレージサービス
- Route53
- ドメイン名の取得
- DNSサービス
→ドメイン名からIPアドレスを決定するサービス
- SES (Simple Email Service)
- メール送信サービス
手順1:ロードバランサーの作成
1. 以下の設定でセキュリティーグループを作成する
項目 | 入力値 |
---|---|
名前 | alb-sg |
説明 | alb-sg |
VPC | vpc-study ※前回作成したVPCを使用 |
ルール |
・インバウンドルール1 タイプ:HTTP ソース0.0.0.0/0 ・インバウンドルール2 タイプ:HTTPS ソース0.0.0.0/0 ・アウトバウンドルール デフォルト設定 |
2. EC2>ロードバランサーの画面から「ロードバランサーの作成」を押下し、以下の項目を入力する
項目 | 入力値 |
---|---|
種類 | Application Load Balancer |
名前 | alb-study |
スキーム | インターネット向け(デフォルト) |
IPアドレスタイプ | IPv4(デフォルト) |
VPC | vpc-study |
マッピング | AZ:ap-northeast-1a サブネット:public-subnet-study |
セキュリティーグループ | alb-sg |
リスナーとルーティング |
プロトコル:HTTP ポート:80 デフォルトアクション:「ターゲットグループの作成」を押下 |
3.ターゲットグループの作成
「ターゲットグループの作成」を押下したときに以下の設定で作成する
項目 | 入力値 |
---|---|
ターゲットタイプ | インスタンス(デフォルト) |
ターゲットグループ名 | tg-study |
プロトコル:ポート | HTTP:3000 |
IPアドレスタイプ | IPv4(デフォルト) |
VPC | vpc-study |
プロトコルバージョン | HTTP1(デフォルト) |
ヘルスチェック | デフォルト設定 |
4. ターゲットの登録
前回作成したEC2(web-ec2)を登録する
5. ロードバランサーの設定画面に戻り、転送先に上記で作成したターゲットグループを選択する
【ロードバランサーには種類がたくさんある?】
実はAWSには4種類のロードバランサーが用意されています。
- Application Load Balancer(ALB) ※今回使用します
- HTTP・HTTPSによるアクセス分散を得意とするロードバランサーで、URLのパターンで向き先を変更することもできる
→Webアプリによく使用されます
- HTTP・HTTPSによるアクセス分散を得意とするロードバランサーで、URLのパターンで向き先を変更することもできる
- Network Load Balancer(NLB)
- 大量のデータを短時間で処理し応答することが得意なロードバランサー
- 動画配信サービスやオンラインゲームに最適
- Gateway Load Balancer(GWLB)
- 外部のセキュリティーシステムとの統合が得意なロードバランサー
- Classic Load Balancer
- 古いロードバランサーで新規利用されることがない
手順2:ロードバランサーの動作確認
1. sshで作成したEC2(web-ec2)に接続し、htmlファイルを作成する
※「webserver」は「.ssh/config」で設定されています
// サーバーに入る(前回.ssh/configで設定したものを使用)
ssh webserver
// viコマンドでファイルを作成
vi inex.html
//ファイルの中身
<html><body>Hello World</html></body>
2. PythonでHTTPサーバーを起動する
// サーバー起動
python -m SimpleHTTPServer 3000
// 起動が完了するとロードバランサーからのヘルスチェックのログが表示される
Serving HTTP on 0.0.0.0 port 3000 ...
10.0.40.176 [06/sep/2024 10:23:11] "GET / HTTP/1.1" 200 -
10.0.40.176 [06/sep/2024 10:23:23] "GET / HTTP/1.1" 200 -
10.0.40.176 [06/sep/2024 10:23:32] "GET / HTTP/1.1" 200 -
3. 作成したロードバランサーの「DNS名」を使用してブラウザでアクセスし、「Hello World」が表示されていることを確認する
手順3:RDSを作成する
【RDSの仕組み】
RDSは以下の4つで構成されています。基本的には全て必要な設定ですので全て使用して作成していきます。
- データベース
- PostgresやMySQLなどがある
- パラメータグループ
- データベースのチューニングができる
- オプショングループ
- RDSの固有設定、データベースのバージョンが選択できる
- サブネットグループ
- 複数のAZ(アベイラビリティーゾーン)に分散させて設定するときに使用
1. パラメータグループの作成する
項目 | 入力値 |
---|---|
パラメータグループ名 | sample-db-pg |
説明 | sample parameter group |
エンジンのタイプ | MySQL Community |
パラメーターグループ ファミリー |
mysql8.0 |
2. オプショングループの作成
項目 | 入力値 |
---|---|
パラメータグループ名 | sample-db-og |
説明 | sample option group |
エンジン | mysql |
メジャーエンジンバージョン | 8.0 |
3. サブネットグループの作成
項目 | 入力値 |
---|---|
名前 | sample-db-subnet |
説明 | sample db subnet |
VPC | 前回作成したVPCを選択 |
アベイラビリティーゾーン | ap-northeast-1a |
サブネット | 前回作成したプライベートサブネットを選択 |
4. データベースの作成
※記載のない設定はデフォ値を選択してください
項目 | 入力値 |
---|---|
データベースの作成方法 | 標準作成 |
エンジンのタイプ | MySQL |
テンプレート | 無料利用枠 |
可用性と耐久性 | 単一のDBインスタンス |
DBクラスター識別子 | sample-db |
マスターユーザー名 | admin |
認証情報管理 | セルフマネージメント |
マスターパスワード | 任意の長い文字列 ※できるだけ推測されづらいもの |
テンプレート | 無料利用枠 |
インスタンスの設定 | db.t3.micro |
VPC | 前回作成したVPC |
サブネットグループ | sample-db-subnet ※[3.]で作成したサブネット |
5. RDSの動作確認
sshで作成したEC2(web-ec2)に接続し、mysqlコマンドのインストールとRDSに接続を行う
※接続には作成したRDSの「エンドポイント」を使用します
// サーバーに入る
ssh webserver
// MySQLコマンドのインストール
sudo yum -y install mysql
// RDSに接続(エンドポイントは例です)
mysqladmin ping -u admin -p -h sample-db.cginsnmcx6vh.ap-northeast-1.rds.amazonaws.com
// 「Enter password」で表示されるので作成したパスワードを入力してEnterを押す
mysql is alive // これが表示されれば接続OK
手順4:S3の作成
1. 以下の内容でS3パケットを作成する
項目 | 入力値 |
---|---|
AWSリージョン | アジアパシフィック(東京) |
パケット名 | sample-upload |
ブロックパブリックアクセス設定 | パブリックアクセスをすべて ブロック |
2. webサーバーからS3にアクセスするためのロール(権限)をIAMから作成する
項目 | 入力値 |
---|---|
ユースケース | EC2 |
許可ポリシー | AmazonS3FullAccess ※AWSが用意している権限です |
ロール名 | sample-role-web |
3. 作成したロールを「作成したインスタンス>アクション>セキュリティ>IAMロールを変更」からEC2にロールを指定する
4. EC2でテキストファイルを作成し、「aws s3 cp」コマンドでS3に作成したファイルを保存する
// サーバーに入る
ssh webserver
// テキストファイルを作成(中身は任意の文字列を入れてください)
vi test.txt
// S3に保存
aws s3 cp test.txt s3:sample-upload/test.txt
5. S3にアクセスをして「test.txt」が出来上がっていることを確認する
手順5:Route53の作成
【※注意】
この記事で説明する「ドメイン名」を購入(約2,000円)すると払い戻しができません。1年後に再購入するかドメインを手放すかの選択をする必要があります。「パブリックDNSのホストゾーン」を作成し12時間以上使用すると料金がかかってしまうので、作成後には削除をお願いします。
1. Route53>登録済みドメインからドメインを購入する
連絡先に入力した内容は「whois」で検索できないようにするため、プライバシー保護を有効化にしてください
例)aws-intro-sample-2nd.com
2. パブリックDNSの作成
ドメインの購入と同時に「ホストゾーン」が作成されるので、「レコードを作成」から踏み台サーバーとロードバランサーの情報を追加する
項目 | 入力値 |
---|---|
レコード名 | bastion |
レコードタイプ | A - IPv4 |
エイリアス | OFF ※IPアドレスを「値」に入力する時はOFF |
値 | 踏み台サーバーのパブリックIPv4アドレス |
項目 | 入力値 |
---|---|
レコード名 | www |
レコードタイプ | A - IPv4 |
エイリアス | ON |
トラフィックのルーティング先 |
Application Load Balancer と... アジアパシフィック(東京) 作成したロードバランサーを選択 |
3. 動作確認
// 確認1:踏み台サーバー
nslookup bastion.aws-intro-sample-2nd.com
// 結果====================
Server: UnKnown
Address: 10.211.55.1
Non-authoritative answer:
Name: bastion.aws-intro-sample-2nd.com // 登録したホストが表示されていることを確認
Address: IPアドレス // 踏み台サーバーのパブリックIPアドレスが表示されていることを確認
// ====================
// 確認2:ロードバランサー
nslookup www.aws-intro-sample-2nd.com
// 結果====================
Server: UnKnown
Address: 10.211.55.1
Non-authoritative answer:
Name: www.aws-intro-sample-2nd.com // 登録したホストが表示されていることを確認
Address: IPアドレス // ロードバランサーが返しているIPアドレスが表示されていることを確認
// ====================
4.サーバーにドメイン名がついたので、.ssh/configの設定も名前でできるように変更します
// 設定値
Host bastion
HostName bastion.aws-intro-sample-2nd.com // 変更箇所:元々はIPアドレス
User ec2-user
IdentityFile ~/.ssh/bastion-ssh-key.pem
ForwardAgent yes
// サーバーに入って確認
ssh bastion
5. プライベートDNSの作成
以下の内容でホストゾーンを作成し、レコードを追加で「EC2」と「RDS」の情報を入力してください
項目 | 入力値 |
---|---|
ドメイン名 | home |
タイプ | プライベートホストゾーン |
リージョン | アジアパシフィック(東京) |
VPC ID | 作成したVPC |
項目 | 入力値 |
---|---|
レコード名 | bastion.home |
レコードタイプ | A - AIPv4 |
値 | 踏み台サーバーのIPアドレス |
項目 | 入力値 |
---|---|
レコード名 | web.home |
レコードタイプ | A - AIPv4 |
値 | WebサーバーのIPアドレス |
項目 | 入力値 |
---|---|
レコード名 | db.home |
レコードタイプ | CNAME |
値 | RDSのエンドポイント |
6. 名前解決ができているかを確認する(Webサーバー)
※プライベートDNSはVPCの中でしか確認できないので踏み台サーバー上で名前確認をしてください
// 踏み台サーバーに接続
ssh bastion
// 確認1:Webサーバー
nslookup web.home
// 結果====================
Server: 10.0.0.2
Address: 10.0.0.2#53
Non-authoritative answer:
Name: web.home
Address: IPアドレス // webサーバーのIPアドレス
// ====================
// 確認2:RDS
nslookup db.home
// 結果====================
Server: 10.0.0.2
Address: 10.0.0.2#53
Non-authoritative answer:
db.home canonical name = sample-db.cginsnmcx6vh.ap-northeast-1.drs.amazon.coom
Name: sample-db.cginsnmcx6vh.ap-northeast-1.drs.amazon.coom
Address: 10.0.92.62 // RDSの内部の仕組みにより値が変わる、エンドポイントは変わらないのでOK
// ====================
7.webサーバーにドメイン名がついたので、.ssh/configの設定も名前でできるように変更します
// 設定値
Host webserver
HostName web.home //変更箇所
User ec2-user
IdentityFile ~/.ssh/bastion-ssh-key.pem
ProxyJump bastion
// サーバーに入って確認
ssh webserver
注意
ssh接続したときに以下のようなメッセージが表示される場合があります。
これは今までアクセスしていた「ホストネーム」が変更され悪意のある別サーバーに接続しているかもしれないという警告です。
.ssh/known_hostから「web.home」の行を削除するか、ファイル自体を削除してください
メッセージ:
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
手順6:SSLサーバー証明書を発行し、ブラウザからHTTPS通信ができるようにする
1. AWS Certificate Managerから「証明書をリクエスト」を押下し、以下の内容を入力して発行までを行う
項目 | 入力値 |
---|---|
証明書タイプ | パブリック証明書をリクエスト |
完全修飾ドメイン名 | www.aws-intro-sample-2nd.com |
検証方法 | DNS検証 |
2.作成された証明書を選択し、「Route 53でレコードを作成」を押下すると5~10分くらいで証明書のスタータスが「発行済み」になります
3.作成したロードバランサー(alb-study)に以下の内容で「リスナー」を追加する
項目 | 入力値 |
---|---|
Protocol、Posrts | Protocol:HTTPS Ports:443 |
ターゲットグループ | sample-tg |
Default SSL/TSL sertificate | 先ほど作成したSSL証明書を選択 |
4.ブラウザで動作確認
// 「手順2」で作成した「Hello World」が表示されます
https://www.aws-intro-sample-2nd.com/
手順7:Amazon SES(メールサーバー)を作成
1. 「SES>設定>ID」から「IDの作成」を押下し、メール用のドメインの追加する
※自動的にRoute53にDKIMのレコードが追加され、問題がなければ1~10分でステータスが「検証済み」または、「成功」に更新されます
項目 | 入力値 |
---|---|
IDタイプ | ドメイン |
ドメイン | aws-intro-sample-2nd.com |
カスタム MAIL FROM ドメインの使用 | チェックを入れる |
IDタイプ(DKIM の詳細設定) | Easy DKIM |
DKIM署名キーの長さ | RSA_2048_BIT |
DNSレコードのRoute53への発行 | 有効化にチェック |
DKIM署名 | 有効化にチェック |
2.同じように「IDの作成」からテスト用メールアドレスの追加
※追加後、指定したメールアドレスに認証用のURLが届くのでURLを開けば登録完了です
項目 | 入力値 |
---|---|
IDタイプ | Eメールアドレス |
Eメールアドレス | gmailなどの自分が使用しているアドレス |
3. テストメールを送信する
IDの一覧画面で「1.」で作成したドメインにチェックを入れて「テストEメールの送信」を押下し、以下の内容で送信すると「カスタム受信者」にメールが送信される
項目 | 入力値 |
---|---|
Eメール形式 | フォーマット済み |
From-address | ses-test-mail |
シナリオ | カスタム |
カスタム受信者 | 「2.」で追加した自分メールアドレス |
件名・本文 | 件名:テスト件名 本文:テスト本文 |
4.アプリからメールを送信できるよう「SMTP設定」からSMTP認証情報の作成を押下し、SMTP送信専用のIAMアカウントを作成・認証情報のダウンロードを行う
項目 | 入力値 |
---|---|
ユーザー名 | ses-test-mail |
5. WEBサーバーにメールを送信するプログラムを作成し、テスト送信を行う
ssh webserver
# --- config: utf-8 ---
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email import charset
# 各種情報
account = '*****************' ----------- ①
password ='*****************' ----------- ②
server = '*****************' ----------- ③
from_addr = 'ses-test-mail@<ドメイン名>'
to_addr = '<認証したメールアドレス>'
# SMTPサーバーに接続する
con = smtplib.SMTP(server, 587)
con.set_debuglevel(1)
con.starttls()
con.login(account, password)
# 送信するメールのメッセージを作成する
cset = 'utf-8'
message = MIMEText('SMTPのテスト', 'plain', cset)
message['Subject'] = Header(u'SMTP経由での電子メール送信のテストです', cset)
message['From'] = from_addr
message['To'] = to_addr
# メールを送信する
con.sendmail(from_addr, [to_addr], message.as_string())
# SMTPから切断する
con.close()
※①、②は、認証情報のダウンロードした際のアカウント名とパスワードを入力します。③には、SMTPのエンドポイントに記述されているものをそのままコピーします。(SMTP設定画面により確認)
Pythonコマンドを実行してメールを送信する
python3.7 sendmailtest.py
6. 「Eメール受信」からメールの受信のルールセットの作成を行う
項目 | 入力値 |
---|---|
ルール名 | sample-ruleset |
7. 作成したルールセットを押下し、「ルールを作成」から以下の内容を登録する
項目 | 入力値 |
---|---|
ルール名 | sample-rule-inquiry |
受信者の条件 | inquiry@aws-intro-sample-2nd.com |
S3バケット名 | 「aws-intro-sample-2nd-mailbox」を作成する |
8. Route53にMXレコードの追加
項目 | 入力値 |
---|---|
レコード名 | 空欄 |
値 | 10 inbound-smtp.ap-northeast-1.amazonaws.com ※エイリアスはOFF |
9. サンドボックス外に移動するため、SESダッシュボードから「本番アクセスをリクエスト」を押下して以下の内容を入力する
※作成後にAWS担当者からメールが届き、サンドボックス外に移動したことが確認できる
項目 | 入力値 |
---|---|
メールタイプ | トランザクション |
WebサイトのURL | なし |
ユースケースの説明 | ユーザー登録を行うときのメールアドレスの確認のために利用します。 |
その他の連絡先 | inquiry@aws-intro-sample-2nd.com |
連絡する際の希望言語 | Japanese |
手順8:キャッシュサーバーを準備する
1. 「ElasticCache>Redis OSSキャッシュ」からRedisキャッシュを作成する
項目 | 入力値 |
---|---|
デプロイオプション | 独自のキャッシュを設計 |
作成方法 | クラスターキャッシュ |
クラスターモード | 有効 |
クラスター情報 | 名前:sample-elasticache |
ロケーション | AWSクラウド マルチAZ:有効化 |
クラスター設定 |
エンジンバージョン:7.1 ポート:6379 パラメータグループ:default.redis7.cluster.on ノードのタイプ:cache.t3.micro レプリケーション数:2 マルチAZ:有効化 |
接続性 |
ネットワークタイプ:IPv4 サブネットグループ:新しいサブネットグループを作成 名前:sample-elasticache-sg VPC:以前作成したVPC アベイラビリティーゾーンの配置: ・スロットルおよびキースペース:均等分散 |
2. 動作確認
// sshでEC2に接続
ssh webserver
// redis-cliコマンドのインストール
amazon-linux-extras list
sudo amazon-linux-extras install redis7
// 作成したredisのエンドポイントを使用してコマンドでElasticCacheを確認する
redis0cli -c -h redisのエンドポイント
// キャッシュサーバー内のオブジェクトを削除する
flushall
// 「key1」というキーで「hello world」という文字を保存する
set key1 "hello world"
// 保存したキーの有効期限を10秒にする
expire key1 10
// 10秒経つ前にキーを確認
get key1
// 10秒以上経ってからキーを確認→取得できない
get key1
// 終了
exit
最後に
ここまで記事を読んでいただきありがとうございました。
これでテストアプリをデプロイする準備が完了しました!ぜひ次の投稿でテストアプリをデプロイしてみてください!
ありがとうございました!