AWSでRailsアプリをデプロイしたのですが、その時に必要だと思った知識を整理しました。
初心者向けの基礎的な内容を浅く紹介しています。
IPアドレス
IPアドレス
とは通信先を特定するための番号です。アドレスという名前通り住所のようなものです。
インターネットに接続する時に使うパブリックIPアドレス
とインターネットで使わないプライベート IPアドレス
があります。
##ネットワーク部とホスト部
IPアドレスを表記する時前半部分をネットワーク部
後半部分をホスト部
と言います。
ネットワーク部
は同じネットワークに属する限りは、同じ値です。
ホスト部
は割り当てたいサーバーやクライアント、ネットワーク機器に対する連番となります。
またネットワーク部とホスト部は以下の方法で区別されます。
###クラスフルアドレス
クラスフルアドレスでは、クラスA~Cにおいて下記のようにネットワーク部とホスト部が区別されています。
数字がネットワーク部、Xがホスト部
クラスA : 123.XXX.XX.XXX
クラスB : 178.168.XXX.XX
クラスC : 203.56.162.XXX
###クラスレスアドレス(CIDR)
クラスレスアドレスの場合、IPアドレスのネットワーク部とホスト部の境界が定まっていません。なので、サブネットマスク
を使用し、32ビットあるIPアドレスのうち、ネットワーク部とホスト部がどこからどこまでの範囲なのかを示します。
サブネットマスクではビット「1」でネットワーク部を表し、ビット「0」でホスト部を表します。
11111111.11111111.11111111.00000000
サブネットマスク
サブネットマスク
は、ネットワークの範囲を定義するために使用します。
IPアドレスとサブネットマスクを組み合わせることで、ネットワークの範囲(サブネット)を指定することができます。
##CIDR
CIDR : サイダー
は、クラスを使わないIPアドレスの割り当てを行う技術です。ネットワーク部とホスト部での説明の通り、クラスはIPアドレスのネットワーク部とホスト部を決められたブロック単位で区切ります。
この考え方はとてもシンプルなのですが、それだとアドレス空間の利用に無駄が生じてしまうのです。これに対してクラスを使わないCIDRでは、任意のブロック単位で区切ることができるため、IPアドレス空間を効率的に利用することができます。
##IPアドレスとサブネットマスクをまとめて表記する
サブネットマスクの設定が間違っていると、通信相手によってつながったり、つながらなかったりするという事態が生じるなど、さまざまなトラブルの元になります。
ここではIPアドレスとサブネットマスクの表記方法についてまとめます。
サブネットマスクとは、具体的には次のような形式で表示され
IPアドレス : 192.168.1.40
サブネットマスク : 255.255.255.0
###IPアドレスとサブネットマスクを組み合わせて表現する方法1
IPアドレスとサブネットマスクは常にペアで扱う必要があるので、簡単に表現できるように、特別な表記方法が用意されています。
方法はシンプルで次のように、IPアドレスとサブネットマスクの値を「/」記号で区切って並べるだけです。
IPアドレス : 192.168.1.40
サブネットマスク : 255.255.255.0
まとめた表記 : 192.168.1.40/255.255.255.0
###IPアドレスとサブネットマスクを組み合わせて表現する方法2
上記の方法は、IPアドレスとサブネットマスクがどのような値の組み合わせであっても表現できます。
ですが、現実のネットワークで利用されているサブネットマスクの値を考慮すると、さらに簡便な表現方法があります。
例えばサブネットマスクの255.255.255.0という値は、32bitの2進数で考えると最上位から24bitが全部1、それ以外が0という値です。
10進数的表現 : 255.255.255.0
2進数的表現 : 11111111 11111111 11111111 00000000
そこでこの255.255.255.0という値を/24と表記することにする。そうすると、先ほどのIPアドレスとサブネットマスクの組は次のように表現できる。
IPアドレス : 192.168.1.40
サブネットマスク : 255.255.255.0
まとめた表記 : 192.168.1.40/24
最初の方法と比べると、さらに短くコンパクトに表現できます。これが上記で述べたCIDR:サイダー
です。
#VPC
AWSではVPC
という領域を作るとそこに自由なネットワークを作れます。
VPCを作る時には、どのようなIPアドレス範囲を使うか指定します。
##サブネット
VPCを作ったら、それをさらにいくつかに分割して利用します。
分割したネットワークのことをサブネット
と言います。
###パブリックサブネット
インターネットからアクセスすることを目的としたサブネットです。
ここにWebサーバーを設置してインターネットからアクセスできるようにします。
###プライベートサブネット
インターネットから直接接続できないようにしたサブネットです。
ここにはデータベースなどインターネットから隔離しておきたいものを設置します。
##インターネットゲートウェイ
VPCであるサブネットをインターネットに接続するには、インターネットゲートウェイ
を使います。
これは「自分のネットワークにインターネット回線を引き込む」というイメージの作業になります。
##ルートテーブル
ネットワークにデータを流すにはルーティング情報
と呼ばれる作業が必要です。
この設定をルートテーブル
と呼びます。
この設定により宛先のIPアドレスを区別し、送信されたデータをどのネットワークに転送するかを決めることができます。
宛先アドレスをディスティネーション
と呼びデータを転送するネットワークをターゲット
と呼びます。
#仮想サーバー
AWSでは仮想サーバーはEC2
を使って作成します。
作成した仮想サーバーのことをインスタンス
と言います。
インスタンスにはパブリックサブネットでし使用可能なプライベートIPアドレスを割り当てます。
しかしプライベートIPアドレスではインターネットに接続できません。
なのでインスタンスを起動する時にはパブリックIPアドレスを設定する必要があります。
##EGPとIGP
インターネットではルーター同士が通信してルートテーブルの情報のやりとりをして、必要に応じて自動で更新するようにしています。
これはルーティングプロトコルという仕組みで実現されており、大きく分けてEGP
とIGP
の2つから成り立っています。
###EGP
AWSなどのある程度大きなネットワークはそのネットワークを管理するAS番号
という番号を持っています。
EGPではこのAS番号をやりとりして、どのネットワークの先に、どのネットワークが接続されているか
を大まかにやりとりします。
###IGP
上記の EGP内部のルーターどうして情報のやりとりをします。
つまり、詳細な情報のやりとり
を行います。
##ポート
TCP/IPで通信するサーバーなどの機器には、他のコンピューターと、データを送受信するためのデータの出入り口が用意されています。
これをポート(Port)
と言います。
このポートのおかげで、1つのIPアドレスに対して、複数のアプリケーションが同時に通信できます。
住所でいうとネットワーク部が市町村、ホスト部がマンション名、ポートが部屋番号です。
##ファイアーウォール
ファイアーウォール
は通してよいデータだけを通して、それ以外を遮断する機能
のことです。
その最も簡単な構造のものが、パケットフィルタリング
です。
###パケットフィルタリング
パケットフィルタリングは、流れるパケット(データ)
をみて通過の可否を決めす仕組みです。
パケットフィルタリングは、IPアドレスとポート番号などパケットに付属する各種情報をみて、通過の可否を決めます。
###セキュリティーグループ
実世界でのパケットフィルタリングを更生するのは、ルーターやサーバーもしくは専用のファイアーウォール機器です。
AWSでは、インスタンスに対して更生するセキュリティーグループ
がこの機能を担当します。
###インバウンドとアウトバウンド
セキュリティーグループの設定にはインバウンド
とアウトバウンド
の2つがあります。
前者が、 外からインスタンスに接続する向き
後者がこのインスタンスから外側に接続する向き
です。
#Webサーバー
Webサーバー
とはクライアント(Webブラウザ)のリクエストを解釈し、そのリクエストに応じたデータをクライアントへ返す機能を持ったサーバーのことです。また、このやりとりはHTTPプロトコル上で行われます。ブラウザーは、ユーザーから入力されたURLを元にWebサーバーへ接続し、要求された情報を取得して画面に表示します。
##Nginx
Nginx(エンジンエックス)
とはオープンソースのWebサーバーです。
他の有名なWebサーバーであるApache
と比べ処理が軽く大量のリクエストを処理するのに向いている
CPUリソースを多く消費する動的コンテンツの処理スピードはApacheの方が速いと言われている
#ドメイン
WebブラウザにパブリックIPアドレスを入力することで、Webサイトにアクセスできます。
しかし一般にWebサイトにアクセルする時には直接パブリックIPアドレスを入力することはほとんどありません。
なぜなら単なる数字であるIPアドレスは覚えずらいからです。
そのため、一般的にはwww.example.co.jp
などのドメイン名
を使って、アクセスします。
##DNS
TCP/IPでは、相手先を確認するのは、あくまでもIPアドレスです。
ドメイン名でアクセスする時も最終的にIPアドレスに変換して接続します。
その時に使われる仕組みがDNS
です。DNSを用いて、あるドメイン名からIPアドレスを引き出すことを名前解決
と言います。
IPアドレスとドメイン名を変換するのはDNSサーバー
です。
DNSのシステムは世界中に散らばったDNSサーバー群で構成され、それぞれのDNSサーバーは自分の担当する範囲でのみ、ドメインとIPアドレスの変換を行ないます。もし、担当する範囲外の名前解決が必要になった場合は、他のDNSサーバーへと処理を転送します。
#HTTP
Web通信ではHTTP
という通信プロトコルが使われています。
HTMLをはじめとするWebサービスに必要とされる情報を伝達するためのルールです。
HTTPはクライアント・サーバ型のアーキテクチャで2者間でリクエスト
とレスポンス
をやりとりする方式を定めています。
##リクエストの構成
リクエストは次の3つで構成されています。
###リクエストライン
リクエストラインは要求コマンドのことです要求方法
と要求するURL
が含まれる冒頭の1行です
###ヘッダー
ヘッダー
はブラウザから送信する追加情報です。
・要求したいホスト名
・ブラウザの種類
・対応言語
・Cookiの情報
・直前に見ていたページのURL
上記のようなものが含まれており多くの場合複数行に渡ります。
###ボディ
ボディ
はHTMLフォーム(form要素)やAjaxなどで、POSTメソッドを利用してデータをサーバーに送信する時に利用されます。
ヘッダーとボディは空行で区切られます。
##レスポンスの構成
レスポンスは次の3つで構成されます。
###ステータスライン
ステータスラインは
その要求の成否ほを返す冒頭の1行です。
正常に修理すれば200 OK
というステータスが返されます。他には大まかに下記のようなステータスが返されます。
コード | 意味 |
---|---|
100番台 | 処理中 |
200番台 | リクエスト成功 |
300番台 | リダイレクト |
400番台 | クライアントエラー |
500番台 | サーバーエラー |
###ヘッダー
ヘッダー
は追加情報を返すために利用されます。よく利用されるものとしてボディの種類を示すContent-Typeヘッダー
やボディの長さを示すContent-Lengthヘッダー
などがあります。
多くの場合複数行に渡ります。
###ボディ
ボディ
は要求されたURLに対するコンテンツです。HTMLのテキストや画像など、要求されたコンテンツデータそのものです。
ヘッダーとボディは空行で区切られます。
##HTTPメソッド
HTTOメソッド
とはコンテンツに対する操作コマンドのことです。多くの場合はGET
や`POSTを使います。
メソッド | 意味 |
---|---|
GET | リソースを取得する |
POST | リソースにデータを送信したり、子リソースを作成したりする |
HEAD | リソースのヘッダーの情報だけを得る(更新日時などステータスだけ取得したい時など用いる) |
PUT | リソースを更新したり、作成したりする |
DELETE | リソースを削除する |
OPTIONS | サーバーがサポートしているメソッドを取得する |
TRACE | 自分宛にリクエストメッセージを返してループバックする |
CONNECT | プロキシ動作のトンネル接続を変更する |
#プライベートサブネット
上記でプライベートサブネット
について簡単に書きましたが、ここではもう少し詳しく書こうと思います。
##プライベートサブネットの利点
上記で書いたWebサーバーではパブリックアドレスを割り当て、パブリックサブネットに配置しました。
パブリックサブネットはインターネットゲートウェイを経由してインターネットに接続されています。
つまりパブリックサブネットに配置したWebサーバーは、インターネットからSSH
やWebブラウザ
でアクセスできます。
しかしシステムを構築するサーバー群の中には、インターネットから直接アクセスして欲しく無いものもあります。
データベースなどはその典型的な例です。
隠したいサーバーはインターネットから接続できないサブネット
に配置します。このサブネットが、プライベートサブネットです。
プライベートサブネットを構築することで、サーバーを隠すことができ、セキュリティを高められます。
#データベース
Webアプリケーションに構築されるデータはデータベース(DB)
に格納されます。
そしてデータベースと普段呼んでいいるものは下記のように分けられます。
名前 | 説明 |
---|---|
データベース(DB) | データを入れる箱ですデータが入ります |
リレーショナルデータベース(RDB) | データベースの種類、データを表形式で扱うデータベース |
データベースマネージメントシステム(DBMS) | データベースを管理するシステム |
リレーショナルデータベースマネージメントシステム (RDBMS) | リレーショナルデータベースを扱うための道具 |
これらを一般的にはデータベースと呼んでいます。
##データベースサーバー
データベース管理システム(DBMS)を搭載したサーバーなどをデータベースサーバー
と呼びます。
プライベートサブネットを構築したら、その中にデータベースサーバー構築します。
##RDS
RDS
はAWSのフルマネージド型データベースサービス。
サーバーやOSの管理なしに、リレーショナルデータベース(RDB)を利用できます。主要なRDBMS製品と互換性があるため、既存のデータベースの移行も可能です。EC2よりも、さらに簡単にデータベースを運用できます。
#SSH
SSH
とはリモートコンピュータと通信するためのプロトコルです。
認証部分を含めネットワーク上の通信がすべて暗号化されるため、安全に通信することができます。
SSHでは公開鍵暗号
を利用し、共通鍵を暗号化して鍵交換を行っています。かつ、通信自体は高速な共通鍵暗号を用いているため、速度低下を抑えています。
秘密鍵と公開鍵
ネットワークの世界では、データを暗号化したり、元に戻したりするために必要なデータを鍵
と呼んでいます。そのうち、全員に公開される鍵を公開鍵
、自分以外知らない鍵を秘密鍵
と言います。
このような管理の仕方を公開鍵暗号方式
と言います。
ネットワーク上でやり取りされるデータは、公開鍵を使って暗号化すると対応する秘密鍵でしか復元できません。逆に、秘密鍵を使って暗号化すると、対応する公開鍵でしか復元できません。
#アプリケーションサーバー
アプリケーションサーバー
はWebサーバ-から受け取ったリクエストを受け取り、Javaやphp、Rubyなどのサーバーサイド・プログラムを実行し、そのデータを加工したり、データベースのデータを検索・加工した後、Webサーバーに応答を返すます。
##Unicorn
Unicorn
は、Railsなどでつくられたアプリケーションを動かすアプリケーションサーバです。
Unicorn Workerというものを使ってリクエストに対応しており、サーバのダウンタイムなしでデプロイできます。
またUnicornは Rack Webサーバ
に分類されます。
###Rack
Rack
とはRubyの様々なフレームワークとRubyを動かすための様々なWebサーバーの間を取り持つライブラリです。
そしてRubyアプリケーションとWebサーバーをつなぐための中間サーバーをRack Webサーバ
と言います。
Rack Webサーバーを挟むことで、RubyアプリケーションなどをWebサーバー上で動作させることができます。
#NAT
プライベートサブネットに配置したサーバーは、インターネットから接続できないため安全です。しかしインターネットと一切通信できないためサーバーのアップデートやソフトウェアのインストールの時不便です。この問題を解決するのがNAT
です。
NATはプライベートサブネット⇨インターネット
の向きの通信だけを許可します。
##NATの仕組み
NATはIPアドレスを変換する装置で、2つのネットワークインターフェースを持ちます。
片方のインターフェースには、一般にパブリックIPアドレス
を設定し、インターネットに接続可能な構成にしておきます。もうか途方のインターフェースにはプライベートIP
を設定し、プライベートサブネットに接続します。
プライベートサブネットに接続するホスト(サーバーやクライアント)が、インターネットにパケットを送信しようとした時、NATはパケットの送信元IPアドレスを自身のパブリックIPアドレスに置換します。こうすることで、送信元がプライベートIPアドレスではなくNATが持つパブリックIPアドレスに変わるため、インターネットに出ていくことができます。
パケットの送信元IPアドレスが置換されているので、接続先からはNATが接続してきているように見えます。そのため応答パケットは、このNATに戻ってきます。NAT戻ってきた応答パケットの宛先を、元のホストのIPアドレスに置換してプライベートサブネットに転送します。
このようにNATがIPアドレスを置換することによって、プライベートサブネットに存在するホストは、インターネットと通信するようになります。
NATを用いるとプライベートサブネットからインターネットサブネットに接続することができますが、逆にインターネットからサブネットの方向に接続できません。
そのため、サブネットにパブリックIPアドレスを割り当ててインターネットに通信を許すよりセキュリティーが高められます。
##NATの種類
NATには2種類あります。
・IPアドレスだけを置換するもの(NAT)
・IPアドレスとポート番号の両方を置換するもの(NAPT)
どちらも一般的にNATと呼ばれます。
##NATインスタンスとNATゲートウエイ
AWSでNATを構成する場合、次の2つの方法があります。
###NATインスタンス
NATソフトウェアがあらかじめインストールされたAMIから起動したEC2インスタンスを使う方法です。
###NATゲートウェイ
NATゲートウェイは、NAT専用に構成された仮想的なコンポーネントです。配置すサブネットを選ぶだけで構成できます。
#AWSのサービス
今まで、AWSのを使うのに必要な基本的な知識をまとめてみましたが、ここではそのほかに調べたAWSのサービスをいくつか書こうと思います。
S3
S3
とはクラウド型のオブジェクトストレージサービス
です。
###オブジェクトストレージ
オブジェクトストレージ
とは、オブジェクト(ファイルなど)単位で出し入れが可能なストレージです。各地の物理的なデータセンターに分散して保存されていることで障害に強かったり、オブジェクト単位でのバージョンを残すことが出来ます。
###ストレージ機能
S3の一般的な使い方は、ファイルをS3に保存するストレージ機能を使うことです。
ファイルのバックアップや、ファイル処理の加工前、もしくは加工後のファイルを保存する、画像ファイルやCSSなどWebで使う静的なファイルをS3に置いて配信することができます。
S3は事前に保存容量を決める必要は無く、入れた分だけ課金されますので、ストレージの空きを気にする必要がありません。
##Elastic Beanstalk
Elastic Beanstalk
はアプリケーションのデプロイ・管理サービスです。
実態はEC2やS3、RDSやなどをプロビジョニングするサービスです。
これはEC2やネットワークの存在を強く意識することなく、アプリケーションのデプロイと管理ができます。
#まとめ
以上で一通り調べたことをまとめ終わりました。
なにか間違っているところなどあればご指摘ください!