2
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?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-20

#はじめに

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

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

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

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

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

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

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

スクリーンショット 2020-09-23 18.43.25.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

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

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

スクリーンショット 2020-09-20 23.34.58.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

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

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

2
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
2
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?