1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【AWS】S3とRoute53についてまとめてみた

Last updated at Posted at 2021-05-15

S3とは?

Simple Strage Serviceが正式名称であり、Sが3つ並ぶことからS3と呼ばれます。
オブジェクトストレージサービスであり安価で非常に耐久性が高いです。

オブジェクトストレージ(HTTPS接続)とは?

HTTPSのプロトコルで通信するためセキュリティは非常に強固です。
ただEBS(ブロックストレージ=SCSI(スカジー)接続)やEFS(ファイルサーバー=LAN接続)と比べて読み書き速度が遅いです。
ですが、多数の大きなファイルを取り扱うのに向いており、またAPIを使用した開発も簡単です。

S3のイメージ構造

バケットの下にフォルダやデータを設置する。
頂点のフォルダをバケット、フォルダーをプリフィクス、データをオブジェクトという。

test.png

例えば、バケット名がsample、プリフィクス名がfolder1、データがphoto.jpgだった場合、
アクセスURLは、**https://sample.s3-ap-northeast-1.amazonaws.com/forder1/photo.jpg**となります。

セキュリティ

デフォルトではアカウント管理者及びルートユーザーのみアクセスが可能です。
権限管理はIAMで行います。
特定のIPアドレスのみ許可することや、アカウント単位、バケット単位、オブジェクト単位で設定することが可能です。

ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListBucketRstIP",
      "Effect": "Allow",
      "Principal": "*", // すべての権限を委譲されたサービス
      "Action": "s3:ListBucket", //s3のバケットを参照できる
      "Resource": "arn:aws:s3:::sample-bucket", // s3のsample-bucketに対して
      "Condition": {
        "StringEquals": {
          "aws:SourceIp": "12.34.56.789" // IPアドレスを指定
        }
      }
    }
  ]
}

静的ホスティング機能

test.png

ストレージクラス

ストレージクラス 説明
標準 デフォルトのストレージクラス
標準-IA 標準に比べたらオブジェクト格納料金が安価。しかしデータの読み出しに課金される
Intelligent-Tiering 使用量に合わせて調整してくれる
1 ゾーン-IA 標準-IA よりも安価。データの冗長率が低く、データの読み出しに課金される
Glacier とても安いが、データの読み出しに課金及び数分〜数時間かかる
Glacier Deep Archive さらに安いが、データの読み出しに課金及び長時間(12 時間以内)かかる

コストに関して

保管料

どのストレージプランを採用するのかで変わる

転送量

受信・同一リージョンのAWSサービスとの連携は無料、送信は課金されます。

リクエスト料

GET/PUT/POST/LIST/COPYなどのリクエスト数によって課金されます。

Route53とは?

フルマネージド型のDNSサービスです。

draw.png

ルーティングポリシーとは?

①シンプルルーティング

基本的にはシンプルルーティングを採用する。
テスト環境で構築して完成したらRoute 53を通す。
draw.png

②加重ルーティング

1つのLBに80%、もう1つのLBに20%ルーティングをさせる。
使用ケースとしては、ABテストです。

③レイテンシールーティング

複数のリージョンでサービスを提供するときに使います。
例えば東京リージョンには100msで流せるが、米国西部には400msかかるときは、
東京リージョンを優先するという感じです。

④位置情報ルーティング

先ほどは応答速度で判断するが、これはクライアント側の現在地によってリージョンが変化します。
米国在住の場合は、米国西部に、日本在住の場合は東京にという感じです。

⑤複数値回答ルーティング

ロードバランサーに似た仕組み。

⑥フェイルオーバールーティング

エラーが出た際に、ドメインに通信してくださいという優先順位を決めることができる=つまりヘルスチェックが可能になる。

レコードとは?

これら5つをまとめてホストゾーンと呼ぶ。

Aliasレコード

ドメインとAWSサービスの関連付けを行う。

Aレコード

ドメインとIPv4アドレスの関連付けを行う

AAAAレコード

ドメインとIPv6アドレスの関連付けを行う

NSレコード

ドメイン情報を管理するサーバー

SOAレコード

ドメインの管理情報

それでは、ハンズオンをやっていきましょう!

アーキテクチャ

aws.png

1. AWSへログイン

2. 東京リージョンになっていることを確認

スクリーンショット 2021-05-01 14.21.09.png

3. VPCを作成(IP:10.0.0.0/21)

■ルート
コンソールで「VPC」と検索→左ペイン内の「VPC」を選択→「VPCを作成」を選択

スクリーンショット 2021-05-01 14.24.26.png

4. サブネットを作成(IP:10.0.0.0/24, 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24)

■ルート
コンソールで「VPC」と検索→左ペイン内の「サブネット」を選択→「サブネットを作成」を選択

Public Subnetを作成

WordPressに使うサブネットを作成します。

スクリーンショット 2021-05-01 14.27.32.png

Private Subnetを作成

RDB(MySQL)に使うサブネットを作成します。

スクリーンショット 2021-05-01 14.29.17.png

5. Publicサブネットをインターネットに接続するためにInternet Gatewayを作成

■ルート
コンソールで「VPC」と検索→左ペイン内の「インターネットゲートウェイ」を選択→「インターネットゲートウェイの作成」を選択

スクリーンショット 2021-05-01 14.43.36.png

これではVPCとアタッチできていないので、インターネットへ接続できません。
なのでアタッチさせましょう!
スクリーンショット 2021-05-01 14.44.44.png
これでアタッチしました。

6. EC2がインターネット接続するためにルートテーブルを作成

■ルート
コンソールで「VPC」と検索→左ペイン内の「サブネット」を選択→「Public-Subnet1」を選択→「ルートテーブル」を選択→「ルート」へ移動→「ルートを編集」を選択

スクリーンショット 2021-05-01 14.49.14.png

7. Publicサブネット内にEC2を構築

■ルート
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「インスタンスを起動」を選択

■ステップの流れ
STEP1 Amazon Linux 2 AMI
STEP2 t2.micro
STEP3 「ネットワーク」、「サブネット」、「パブリックIP」を変更
スクリーンショット 2021-05-01 14.35.10.png
STEP4 そのままでOK
STEP5 Name=WEBSERVER1で設定
STEP6 セキュリティグループを変更
スクリーンショット 2021-05-01 14.37.57.png
STEP7 キーペアの作成
スクリーンショット 2021-05-01 14.38.49.png

SSH接続でログイン

ターミナル
// ①キーペアがあるところへ移動
$ cd desktop

// ②キーペア発見
$ ls -l keypair.pem
-rw-r--r--@ 1 ryo  staff  1704  5  1 14:38 keypair.pem

// ③権限を400に変更
$ chmod 400 keypair.pem

// ④SSH接続
$ ssh -i keypair.pem ec2-user@(パブリックIPアドレス)

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

EC2にWordPressを導入

ターミナル
// 権限が足りないので権限をrootに移動
$ sudo su -

// EC2のパッケージを最新の状態にアップデート
$ yum -y update

// WordPressが動くために必要なツールをダウンロード(PHP, Apache, MySQL)
$ amazon-linux-extras install php7.2 -y
$ yum -y install mysql httpd php-mbstring php-xml gd php-gd

// Apacheが再起動後も自動的に動くようにする
$ systemctl enable httpd.service

// Apacheをスタート状態に
$ systemctl start httpd.service

// カレントディレクトリにWordPressの最新パッケージを入れる
$ wget http://ja.wordpress.org/latest-ja.tar.gz ~/

// あるか確認する
$ ls -l
total 16076
-rw-r--r-- 1 root root 16458939 Apr 21 00:00 latest-ja.tar.gz(あった)

// 拡張子がgzなので展開しましょう
$ tar zxvf ~/latest-ja.tar.gz

// ディレクトリごと/var/www/htmlへコピーする
$ cp -r ~/wordpress/* /var/www/html/

// /var/www/htmlをapacheのユーザーに権限変更
$ chown apache:apache -R /var/www/html

AMIの作成

作成したWEBSERVER1を停止してAMIを作成します。
■ルート
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「インスタンスの状態」から停止を選択
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「アクション」から「イメージを作成」を選択

スクリーンショット 2021-05-02 21.35.47.png

では作成したAMIを使ってインスタンスを作成しましょう。
ステップ5のタグは、Name=WEBSERVER2とします。
スクリーンショット 2021-05-02 21.40.44.png
スクリーンショット 2021-05-02 21.42.09.png

8. PrivateサブネットにRDSを構築

RDSには、エンドポイント通信という機能がありました。
もし通信障害などが発生して、親のRDSが使えなくなった時子のRDSに接続してくれる機能です。
つまり、このことから異なるAZにサブネットがないとRDSは使えません

ということで複数のサブネットにまたがる形でRDSは構築されるので、
サブネットグループというものが必要になります。

■ルート
コンソールで「RDS」と検索→左ペイン内の「サブネットグループ」を選択→「DB サブネットグループを作成」を選択

スクリーンショット 2021-05-01 15.04.11.png

それでは次に、DBを作成していきましょう。
■ルート
コンソールで「RDS」と検索→左ペイン内の「データベース」を選択→「データベースの作成」を選択

スクリーンショット 2021-05-01 15.10.34.png
スクリーンショット 2021-05-01 15.10.53.png
スクリーンショット 2021-05-01 15.11.08.png
スクリーンショット 2021-05-01 15.11.23.png
スクリーンショット 2021-05-01 15.11.39.png

次にRDSで作ったセキュリティグループを修正します。
■ルート
コンソールで「VPC」と検索→左ペイン内の「セキュリティグループ」を選択→「RDS-SG-1」を選択

DBは重要な情報が入っているため誰でも彼でもアクセスできると困ります。
なので、PublicサブネットのEC2(セキュリティグループ→WEB-SG-1)からしか触れないように修正します。

スクリーンショット 2021-05-01 15.23.11.png

9. ロードバランサーを導入

■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「ロードバランサーの作成」を選択

スクリーンショット 2021-05-02 21.52.13.png
スクリーンショット 2021-05-02 21.53.03.png
スクリーンショット 2021-05-02 21.54.08.png
スクリーンショット 2021-05-02 21.54.41.png

10. RDSのサイトアドレスをロードバランサーのDNSに書き換え

ターミナル
// ①RDSへログイン
$ mysql -h database-1.xxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u (管理者) -p

// ②WordPressのテーブルを使用
MySQL [(none)]> USE wordpress;

// ③指定のカラム
MySQL [(none)]> SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');
+-----------+-------------+-----------------------+----------+
| option_id | option_name | option_value          | autoload |
+-----------+-------------+-----------------------+----------+
|         2 | home        | http://13.231.153.132 | yes      |
|         1 | siteurl     | http://13.231.153.132 | yes      |
+-----------+-------------+-----------------------+----------+

// ④ロードバランサーのDNS名に置き換える
MySQL [(none)]> UPDATE wp_options SET option_value = 'http://xx.xx.xx.xx' WHERE option_name IN ('siteurl', 'home');

11. EC2のセキュリティグループのアクセス許可をロードバランサーからに変更する

■ルート
コンソールで「EC2」と検索→左ペイン内の「セキュリティグループ」を選択→「WEB-SG-1」を選択

スクリーンショット 2021-05-02 22.07.17.png

12. RDSも冗長化構成へ変更

■ルート
コンソールで「RDS」と検索→左ペイン内の「データベース」を選択→「database-1」を選択
スクリーンショット 2021-05-02 22.10.04.png

13. freenomでドメインを購入

今回はデモのため無料でドメインを取得できるfreenomを使います。
こちらが分かりやすいのでこちらを参考にしてください。

購入した後は、「Services」 → 「My Domains」 -> 「Management Tools」 → 「NameServers」を開きます。
スクリーンショット 2021-05-15 16.24.43.png

13. Route53の設定をします

■ルート
コンソールで「Route53」と検索→左ペイン内の「ホストゾーン」を選択→「ホストゾーンの作成」を選択

スクリーンショット 2021-05-15 16.27.48.png

スクリーンショット 2021-05-15 16.28.34.png

このネームサーバーの値をFreenomの方に書き写します。
スクリーンショット 2021-05-15 16.29.36.png

14. 取得したドメインでアクセスできるようにする

■ルート
コンソールで「Route53」と検索→左ペイン内の「ホストゾーン」を選択→「aws-lesson.tk」を選択→「レコードを作成」を選択

スクリーンショット 2021-05-15 16.34.41.png

スクリーンショット 2021-05-15 16.34.29.png

これでロードバランサーとblog.aws-lesson.tkは結びつきました。
blog.aws-lesson.tkにアクセスしてみましょう!

スクリーンショット 2021-05-15 16.36.14.png

成功です!!

15. エラーページを表示するためにフェイルオーバールーティングの設定をします

これでプライマリの表示は完成しました。
次に障害が起きた時に備えてエラーページを作成しましょう。
そしてそのエラーページをセカンダリで表示させます。

■ルート
コンソールで「S3」と検索→左ペイン内の「バケット」を選択→「バケットを作成」を選択

スクリーンショット 2021-05-15 16.40.42.png

スクリーンショット 2021-05-15 16.43.00.png

ではここにエラーページをアップしましょう!
スクリーンショット 2021-05-15 16.50.01.png

一番下に、「静的ウェブサイトホスティング」があるのでそれを選択します。
スクリーンショット 2021-05-15 16.51.10.png

スクリーンショット 2021-05-15 16.52.33.png

次にバケットポリシーを編集します。

スクリーンショット 2021-05-15 16.53.25.png

ポリシー
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject","s3:GetObjectVersion"],
      "Resource":["arn:aws:s3:::blog.aws-lesson.tk/*"]
    }
  ]
}

これでエラーメッセージが表示されます。

16. それではRoute53でセカンダリの設定を行います

■ルート
コンソールで「Route53」と検索→左ペイン内の「ホストゾーン」を選択→「aws-lesson.tk」を選択

フェイルオーバーに変更します。
まずはプライマリを変更します。
スクリーンショット 2021-05-15 16.58.34.png

スクリーンショット 2021-05-15 17.00.27.png

次にセカンダリを変更します。
スクリーンショット 2021-05-15 17.02.14.png

スクリーンショット 2021-05-15 17.01.41.png

これで完了です!!

AWSでHTTPS通信を可能にするには?

AWS Certificate Managerを導入すれば可能です。
なのでここから追記していきましょう!!

1. ロードバランサーでリスナーを追加する

■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「LB-1」を選択→「リスナーの追加」を選択

スクリーンショット 2021-05-15 17.09.41.png

「新しいACM証明書をリクエスト」で発行を行います。

スクリーンショット 2021-05-15 17.12.31.png

スクリーンショット 2021-05-15 17.12.47.png

スクリーンショット 2021-05-15 17.13.32.png

Route53にあるかどうか確かめましょう。
スクリーンショット 2021-05-15 17.15.17.png

ありました!!

スクリーンショット 2021-05-15 17.15.49.png

2. セキュリティグループの修正でHTTPSも受け付けられるようにしよう

■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「LB-1」を選択→「セキュリティグループ」を選択

スクリーンショット 2021-05-15 17.18.09.png

これで完了です。
スクリーンショット 2021-05-15 17.19.02.png

しかし、WordPressの仕様上表示が乱れてしまうのでここを直しましょう!

3. SSHコマンドでEC2と接続

1台目のEC2と2台目のEC2両方ともに行います。

ターミナル
$ ssh -i keypair.pem ec2-user@52.193.252.134
$ sudo su -
$ cd /var/www/html/

// wp-config.phpを開いて修正する
$ vi wp-config.php

// 「編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。」の上にコードを挿入する
if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $_SERVER['HTTPS'] = 'on';
  $_ENV['HTTPS'] = 'on';
}

4. ロードバランサーでHTTP通信ができないようにする

■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「LB-1」を選択→「セキュリティグループ」を選択

スクリーンショット 2021-05-15 17.30.43.png

スクリーンショット 2021-05-15 17.31.18.png

削除手順

S3
RDS
LB
EC2
AMI
Route53
AWS Certificate Manager
VPC

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?