0
1

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] ALB・Auto Scaling Group・RDS・WAF構成を構築してみた

0
Posted at

1. 初めに

本学習では以下の黒川さんのロードマップを参考に、AWS上で構成を構築してみました。

ALB、Auto Scaling Group、RDS、WAFなど、これまであまり触ったことのなかったサービスを利用しているため、勉強になると思い、この構成を選びました。

2. 構成図

image.png

構成図ではNATゲートウェイはありませんが、私は作成して進みます。

3. 全体設計

VPC

seenew-vpc : 10.0.0.0/16

Subnet

Public-1a-web : 10.0.0.0/24
Public-1a-alb : 10.0.1.0/24
Public-1c-alb : 10.0.2.0/24

Private-1a-api : 10.0.10.0/24
Private-1c-api : 10.0.11.0/24

Private-1a-db : 10.0.20.0/24
Private-1c-db : 10.0.21.0/24

Security Group

ALB用SG
Inbound : 80番ポート 0.0.0.0/0
Outbound : すべて 0.0.0.0/0

Web用SG
Inbound : 80番ポート 0.0.0.0/0
Outbound : すべて 0.0.0.0/0

API用SG
Inbound : 80番ポート ALB用SG
Outbound : すべて 0.0.0.0/0

DB用SG
Inbound : 3306番ポート API用SG
Outbound : すべて 0.0.0.0/0

Internet Gateway

seenew-igw

NAT Gateway

seenew-nat
配置先 : Public-1a-alb
Elastic IP : seenew-eip-nat

Route Table

Public用RT
0.0.0.0/0 → Internet Gateway

Private API用RT
0.0.0.0/0 → NAT Gateway

Private DB用RT
localのみ

4. ネットワーク作成

下記の順でネットワークを作成します。

  1. VPC作成
  2. Subnet作成
  3. IGW作成
  4. EIP取得
  5. NATGW作成
  6. Route Table作成
  7. Security Group作成

1. VPC作成

VPC → お使いのVPC → VPCを作成

作成するリソース : VPCのみ
名前 : seenew-vpc
IPv4 CIDR : 10.0.0.0/16

2. Subnet作成

VPC → サブネット → サブネットを作成

###### Public-1a-web VPC : seenew-vpc サブネット名 : seenew-public-1a-web AZ : ap-northeast-1a IPv4 サブネット CIDRブロック : 10.0.0.0/24
Public-1a-alb

VPC : seenew-vpc
サブネット名 : seenew-public-1a-alb
AZ : ap-northeast-1a
IPv4 サブネット CIDRブロック : 10.0.1.0/24

Public-1c-alb

VPC : seenew-vpc
サブネット名 : seenew-public-1c-alb
AZ : ap-northeast-1c
IPv4 サブネット CIDRブロック : 10.0.2.0/24

Private-1a-api

VPC : seenew-vpc
サブネット名 : seenew-private-1a-api
AZ : ap-northeast-1a
IPv4 サブネット CIDRブロック : 10.0.10.0/24

Private-1c-api

VPC : seenew-vpc
サブネット名 : seenew-private-1c-api
AZ : ap-northeast-1c
IPv4 サブネット CIDRブロック : 10.0.11.0/24

Private-1a-db

VPC : seenew-vpc
サブネット名 : seenew-private-1a-db
AZ : ap-northeast-1a
IPv4 サブネット CIDRブロック : 10.0.20.0/24

Private-1c-db

VPC : seenew-vpc
サブネット名 : seenew-private-1c-db
AZ : ap-northeast-1c
IPv4 サブネット CIDRブロック : 10.0.21.0/24

image.png

3. IGW作成

VPC → インターネットゲートウェイ → インターネットゲートウェイの作成

名前 : seenew-igw
作成後、IGW詳細 → アクション → VPCにアタッチ

VPC : seenew-vpc

4. EIP取得

VPC → Elastic IP → Elastic IP アドレスを割り振る

Tags : [Name] : [seenew-eip-nat]

5. NATゲートウェイ作成

VPC → NATゲートウェイ → NATゲートウェイを作成

名前 : seenew-nat
アベイラビリティーモード : ゾーナル
サブネット : seenew-public-1a-alb
接続タイプ : パブリック
Elastic IP 割り当て ID : seenew-eip-nat

image.png

6. Route Table作成

VPC → ルートテーブル → ルートテーブルを作成

Public Route Table

名前 : seenew-public-rt
VPC : seenew-vpc
作成後、ルート編集 → ルートを追加

送信先 : 0.0.0.0/0
ターゲット : seenew-igw
ルート追加後、アクション → サブネット関連付けを編集

seenew-public-1a-web、seenew-public-1a-alb、seenew-public-1c-albをチェックし、関連付けを保存

Private Route Table(API)

名前 : seenew-private-api-rt
VPC : seenew-vpc
作成後、ルート編集 → ルートを追加

送信先 : 0.0.0.0/0
ターゲット : seenew-nat
ルート追加後、アクション → サブネット関連付けを編集

seenew-private-1a-api、seenew-private-1c-apiをチェックし、関連付けを保存

Private Route Table(DB)

名前 : seenew-private-db-rt
VPC : seenew-vpc
作成後、アクション → サブネット関連付けを編集

seenew-private-1a-db、seenew-private-1c-dbをチェックし、関連付けを保存
→ Localのみ通信可能

image.png

7. Security Group

VPC(EC2) → セキュリティグループ → セキュリティグループを作成

ALB用SG

セキュリティグループ名 : seenew-sg-alb
説明 : Security Group for ALB
VPC : seenew-vpc
Inbound Rule : カスタムTCP 80 / ソース : Anywhere-IPv4
Outbound Rule : すべてのトラフィック / ソース : Anywhere-IPv4

Web用SG

セキュリティグループ名 : seenew-sg-web
説明 : Security Group for Web Server
VPC : seenew-vpc
Inbound Rule : カスタムTCP 80 / ソース : Anywhere-IPv4
Outbound Rule : すべてのトラフィック / ソース : Anywhere-IPv4

API用SG

セキュリティグループ名 : seenew-sg-api
説明 : Security Group for EC2
VPC : seenew-vpc
Inbound Rule : カスタムTCP 80 / ソース : seenew-sg-alb
Outbound Rule : すべてのトラフィック / ソース : Anywhere-IPv4

DB用SG

セキュリティグループ名 : seenew-sg-db
説明 : Security Group for EC2
VPC : seenew-vpc
Inbound Rule : MySQL/Aurora 3306 / ソース : seenew-sg-api
Outbound Rule : すべてのトラフィック / ソース : Anywhere-IPv4

5. IAM

SSMで接続するためのロールを作成します。

IAM → ロール → ロールを作成

  • 信頼されたエンティティタイプ : AWSのサービス
  • ユースケース : EC2
  • 許可ポリシー : AmazonSSMManagedInstanceCore
  • ロール名 : seenew-role-ec2-ssm

6. ALB作成

ターゲットグループ

EC2 → ターゲットグループ → ターゲットグループの作成

  • ターゲット種類 : インスタンス
  • ターゲットグループ名 : seenew-tg-api
  • プロトコル・ポート : HTTP, 80
  • VPC : seenew-vpc
  • プロトコルバージョン : HTTP1
  • ヘルスチェックプロトコル : HTTP
  • ヘルスチェックパス : /health
  • ターゲット : X

ALB

EC2 → ロードバランサー → ロードバランサーの作成

  • 種類 : Application Load Balancer
  • ロードバランサー名 : seenew-alb
  • スキーム : インターネット向け
  • VPC : seenew-vpc
  • アベイラビリティーゾーンとサブネット : seenew-public-1a-alb, seenew-public-1c-alb
  • セキュリティグループ : seenew-sg-alb
  • リスナー : HTTP(80) → ターゲットグループへ転送 / seenew-tg-api

7. Auto Scaling Group作成

起動テンプレート

EC2 → 起動テンプレート → 起動テンプレートを作成

  • 起動テンプレート名 : seenew-api-template
  • Template for API Server
  • OSイメージ : Amazon Linux 2023
  • インスタンスタイプ : t3.micro
  • キーペア名 : 起動テンプレートの設定に含めない
  • サブネット : 起動テンプレートの設定に含めない
  • アベイラビリティーゾーン : 起動テンプレートの設定に含めない
  • セキュリティグループ : seenew-sg-api
  • IAMインスタンスプロフィール : seenew-role-ec2-ssm
  • user data :
    #!/bin/bash
    dnf update -y
    dnf install -y python3

    mkdir -p /home/ec2-user/app

    cat << 'APP' > /home/ec2-user/app/app.py
    from http.server import BaseHTTPRequestHandler, HTTPServer
    import json

    class Handler(BaseHTTPRequestHandler):
        def do_GET(self):
            if self.path == "/health":
                self.send_response(200)
                self.send_header('Content-type', 'text/plain')
                self.end_headers()
                self.wfile.write(b"OK")
            else:
                self.send_response(200)
                self.send_header('Content-type', 'application/json')
                self.end_headers()
                
                response_data = {
                    "status": "success",
                    "message": "Hello from API Server (Auto Scaled!)",
                    "infrastructure_check": {
                        "vpc": "seenew-vpc (10.0.0.0/16)",
                        "api_tier": "Private Subnet Active",
                        "database_target": "seenew-rds.database.amazonaws.com:3306 (Connected)",
                        "waf_protection": "Enabled via seenew-waf"
                    }
                }
                self.wfile.write(json.dumps(response_data).encode('utf-8'))

    server = HTTPServer(("0.0.0.0", 80), Handler)
    server.serve_forever()
    APP

    nohup python3 /home/ec2-user/app/app.py > /var/log/api.log 2>&1 &

Auto Scaling Group

EC2 → Auto Scaling グループ → Auto Scaling グループを作成する

  • Auto Scaling グループ名 : seenew-auto-api
  • 起動テンプレート : seenew-api-template
  • VPC : seenew-vpc
  • アベイラビリティーゾーンとサブネット:
    seenew-pri-1a-api、seenew-pri-1c-api
  • ロードバランシング : 既存のロードバランサーにアタッチする
  • 既存のロードバランサーターゲットグループ : seenew-tg-api
  • ヘルスチェック → Elastic Load Balancingのヘルスチェックをオンにする
  • 希望するキャパシティ : 2
  • 最小の希望する容量 : 2 / 最大の希望する容量 : 4

8. RDS作成

DBサブネットグループ作成

Aurora and RDS → サブネットグループ → DBサブネットグループを作成

  • 名前 : seenew-subnet-group
  • 説明 : Subnet Group for DB
  • VPC : seenew-vpc
  • アベイラビリティーゾーン : ap-northeast-1a, ap-northeast-1c
  • サブネット : seenew-pri-1a-db, seenew-pri-1c-db

データベース作成

Aurora and RDS → データベース → データベースの作成 → フル作成

  • エンジンのタイプ : MySQL
  • データベース作成方法を選択 : フル設定
  • DBインスタンスサイズ : 開発/テスト
  • DBインスタンス識別子 : seenew-rds
  • 可用性と耐久性 : シングルAZ
  • マスターユーザー名 : admin
  • マスターパスワード : 任意のパスワード
  • DBインスタンスタイプ : db.t3.micro

9. WAF作成

WAFとShield → 保護パック(ウェブACL) → 保護パック(ウェブACL)を作成

  • アプリカテゴリ : コンテンツ及び公開システム
  • アプリケーションフォーカス : APIとウェブの両方
  • 保護するリソース : seenew-alb
  • 初期の保護を選択 : お客様のために推奨されるルール
  • 名前 : seenew-waf

10. 動作確認

Auto Scaling Groupにてインスタンスが起動されています。

image.png

ブラウザにてALB DNS名に接続します。
image.png

ALB DNS名/healthに接続します。

image.png

11. 終わりに

今回の構築では、ALBやAuto Scaling Group、RDS、WAFなどを使った構成を作成してみました。

構成図を見た時は簡単そうに見えましたが、実際に作成してみると、RDSやAuto Scaling Groupには設定項目が多く、思ったより難しいと感じました。

しかし、何度も削除と再作成を繰り返すうちに、構築する順番にも少し慣れてきたと思います。

まだ理解が足りない部分もありますが、今後はTerraformでも同じ構成を作成してみたいと思います。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?