AWSを使ってインフラの基礎をさくっと学習してみた

##前置き

この記事の参考書籍はこちらです
>[『Amazon Web Services 基礎からのネットワーク＆サーバー構築』](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%EF%BC%86%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88-%E5%A4%A7%E6%BE%A4-ebook/dp/B084QQ7TCF)

こちらの書籍の内容は、AWSを使ってWordPress&MySQL(MariaDB)環境のブログサイトをインターネットに公開するという工程で「自分でネットワークやサーバーを構築できるようになること」を目指す内容です。
『基礎からの』というタイトルはその通りで、インフラに関するすごく初歩的な内容の説明がかなーり多く書いてあります（比重としては純粋なAWSのことより記述が多いかも？）例えばTCP/IPについての説明があったり、簡単なHTTPリクエストを跳ね返すプログラムを作ってみるコラムがあったりします。なので『AWSを学ぶ』というより、『AWSを使ってインフラの基礎を学ぶ』ってな感じの内容となっております。めちゃくちゃ重い内容を取り扱っているわけではなないので丸２、３日もあれば十分修了できる内容かと思います。

###この本で勉強するのにおすすめな人はこんな人です。
- AWSとか、インフラってなんか怖い
- プログラミング学習してるけど、いまいちwebサービスを公開する仕組みがわからない
- インフラの基礎をより実践に近い形で理解したい
- インフラにも強いエンジニアになりたい

###逆にこんな人からすると物足りないかもなのでおすすめできないです
- もう低レイヤーの知識はばっちり！
- より高度なクラウドインフラ構築について学びたい

僕は前者に当てはまるタイプだったので、とても満足な内容でした！

##この記事では以下についてを記述します

- AWSとは
- 開発者がインフラを構築すること、理解することのメリット
- インフラ構築における基礎知識
- 物理的ネットワークとAWS
- SSH通信によるリモートサーバーの操作について

実際に書籍内でどう構築していくのかは割愛します、その点が気になる人は、Youtubeでも活動をされている、クラウドエンジニアのくろかわこうへいさんがQiitaで手順をまとめていますのでそちらをご覧になるといいかもです。
>[【Amazon3時間クッキング】材料費500円でAWSにWordPress環境を構築するレシピ]
(https://qiita.com/blackriver/items/9ef870b1624373d18dfa)

## AWS(Amazon Web Services)とは

>Amazon Web Servicesとは、Amazon.comにより提供されているクラウドコンピューティングサービスである。ウェブサービスと称しているが、ウェブサービスに限らない多種多様なインフラストラクチャーサービスを提供している。これらのサービスは全世界で22の地理的リージョンで提供されている。

>参考 [ウィキペディア](https://ja.wikipedia.org/wiki/Amazon_Web_Services)

 インターネットなどを経由してコンピューター資源を貸してもらえるサービスの総称をクラウドコンピューティングサービスといいます。イメージとしては自分のパソコンやスマホにインストールしなくても使えるソフトウェアを貸してもらうみたいな感じです。
 AWSはクラウドコンピューティングサービスの中でもWebサービスを作るのに必要なコンピュータそのものやネット回線をインターネット経由で貸してもらい、仮想的にインフラを構築できる、IaaS(インフラストラクチャーアズアサービス)と呼ばれるサービスを提供してくれています。
つまりWebサービスやアプリをインターネットに公開するときに用意する、物理的なインターネット回線やサーバーなど本来高いコストが必要なものを貸してもらえるので、使った分だけの使用量を払うだけで、好きな組み合わせやカスタマイズのインフラで自分のサービスやアプリをインターネットに公開できるわけです。

AWSはそんなIaaSの中で世界トップのシェアを誇り、日本でもさまざまなサービスを作るのに、あらゆるIT企業が利用しているという背景があります。

#### AWSとは、まとめ

- Webアプリ等の下支えであるインフラ(ネットワーク、サーバー)を貸してくれるサービス
- 世界でトップのシェア
- 日本でも多くの企業で採用されている
- 様々な種類のインフラの構築ができる

こういったことからAWSを理解することはインフラ構築ができることとほぼ同義と言えます。すごい。

## 開発者がインフラを構築すること、理解することのメリット

実際の開発現場では、インフラを構築するのはインフラエンジニア、アプリケーション開発はアプリケーション開発者というように役割分担されていることが多くあります、大規模な開発ほどその傾向は強いと思います。
このようにインフラとアプリケーションで役割が別れているのは、決して悪いことではありません。インフラエンジニアの仕事は、運用、保守を含んでいて、様々な知識とノウハウが要求されるからです。

しかしアプリケーション開発者がインフラについて理解することにもメリットがあります。インフラ知識を身につけると以下のようなことができるようになります。

- テスト環境をすぐ構築するなど開発の自由度があがる
インフラの知識が全くない状態だと、自分の作ったアプリケーションを実践に近い環境で試したくなっても、簡単には試せません。インフラ知識を身につけることで、人に迷惑をかけることなく様々な実験ができます。

- 障害に強くなる
システムトラブルがあったときに、どこに問題があるのかの特定が容易になる

- システム全体での幅広い対応ができるようになる
リソース不足などの対応をアプリケーション側だけでなくシステム全体で対応することができる

- 希少性の高い人材となる
いうまでもなくスキルの幅が広がるので、より希少性の高い人材となりますので、収入面などでも有利になります。

このようなメリットが開発者がインフラを理解することにはあります。学びたくなりますね〜

## インフラ構築における基礎知識

###サーバー

サーバーには元々「供給する」というような意味があります。ウォーターサーバーとかもそうすよね、水を供給するからウォーターサーバーです。つまり、WebサーバーはWebの機能を提供するサーバー、データベースサーバーはデータべースの機能を提供するサーバーです。そしてその機能やサービスを受ける側のコンピュータをクライアントといいます。

しかしサーバーも本質はクライアントと一緒でコンピュータです。なぜならサーバーとはコンピュータにサーバー用のOS、LinuxやWindows Serverなどをインストールしたものに過ぎません。なので、家にあるパソコンでもLinuxをインストールすればサーバーになります。そしてそのサーバーにWebの機能を提供するソフトウェアをインストールしたものがWebサーバー、データーベースの機能を提供するソフトウェアをインストールしたものがデーターベースサーバーとなります。

サーバーについてをもう少し詳しく知りたい方は先日、LPIC学習を通して学んだLinuxサーバーについてをまとめていますので是非ご覧になってください。

>https://qiita.com/nishio0024/items/128fef168cf2e11e376b

###ネットワーク

けっこう混同しがちですがネットワークとインターネットは意味合いが少し違います。

まず、インターネットとはLAN(ローカルエリアネットワーク)同士を世界中でつないでいるものです。

ネットワークとは狭義ではLAN(ローカルエリアネットワーク)のことを指すこともありますが本来はインターネットもLANも全て包含しているのがネットワークです。しかし、あえてネットワークと呼称するときはLANのことを指してい場合が多いです。

インターネットに接続できるLANはTCP/IPというプロトコルが使われます

###プロトコル

ネットワークの通信にはプロトコルと呼ばれるいわゆる取り決めが細かく決まっています。この取り決めのおかげでいろいろなデバイスからいろいろな形式のケーブルやルーターを通っていろいろなデータが送りあえます。

インターネット通信をするためのプロトコルの構成モデルとして、OSI参照モデル、TCP/IPモデルなどの規格があります。このモデルは何層かの階層でプロトコル群が分けられておりそれぞれの層は干渉しあわないようい設計されていて柔軟にいろいろな条件をクリアできるようになっています。身近のこと例えてみると荷物をや手紙を送る流れが近いです。例えば、どの言語で書くかという取り決め（日本語？英語？）、どんな梱包をするかの取り決め（段ボール？封筒？）、郵便番号や住所の書き方の取り決め、どの運送会社を使うかの取り決め（佐川？ヤマト？）、時間指定の取り決め、などなどこういったことは荷物を送るのに必要ですよね、そしてそれぞれの取り決めが他の取り決めに干渉しないようになっています。運送会社が変わっても住所の書き方は変わらないといった感じです。
こういう取り決めの外枠の部分をインターネットではOSI参照モデル、TCP/IPモデルなどで定めているわけです。
すごいざっくりイメージを書いたので、詳しいことを知りたいかたは是非調べてみてください。


## 物理的ネットワークとAWS

AWSでインフラを構築するというのは、「仮想的にインフラを構築する」ということです。そこでいろいろな特殊な用語が使われているので、それを物理的な機器との関係性をまとめておきます。これが理解できていると、構築の全体像のイメージが掴みやすいのと、他のIaaSを使ってインフラ構築するときにも役立つかと思います。

###リージョンとアベイラビリティーゾーン

仮想的にインフラを構築するといっても記憶装置などの物理的な領域は必ずどこかに無いといけません。AWSはこの物理的な領域（データセンター）からリソースをインターネット経由で割り当てる形で「仮想的にインフラを構築する」ということを実現しています。
AWSではこのデータセンターのことがアベイラビリティーゾーンと呼ばれています。アベイラビリティーゾーンはリージョンと呼ばれるくくりのなかに複数存在していて、かつ物理的に距離が相当離されれています、つまりあるアベイラビリティーゾーンで地震や洪水などの被害を受けても他のアベイラビリティーゾーンが影響を受けないように設計されているのです。

###VPCとインターネットゲートウェイ
VPCはどのアベイラビリティーゾーンに作るか決めて作ります、VPCを作ると言う行為は実世界においてはルーターやハブを用意して、自分用のネットワークを作るということ、インターネットゲートウェイを作成する行為は作った自分のネットワークにインターネット回線を引くことです。

###EC2インスタンスとセキュリティグループ
EC2インスタンス（仮想サーバー）はVPCの中に作ります、インスタンスを作るのは、実世界では物理的なサーバー用のコンピュータを用意すること。
具体的にはAMI（Amazon Machine Image）と呼ばれるOSがインストールされて初期アカウントの登録まで済んでいるマシンのイメージを選択して、それをコピーするという作業になります。ここで使われる仮想のハードディスクをEBS（Elastic Block Store）と呼びます。
このインスタンスに設定できるセキュリティグループはファイアウォールとして機能します、実世界ではルーターやモデム自身、または専用のファイアウォール機器がこの役割を担います。

インスタンスを作成できた段階で、AWSでサーバーを用意できたことになります。

## SSH通信によるリモートサーバーの操作について

仮想サーバーを用意できたら次は、そのサーバーに持たせたい役割のソフトウェアをインストールするのですが、これはAWS側で作業するのではなく、SSH(Secure Shell)というものをつかます、これは暗号や認証の技術を使って安全にリモートコンピュータを操作できるプロトコルです。これを使えば先ほど作ったインターネット上の仮想サーバーを操作できます。ちなみにMacならSSHによる操作をターミナルでできます。SSH用のパッケージがおそらくデフォルトで入っていますので`ssh`コマンドで操作します。
SSHではインスタンス作成時にダウンロードしたキーペアで公開鍵認証を使ってインスタンスに接続します。

書籍でこれは書いてませんでしたがインスタンス作成時に保存したキーペアは慣習的に`~/.ssh`(ホームディレクトリ直下の.sshディレクトリ)に置くようです。

.sshディレクトリにキーペアを配置した場合は書籍に書いてあるこのコマンドをホームディレクトリで実行してもインスタンスに接続できません。

```
~ $ ssh -i my_key.pem ec2-user@xxx.xxx.xxx.xxx
```
*`my_key.pem`はキーペアのファイル名、
xxxは該当インスタンスのパブリックIPアドレスです。*

その場合は下記のように絶対パスなどで指定すると接続できます。

```
~ $ ssh -i ~/.ssh/my_key.pem ec2-user@xxx.xxx.xxx.xxx
```

このコマンドで仮想サーバーに接続すると、自分のコマンドプロンプトがそのコンピュータのコマンドプロンプトに置き換わる感じで操作できます。この状態でyum コマンドなどでインターネット上からソフトウェアをインストールすることでWebサーバーやデータベースサーバーを作ることができます。


##まとめ

AWSで仮想的なインフラを作る流れはざっくり以下の感じです。

- データセンター（アベイラビリティーゾーン）を選択
- 選択したアベイラビリティーゾーンに仮想の自分用ネットワークを作る（VPC）
- 仮想の自分用のネットワークの中に仮想のサーバーを作る（EC２インスタンス）
- 仮想サーバーをSSH通信を使ってリモート操作してアプリケーションなどにしていく

厳密には細かい設定がいっぱいあるのですが、とりあえすこれだけすればインフラができちゃいます、結構簡単に見えますよね。このことを概念においておくと、実際にインフラを構築する際もなんのための操作なのかが明瞭になり構築しやすくなるのではないかと思います！

以上です！最後まで読んでいただきありがとうございました！