【AWS】CloudFront+Route53+ALB+AutoScaling+EC2で負荷分散Webサイトを公開する方法



## 構成図
 パブリックVPC内のEC2のWebサーバーを、
 - ALB
 - Internet Gateway
 - CloudFront
 - Route53
 で公開する。

![Imakara-Web-System.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/2205a356-f877-032e-ce3f-7c7deda231f6.png)


## 事前準備
・パブリックVPC内にEC2を立ちあげ、Webサーバー(Apache/Nginx)を公開する

## 開発とネットワークの流れ
 - Route53・・・ドメイン取得とホストゾーン作成
 - ALB・・・ターゲットグループの作成とロードバランサーの作成
 - ACM・・・パブリックSSL/TLS認証書の取得・Route53のホストゾーンへ登録
 - CloudFront・・・ALBをオリジンとするドメインのCDNを作成
 - Auto Scaling・・・EC2/ALBのメトリクスに応じた自動スケーリングを作成・ALBのターゲットへ登録

![ルーティング理解.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/f956cd0a-5411-adf9-21c1-1e7637543361.png)


## Route53の設定
1. Route53のコンソール画面を開く
   https://us-east-1.console.aws.amazon.com/route53/v2/hostedzones#
1．登録済みドメインでドメインを登録を押す
1. 作成したいドメイン名を検索し、チェックアウトに進むを押して、ドメインを取得する

![Route53001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/8a69e76b-1825-fcf3-f025-2b00a990e1e8.png)
![Route53002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/d641a34d-3e66-77f6-fc8b-7df1ac1337e8.png)
![Route53003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/91ff2251-7a25-9cf4-b880-6b4a6508c787.png)

:::note warn
警告
自動更新をONにすると自動的に年間費用がかかり続けるため、消し忘れに注意
:::

## Application Load Balancerの設定

1. ロードバランサーのコンソール画面を開く
   https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#LoadBalancers:
1．ロードバランサーの作成を押す
1. Application Load Balancerの作成を押す
1. ロードバランサー名を入力する
   ![ALB001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/62c49c6e-b781-ee0f-a4d5-c435b48b1c02.png)
1. アベイラビリティーゾーンを選択する
   ![ALB002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/ea1646be-6087-9af5-fa4a-15e2009efd34.png)
1. セキュリティグループを選択する
   ![ALB003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/f801fefe-0ad1-96b3-6cc9-94bd9a8003e7.png)
1. リスナーとルーティングのターゲットグループの作成を押す
   ![ALB004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/3d857f56-f187-0cce-5d02-401a62febf8f.png)
1. ターゲットグループ名を入力する
1. ターゲットを登録でEC2を選択し、保留中として以下を含めるを押す
1. ターゲットグループの作成を押す
1. ロードバランサーのページに戻り、ロードバランサーの作成を押す

## WAFの設定
リクエスト数などでAuto Scalingする際に、海外からの余計なリクエスト等を数千~数万件受けてしまう。
想定しないスケーリングを行ってしまうので、WAFの設定は必要である。

1. WAFコンソール画面を開く
1. 左メニュー「Web ACLs」を選択する
1. Create web ACLを押す
1. Nameを設定する
1. Associated AWS resources で先ほど作成したロードバランサーを選択する
1. RulesのAdd managed rule groupsで下記を追加する
   - AWS managed rule groups
    ・Amazon IP reputation list
    ・Anonymous IP list
    ・Core rule set
    ・Known bad inputs
    ・Linux operating system
1. RulesのAdd my own rules and rule groupsで下記を追加する
    Rule name:blocked-from-overseas
    If a request:doesn't match the statement (NOT)
    Statement:Originates from country in/japan- JP
    Action:Block


## AWS Certificate Manager (ACM)の作成

1. バージニア北部でACMコンソール画面を開く
   https://us-east-1.console.aws.amazon.com/acm/home?region=us-east-1#/welcome
1. リクエストを押す
1. 次へを押す
   ![ACM001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/8a75c29a-74b3-0b42-b362-472d5d08f0ae.png)
1. 完全修飾ドメイン名にWebサイトのドメインを入力する
   example.com
1. リクエストを押す
   ![ACM002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/37430b20-aa4e-08bb-3f3d-e93fae386c24.png)
1. 作成した証明書をクリックして、Route 53 でレコードを作成を押す
1. 先ほど作成したRoute53のドメインを選択して、レコード作成を押す

## CloudFrontの作成

1. CloudFront コンソール画面を開く
   https://us-east-1.console.aws.amazon.com/cloudfront/v4/home?region=ap-northeast-1#/distributions
1. ディストリビューションを作成を押す
1. Origin domainにALBのDNSを入力する
1. ディストリビューションを作成を押す
1. 作成したディストリビューションを押す
1. 編集を押す
1. Alternative domain name (CNAMEs) - optionalにドメイン名を入力する
1. Custom SSL certificate - optionalで作成したACMを選択する
   ![CloudFront009.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/47e7c8a3-b6b8-84c5-d1b5-d805e2f46239.png)
1. 変更を保存を押す
1. ビヘイビアのタブを押す
1. ビヘイビアを作成を押す
1. パスパターンに/*を入れ、キャッシュキーとオリジンリクエストで下記を選択する
   ![CF001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/ec4ee36a-b5ed-fa68-426e-d4cfd65cfa58.png)
   ![CF002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/ee5d4e42-74eb-9fb0-e19a-22063bf33041.png)
1. オリジンのタブを押す
1. オリジンを選択して、編集を押す
1. カスタムヘッダーを追加 - オプションで下記を追加する
  ![CF003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/de9ea667-1faa-9105-ec88-732c7f2946d9.png)

## Auto Scalingの作成

1. Auto Scalingのコンソール画面を開く
   https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#AutoScalingGroups:
1. Auto Scaling グループを作成するを押す
1. Auto Scaling グループ名を入力する
   ```MyAutoScaling```
1. 起動テンプレートを作成するを押す
1. 起動テンプレート名を入力する
1. 別のタブでEC2のコンソール画面を開き、起動中のEC2のイメージを作成する
1. 起動テンプレートのタブに戻り、自分のAMI -> Amazon マシンイメージ (AMI)で作成したイメージを選択する
1. インスタンスタイプ、キーペア、セキュリティグループ を選択する
1. 高度な設定でIAM インスタンスプロフィールでロールを選択する
1. 起動時に実行するスクリプトがあれば、ユーザーデータ - オプション に記載する
    ```
    Content-Type: multipart/mixed; boundary="//"
    MIME-Version: 1.0
    
    --//
    Content-Type: text/cloud-config; charset="us-ascii"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Content-Disposition: attachment; filename="cloud-config.txt"
    
    #cloud-config
    cloud_final_modules:
    - [scripts-user, always]
    
    --//
    Content-Type: text/x-shellscript; charset="us-ascii"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Content-Disposition: attachment; filename="userdata.txt"
    
    #!/bin/bash
    /bin/echo "Hello World" >> /tmp/testfile.txt
    
    sudo -u ec2-user -i <<'EOF'
    cd /var/www/html/myapp
    /usr/bin/nohup /home/ec2-user/.local/bin/uvicorn main:app --host localhost --port 8000 --workers 5 &
    EOF
    ```
1. Auto Scaling グループのタブに戻り、作成した起動テンプレートを選択する
1. ネットワークでVPCとサブネットを選択する
1. ロードバランシングで既存のロードバランシングにアタッチするを選択し、既存のロードバランサーターゲットグループで先ほどのターゲットグループを選択する
1. Elastic Load Balancing のヘルスチェックをオンにするをチェックする
1. 希望するキャパシティ、最小の希望する容量、最大の希望する容量を設定する
1. 次へを何度か押す
1. Auto Scaling グループを作成するを押す