#はじめに
先日AWS認定資格のソリューションアーキテクトプロフェッショナルに合格することが出来ました!
ですが実務に関しては「未経験」ですので、複雑なアーキテクチャ構築の経験はほとんどありません。(基本的なアーキテクチャのみ...)
力試し&自信を付けたいという思いから、今日から自分なりに考えてアーキテクチャの設計、構築に挑戦してきます!
#前提(ロールプレイ形式で進めて行きます!)
私はA社に転職してきたインフラエンジニアです。
A社では掲示板サイトを運営していますが、某Youtuberの影響によってこのサービスの大幅なアクセス増が見込まれます。
現在のアーキテクチャはこちらでありますが、CEOは
- 運用上の優秀性
- セキュリティ
- 信頼性
- パフォーマンス効率
- コスト
など様々な面での懸念点を問題視しています。
1ヶ月という限られた期間で、このアーキテクチャをWell-Architectedの5本の柱に沿って改善して欲しいとの以来がありました。
#準備編(一旦現実に戻ります!)
今日からこの様なよく見る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を指定しないといけません!
###データベース用セキュリティグループ
DBサーバーに適用するためのセキュリテイグループも事前に作成しておきます。
インバウンドルールのタイプを**「MYSQL/Aurora」、ソースはEC2で適用しているセキュリティグループを選択**する方法と、IPアドレスを選択する方法がありますが、今回はセキュリティグループをソースとして指定します。
###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
シンプルルーティングでルーティングさせます
#感想
今日は準備編ですので、とりあえずデプロイして、RDSに接続、Route53でルーティングさせるところまでやってみました。
明日からアーキテクチャの設計、構築を進めて行きます!