【AWS】④-2 作成したバックエンドをAWS上で動作させる。

OVERVIEW

④で作成したRailsアプリケーションをAWS上で動作させ、ARableサービスをインターネットを通じて誰もがアクセス可能なものとします。ここではデプロイ方法の他、AWSを用いた安全かつ安定的なサービス運用への取り組みを説明します。

YEAR 2024

  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サービスをデプロイします。