0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】作って学ぶインフラ構築2

Posted at

はじめに

こんにちは、愛知でWEBエンジニアをしているkokuboと申します。

前回の投稿で踏み台サーバーを介して非公開サーバーへアクセスするという基礎的な構築を行いました。今回は「ロードバランサー」や「RDS」、「S3」等を用いてより実践に近い構築を行なっていきたいと思います。

また、次回の投稿では今回のインフラを元に実際にテストアプリをサーバーに上げるところまでをやろうと思います!

ぜひトライしてみてください!

前回の投稿
 【AWS】作って学ぶインフラ構築1

概要

【目標】
 AWSを扱う上で必須なシステムを前回作成したWebサーバー(EC2)と連携し、問題なく動作するかを確認する

 
【学べること】

  • 「ブラウザ」から「Webサーバー」までのネットワークの繋がり
  • データベース管理サービスの利用方法
  • ストレージ管理サービスの利用方法
  • メールサーバーの利用方法

 
【ネットワーク構成】
スクリーンショット 2024-09-01 17.19.37.png

出てくる用語を簡単に

※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アプリによく使用されます
  • 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. 動作確認

nslookupで確認
// 確認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の設定も名前でできるように変更します

.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サーバーを登録する
項目     入力値   
レコード名 web.home         
レコードタイプ A - AIPv4
WebサーバーのIPアドレス
レコードにRDSを登録する
項目     入力値   
レコード名 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の設定も名前でできるように変更します

.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でwebサーバーに入る
ssh webserver
sendmailtest.pyを以下の内容で作成する
# --- 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 アベイラビリティーゾーンの配置:
・スロットルおよびキースペース:均等分散
※次に進むと詳細設定画面に移動しますが、デフォ値でOKです

 
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

 

最後に

ここまで記事を読んでいただきありがとうございました。
これでテストアプリをデプロイする準備が完了しました!ぜひ次の投稿でテストアプリをデプロイしてみてください!

ありがとうございました!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?