【AWS】④-2 作成したバックエンドをAWS上で動作させる。
④で作成したRailsアプリケーションをAWS上で動作させ、ARableサービスをインターネットを通じて誰もがアクセス可能なものとします。ここではデプロイ方法の他、AWSを用いた安全かつ安定的なサービス運用への取り組みを説明します。
AWS(Amazon Web Service)を用いた安全かつ安定的なサービス運用への取り組みを説明します。
システム構築の流れは、サブネット定義、踏み台サーバとWebサーバの設置、NAT設置、ドメインと電子証明書取得、ロードバランサの実装、DNSサーバ設置、Rubyのインストール、Railsアプリケーション起動となります。
AWS上で構築するシステム図 ↓
ネットワーク
最初にVPC(Virtual Private Cloud)を設定します。2つのアベイラビリティゾーンにそれぞれパブリックネットワークとプライベートネットワークを構築します。VPCのCIDR(Classless Inter-Domain Routing)マスクを/16として分割します。分割した中に、4つのネットワークをそれぞれ設けます。更に4つのネットワークのCIDRマスクをそれぞれ/8と設定して分割し、各ネットワーク機器が保有することになるIPアドレスを確保します。
Webサーバ
WebサーバはEC2(Elastic Compute Cloud)インスタンスを用いて作成します。マシンイメージとしてはAmazon Linux 2023 AMIを設定し、マシンの性能に相当するインスタンスタイプにはt2.microを設定します。
EC2インスタンスの作成画面 ↓
Webサーバは外部からのアクセスができないようプライベートサブネットに設置し、外部からのアクセスは別途の踏み台サーバからアクセスします。そのため、踏み台サーバからのアクセスのみを受け付けるようにセキュリティグループを設定します。
セキュリティグループの設定画面 ↓
Webサーバ上の実行環境構築
Webサーバとして作成したEC2インスタンスを、Webサーバとして動作させるため、Nginxをインストールします。またNginx設定ファイル(/etc/nginx/conf.d/rails.conf)を以下の通りに記載します。
Nginx設定ファイル ↓
上記の通りに設定し、サーバを起動させ、3000番ポートにてlistenさせます。
また、WebサーバにRuby on Railsの環境を構築します。
※Webサーバ上の実行環境構築と管理は、パブリックネットワークに設置された踏み台サーバを通して行います。踏み台サーバの環境構築についてはここでは省略説明します。
データベースサーバ
データベースはAWSのマーネジドサービスであるRDS(Relational Database Service)を用いて作成します。データベースエンジンとしてはMySQLを指定し、エンジンの性能に相当するインスタンスタイプには db.t2.microを設定します。
RDSの作成画面 ↓
RDSはWebサーバと同じくプライベートサブネットに設置し、Webサーバからのみのアクセスを許可します。
サブネットグループの設定画面 ↓
データベース上での実行環境構築
RDSインスタンスにアクセスし、user, database, passwordを設定します。
MySQLの設定コマンド ↓
画像保存用サーバ
ARableでは画像のやりとりが行われます。テキストに比べて画像はファイルサイズが大きいためRDSではなく、AWSサービスであるS3(Simple Storage Service)バケットに画像を保存するようにします。S3は無制限のストレージ容量、可用性や安全性等に優れ、画像といった大容量オブジェクトを保存することに適しています。また、これらのオブジェクトをバケットから取り出して使用する、といったコンテンツ配信もサポートするサービスとなっており、ARableの機能を実現する上で十分な性能を発揮します。
S3の設定画面 ↓
S3バケットはAWSのVPC内部ではなく、外部インターネットに配置されるため、バケット名は他とは重複しないユニークな名前を付ける必要があります。
ネットワークの設定
NATGateway設置
NetworkAccessTransration(NAT)とは、IPアドレスとポートをNAT前後で変換させるものです。本システムにおいては、セキュリティの観点からWebサーバはプライベートサブネットに設置しておりますが、実行環境構築といった場面においては、インターネットへの接続が便利です。このためWebサーバのインターネット利用を可能とするため、WebサーバのデフォルトゲートウェイとしてNATGatewayを指定し、プライベートサブネットに存在するWebサーバのインターネットへのアウトバウンド接続を可能とさせます。
NATGatewayの設定画面 ↓
Router(ルートテーブル)について
上記のシステム図に示した通りに、各Webサーバ、RDS、NATゲートウェイ等を接続します。セキュリティを考慮しつつ、ARableの機能を実現する上で必要十分な接続方法、接続元、接続先等の設定をします。
ルートテーブルの設定画面 ↓
負荷分散への取り組み
ロードバランサの設置
2つのWebサーバはロードバランサを活用し、アクセス集中に対する負荷を分散させることを考えます。
ロードバランサの作成画面 ↓
ターゲット(ネクストホップ)として2つのWebサーバが指定されたセキュリティグループを指定します。リッスンには80番ポートを指定します。
これにより外部からのアクセスをロードバランサが80番ポートにおいてlistenし、アクセスに応じて負荷分散的にWebサーバにアクセスを転送するようになります。
TLS通信(通信の暗号化)
本システムはフロントエンドとの通信は暗号化させたいので、電子証明書を用いた公開鍵暗号方式(SSL/TLS通信)を実装します。実装に当たっては電子証明書を取得します。
ドメイン取得
電子証明書の取得にあたりドメイン認証が必要なため、まずはAWSサービスの一つであるRoute53を用いてドメインを取得します。
Route53で取得したドメイン ↓
電子証明書の発行
ドメイン取得後、同じくAWSサービスであるAWS Certificate Managerを用いて電子証明書発行を行います。この時のドメイン認証に掛かるドメインが、同じくAWSサービスのRoute53経由で取得したものなら比較的スムーズに電子証明書を取得することが可能です。
Route53で取得したドメインを用いて認証し、取得した電子証明書 ↓
ロードバランサへのアタッチとリッスン設定
取得した電子証明書をロードバランサにアタッチさせます。
次にインバウンド通信を許可するため、443番ポートにおいてHTTPSリッスンを許可します。こうすることでロードバランサとフロントエンド間の通信はTLS通信となり暗号化されます。加えて、ロードバランサにおいて通信の暗号化は解除され、リクエストは外部からアクセス不可能なプライベートサブネット上のWebサーバに転送されます。
ロードバランサへのアタッチとリッスン設定 ↓
このようにしてインターネット間のやりとりを暗号化し、安全な通信を行うことができます。
ホストゾーンの作成
パブリックドメインを取得したので、フロントエンドからの通信時における名前解決を行うホストゾーン(パブリックDNSサーバ)を設置します。ここではロードバランサに割り当てられたElasticIPアドレスに対してドメイン名の対応付けを行います。
ホストゾーンの作成画面 ↓
Railsアプリケーションの起動
④で説明したARableのRailsアプリケーションをWebサーバ上のvar/wwwに設置します。
起動まで
以下はRailsアプリケーションを起動するまでの作業を簡単に説明します。
Railsアプリケーション内のconfig/database.ymlには以下のように記述します。
database.ymlの記述 ↓
MySQLデータベースにテーブルを作成するために以下のコマンドを実行します。
rails db:migrate RAILS_ENV=production
productionモードでRailsサーバを起動するために、var/www/ARable_aws_sample において、以下のコマンドを実行します。
起動後
RailsアプリケーションがWebサーバにおいて起動し、Webサーバは3000番ポートにおいてロードバランサをリッスンします。また前述の通り、ロードバランサは443番ポートにおいて外部インターネットからのアクセスをリッスンします。
Unityで作成したARableアプリケーション(フロントエンド)からロードバランサ(バックエンド)にアクセスすることで、アクセスはRailsアプリケーションで処理され、適切なリクエストであるならば、データベースにアクセスし、投稿を追加または閲覧する事が可能になります。
このようにしてARableサービスをデプロイします。