Well Architected Frameworkを意識して自分なりにアーキテクチャ設計・構築をしてみた。＜準備編＞

#はじめに

先日AWS認定資格のソリューションアーキテクトプロフェッショナルに合格することが出来ました！

ですが実務に関しては「未経験」ですので、複雑なアーキテクチャ構築の経験はほとんどありません。（基本的なアーキテクチャのみ...）
**力試し＆自信を付けたい**という思いから、今日から自分なりに考えてアーキテクチャの設計、構築に挑戦してきます！


#前提（ロールプレイ形式で進めて行きます！）
私はA社に転職してきたインフラエンジニアです。

A社では掲示板サイトを運営していますが、某Youtuberの影響によってこのサービスの大幅なアクセス増が見込まれます。

現在のアーキテクチャはこちらでありますが、CEOは

 + 運用上の優秀性
 + セキュリティ
 + 信頼性
 + パフォーマンス効率
 + コスト
 など様々な面での懸念点を問題視しています。

1ヶ月という限られた期間で、このアーキテクチャをWell-Architectedの5本の柱に沿って改善して欲しいとの以来がありました。

![スクリーンショット 2020-09-23 18.43.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666664/1648d288-e5ac-b8e0-244a-15975b8180f7.png)






#準備編（一旦現実に戻ります！）
今日からこの様なよく見るAWS環境を**「Well Architected Framework」**を意識しつつ、
改善していくロールプレイに挑戦していきます

今日は準備編ということで、元となるアーキテクチャを設計していこうと思います。
デプロイ対象のアプリケーションはフレームワークの練習用に作成した。Laravelの掲示板アプリを使用しました。

##ネットワーク作成
まずはCloudfomationを利用して、VPC、パブリックサブネット、プライベートサブネットを作成。


```

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'false'
  eip:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  subnetPub1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      AvailabilityZone:
        Fn::Select:
        - '0'
        - Fn::GetAZs:
            Ref: AWS::Region
      VpcId: !Ref VPC
  subnetPub2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.1.0/24
      AvailabilityZone:
        Fn::Select:
        - '1'
        - Fn::GetAZs: !Ref AWS::Region
      VpcId: !Ref VPC
  subnetPrv1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.2.0/24
      AvailabilityZone:
        Fn::Select:
        - '0'
        - Fn::GetAZs: !Ref AWS::Region
      VpcId: !Ref VPC
  subnetPrv2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.3.0/24
      AvailabilityZone:
        Fn::Select:
        - '1'
        - Fn::GetAZs: !Ref AWS::Region
      VpcId: !Ref VPC
  Nat:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId:
        Fn::GetAtt:
        - eip
        - AllocationId
      SubnetId: !Ref subnetPub1
    DependsOn: eip
  IGW:
    Type: AWS::EC2::InternetGateway
    Properties:
  RouteTablePublic:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  RouteTablePrivate:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  gw:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref IGW
  subnetRoutePub1:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTablePublic
      SubnetId: !Ref subnetPub1
  subnetRoutePub2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTablePublic
      SubnetId: !Ref subnetPub2
  subnetRoutePrv1:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTablePrivate
      SubnetId: !Ref subnetPrv1
  subnetRoutePrv2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTablePrivate
      SubnetId: !Ref subnetPrv2
  routePublic:
    Type: AWS::EC2::Route
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      RouteTableId: !Ref RouteTablePublic
      GatewayId: !Ref IGW
    DependsOn: gw
  routePrivate:
    Type: AWS::EC2::Route
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      RouteTableId: !Ref RouteTablePrivate
      NatGatewayId: !Ref Nat
    DependsOn:
    - Nat
    - subnetRoutePrv1
    - subnetRoutePrv2
```

完全な**infrastructure as code**に憧れを持ってますが、コード管理しちゃうと手作業の差分とかの管理が難しそうで、まだ手をつけられてないです...

##サーバー

適当にEC2サーバーを立てちゃいます。
インスタンスタイプはとりあえず無料枠の**「t2.micro」**

とりあえずSSH接続

```
#とりあえず更新
$ sudo yum update -y

#Apach,php,Mysqlのインストール
$ sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
$ sudo yum install -y httpd mariadb-server

#Apache ウェブサーバーを起動
$ sudo systemctl start httpd

#システムがブートするたびに Apache ウェブサーバーが起動するように設定
$ sudo systemctl enable httpd

```


###composerのインストール

```
$ curl -sS https://getcomposer.org/installer | php

# パスを通す
$ sudo mv composer.phar /usr/local/bin/composer
```

###gitからアプリを持ってくる

```
$ sudo yum install git
$ cd /var/www
$ git clone https://github.com/mkoki0422/Laravel_keiziban.git
```

###Apacheの設定

####DocumentRootを変更
```
$ sudo nano /etc/httpd/conf/httpd.conf

DocumentRoot "/var/www/html"
→
DocumentRoot "/var/www/Laravel-keiziban/public"
に変更
```

####.htaccessの有効化
```
#http.confファイルに追加
<Directory /var/www/Laravel-keiziban/public>
 AllowOverride All
</Directory>
```

###再起動して、設定を適用
```
$ sudo systemctl restart httpd
```


### vendorディレクトリの作成
```
$ composer install
```

###.envファイルの作成

```
#.envファイルの作成
$ cp .env.example .env

# .envのAPP_KEYの生成
$ php artisan key:generate

```




##RDS
###サブネットグループ作成
RDSを構成する前にRDSを配置するサブネットグループを作成しましょう。

マネジメントコンソールの「サブネットグループ」から「DBサブネットグループの作成」に進みましょう。
**注意** RDSはMultiAZ構成をしない場合でも、2つ以上のAZを指定しないといけません！

![スクリーンショット 2020-09-20 23.29.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666664/48284078-5985-c00c-0c93-52923a5fe4b0.png)


###データベース用セキュリティグループ
DBサーバーに適用するためのセキュリテイグループも事前に作成しておきます。

インバウンドルールのタイプを**「MYSQL/Aurora」**、ソースは**EC2で適用しているセキュリティグループを選択**する方法と、**IPアドレスを選択**する方法がありますが、今回はセキュリティグループをソースとして指定します。


![スクリーンショット 2020-09-20 23.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666664/b60d7880-86e6-96db-683f-51a70c571159.png)


###DB構築
実際にDBを構築していきます！

エンジンは「MySQL」
テンプレートは「開発/テスト」もしくは「無料利用枠」のどちらかを選択します。
後々MultiAZ構成にするかもしれませんので、今回は「開発/テスト」を選択しました。

**注意**なるべくコストを抑えたいけど、「開発/テスト」を選択したい場合は**DBインスタンスサイズ**をバースト可能なクラスである**「db.t2.micro」**を選択しましょう。
デフォルトだと**月額345.86 USD**かかってしまいます....

「接続」からVPCの指定
「追加の接続設定」からサブネットグループの指定、セキュリティグループの指定、マスターDBを設置するAZの指定をしましょう。
追加設定から、実際に使用するDB名も指定しておきます。

|項目  |設定値  |
|---|---|
|エンジン  |MySQL  |
|テンプレート  | 開発/テスト　OR　無料利用枠 |
|接続  |今回作成したVPC  |
|セキュリティグループ| 先ほど作成したSG（Defaulは削除して下さい） |
|サブネットグループ  |先ほど作成したサブネットグループ  |
|AZ  | マスターDBを配置したいAZを指定 |
|DB名  |実際に利用するDB名  |
|マスタユーザー| マスターユーザー名とパスワード |

###LaravelのDB接続設定
DBサーバーの構築が完了しましたので、Laravelの設定を変更してRDSに接続していきます。

###.envの設定
webサーバーにSSHログイン後、.envファイルを変更していきます。

```
cd /var/www/Laravel-keiziban
sudo nano .env
```
.envファイルに四項目を設定して下さい。

|項目  |設定値  |
|---|---|
|DB_HOST  |RDSのエンドポイント  |
|DB_DATABASE  |RDSを構築した際に指定した、DB名  |
|DB_USERNAME  |RDSを構築した際に指定した、マスターユーザー名  |
|DB_PASSWORD  |RDSを構築した際に指定した、マスターパスワード  |

###migrateの実行

```
php artisan migrate
```
ここでエラーがでなければ接続完了です！

実際にアプリを触ってみて、確認してみましょう。

##Route53
シンプルルーティングでルーティングさせます
![スクリーンショット 2020-09-21 0.38.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666664/0d845f85-4a28-ee39-5468-60384d8b6d80.png)



#感想
今日は準備編ですので、とりあえずデプロイして、RDSに接続、Route53でルーティングさせるところまでやってみました。

明日からアーキテクチャの設計、構築を進めて行きます！



#####