AWS初心者のための勉強会資料【入門編】〜結局AWSって何なの？〜

今回はAWS勉強会入門編として、AWSとは何なのか？ AWSのサービス概要や特徴などを解説していきます。
この記事のゴールは基本サービスであるEC2を触れるようになるための事前知識をマスターすることです。

※ 本記事は超入門編であり、サービスについて細かい説明は行なっておりません。各サービスには公式ドキュメントへのリンクを貼っているので、詳細を知りたい方はそちらをご参照ください。

## AWSについて
AWSとは何者なのでしょうか。最初にAWSのイメージを掴むために概要の説明を行います。

### AWSとは何か？
AWSは**Amazon Web Services**の略です。まずは[公式サイト](https://aws.amazon.com/jp/s/dm/landing-page/start-your-free-trial-d/)の説明を見てみましょう。

> アマゾン ウェブ サービス（AWS）は、米アマゾン・ドット・コムを支えてきた技術がベースとなるクラウドサービスです。柔軟で耐久性と拡張性に優れており、世界で数百万以上、日本でも10万以上のお客様が利用しています。

Amazon.com社内で培われた技術を「クラウド」の形態で提供するサービスとのこと。Amazon.comは言わずと知れた世界最大級のECサービスですね。

### AWSの歴史
それではAWSの誕生とそれからの沿革を見ていきましょう。[AWSが誕生するまでの秘話](https://www.slideshare.net/horiyasu/20140703-geechs)からエッセンスをピックアップします。

> AWSはAmazon社内のビジネス課題を解決するために生まれました。

> 例えばAmazonは顧客の過去の注文データを全て保管しています。これにより以前購入した商品のお知らせや精度の高いレコメンドを行えるようになりました。全ての注文データを保存するためには大容量かつデータが失われることのないストレージサービスが必要となり、ここからAmazon S3[^1]が誕生しました。

> またアフェリエイトプログラムの成長に伴い、支払計算システムの処理所用時間の遅延が課題となっており、この解決のために大規模バッチ処理を並列で行えるAmazon Elastic MapReduce(EMR)[^2]が生まれました

> AWSはAmazonのビジネス課題を解決するために作り上げたITを誰でもサービスとして利用できるようにしたものです。一般的にはクラウドコンピューティングと呼ばれています。

つまり、AWSは元々はAmazon社内の課題を解決するために開発された技術で、それをAmazon以外の人々や企業でも使えるようにしたサービスということですね。

AWSの沿革については[こちら](https://aws.amazon.com/jp/aws_history/details/)に概略が書かれています。

### クラウドサービスとは？
ここまで「クラウドサービス」という言葉が出てきていますが、AWSの具体的な話しを進める前にクラウドについて確認しておきましょう。

> 「クラウド」とは、クラウドサービスプラットフォームからインターネット経由でコンピューティング、データベース、ストレージ、アプリケーションをはじめとした、さまざまなITリソースをオンデマンドで利用することができるサービスの総称です。`

引用元：[クラウドとは？](https://aws.amazon.com/jp/cloud/)

上記の説明にあるように、クラウドとはITビジネスを展開するために必要なリソースを、オンデマンドで利用することができるサービスです。オンデマンド(on demand)とは必要な時に必要なだけ利用するということです。

従来はITでビジネスを展開しようと考えた時、必要なサーバ等のハードウェアやその置き場所、各種ソフトウェア、ライセンスなど全て自社で調達しなければなりませんでした。クラウドを使うことでインフラ調達のコストを抑えつつ迅速に行い、製品を素早く市場に投入したり、削減できた資金をより新しい価値を生むことに投資することができるようになります。

クラウドはこのようなメリットがあり、日本政府も**クラウド・バイ・デフォルト原則**として、これからは[政府情報システム](https://www.mhlw.go.jp/content/12601000/000343294.pdf)をクラウドベースで検討するという提言を出しています。

> 政府情報システムは、クラウド・バイ・デフォルト原則、すなわち、クラウドサービスの利用を第一候補として、その検討を行うものとする。

### クラウドサービスの分類
クラウドはそのサービス形態によって「IaaS」「PaaS」「SaaS」の3つに分類されます。

#### IaaS(Infrastructure as a Service)
IaaSとは仮想サーバやOS、ネットワークなどのITインフラをインターネット上のサービスとして提供する形態です。ユーザはビジネス要件に応じてハードウェアのスペック、OSの種類などを必要に応じて選択することができます。クラウドサービスの分類の中で最もユーザの自由度が高い形態です。

#### PaaS(Platform as a Service)
PaaSとはアプリケーション開発のプラットフォームをサービスとして利用できる形態です。ハードウェアやOSに加えて、開発に必要なライブラリ、ミドルウェア、データベースなどもサービスとして提供され、ユーザは自社のアプリケーション開発に集中することができます。

#### SaaS(Software as a Service)
SaaSは完成されたソフトウェア製品をインターネット経由で利用する形態です。ユーザ自身が開発や運用を行うことはありません。SaaSアプリケーションの一般的な例の１つにGmailなどのウェブメールサービスがあります。

これらのクラウドの分類は以下のような図で説明されることが一般的です。大まかにはサービスとして提供されるレイヤが多いほどユーザが自身で用意する必要が少なくなりますが、カスタマイズ性は乏しくなります。ユーザはビジネス要件に応じて適切なサービス携帯を柔軟に選択する必要があります。

![クラウドの分類.png](https://qiita-image-store.s3.amazonaws.com/0/194749/8f4f4558-4f5c-27cf-ce58-1602d260bb47.png)

引用元：[知っておきたいIaaS、PaaS、SaaSの違い](https://www.cloud-ace.jp/report/detail01/)

### AWSの評価
クラウドの概念について理解できたところで、クラウドサービス市場におけるAWSのポジションを見ていきましょう。米調査会社の[Gartner](https://www.gartner.co.jp/)によると2017年のクラウドサービス市場でAWSは51.8%のシェアを誇り、マジック・クアドラントにおいてもビジョンの完全性と実行能力に優れた「リーダー」と評価されています。

<img width="477" alt="クラウド市場のシェア.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/0646bb9b-5cc5-f426-147e-54950d3c7702.png">

引用元：[Worldwide IaaS Public Cloud Services Market Share(Gartner)](https://www.gartner.com/newsroom/id/3884500)

<img width="649" alt="マジック・クアドラント.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/35e3ec19-186b-2c1f-097b-fdacaa39484b.png">

引用元：[Gartner’s IaaS Magic Quadrant](https://architecht.io/aws-and-microsoft-get-some-company-in-gartners-iaas-magic-quadrant-49f396e6b18e)
※マジック・クアドラントについては[こちら](https://boxil.jp/mag/a3614/)を参照。
横軸がビジョンの完全性、縦軸がその実行能力を評価しています。

Google、Microsoft、IBMといった名だたるIT企業がクラウドサービス市場に参入していますが、その中でも先進性・シェア共にAWSが圧倒的に優位に立っているということがわかります。

## AWSの特徴
なぜこれほどまでにAWSが広く受け入れられているのでしょうか。AWSによる公式の[Overview](http://awsmedia.s3.amazonaws.com/AWS_Overview_Whitepaper_120809.pdf)にて、AWSを他のサービスと区別する違いは以下の5つだと述べられています。

### Flexible(柔軟性)
AWSでは様々なプログラミングモデルや言語、OSなどをAWS社内で培われたナレッジに基いてサービスとして提供されます。ユーザはビジネス要件に応じてそれらを柔軟に組み合わせ、より少ない投資で導入することができます。

### Cost-effective(コスト効率)
AWSではハードウェア等の初期投資が不要で、オンデマンドで必要な分だけリソースを確保し、使ったリソース分にだけ課金されます。またAWSを使うことでビジネスを迅速に展開でき、このこともコスト低減に役立ちます。結果としてトータルのROI(Return On Investment)を高めることができます。

### Scalable and elastic(拡張性と弾力性)
ビジネス要件に応じて素早くリソースを拡張したり縮小することができます。例えばECサイトの場合、特典期間に通常の2~3倍のトラフィックが発生することがあります。従来のITではこのような瞬間的なトラフィックに対応するためにはインフラへの投資が必要でした。AWSではELB(Elastic Load Blancer)とAuto-Scalingを導入することで、自動的にクラウドリソースを増減することができます。

### Secure(セキュリティ)
セキュリティの面でもメリットがあります。物理的側面ではAWSは世界中にデータセンタ保有しており、部外者は入室できないなど、長年の経験に基づいて堅牢なセキュリティ対策を実施しています。ユーザがAWS上に保管するデータは暗号化が可能です。AWSのサービスを利用する際には権限を持たないアクセスを制限することでセキュリティを担保します。これはユーザがAWSのセキュリティベストプラクティスを正しく理解してシステムを構築しなければならないため、これらを導入するためのドキュメントを提供しています。

### Experienced(経験豊かな)
AWSは毎年数百万ユーザが利用し数十億ドルの売上を誇るAmazon.comのインフラストラクチャを長年運用してきた経験があります。既存のIT資産をAWSへ移行するには、今までのサービスが継続して提供できるように様々なことを考えなければいけません。AWSを利用するば既存IT資産をシームレスにクラウドへ移行できます。AWSの豊かな経験に基づくインフラストラクチャはスケーラビリティ、セキュリティ、信頼性、コスト効率に置いてユーザの期待を満たす、またはそれ以上の結果をもたらします。

ここまででAWSとは何なのかイメージは掴めてきたでしょうか？
ここからはAWSのサービスを利用する上で、知っておくべき事前知識をいくつか説明していきます。

## マネジメントコンソール
[**マネジメントコンソール**](https://aws.amazon.com/jp/console/)はAWSのサービスを利用するためのWebユーザインタフェースです。ブラウザからアクセスして使うもので、AWSを利用する方法のうち最も基本的なものです。(玄人向けには[AWS CLI](https://aws.amazon.com/jp/cli/)や[AWS SDK](https://aws.amazon.com/jp/tools/)、[AWS API Gateway](https://aws.amazon.com/jp/api-gateway/)などがあります。)

マネジメントコンソールではAWSのアカウントを管理したり、サービスを検索したりすることができます。AWSを利用する上で最も多く使用するツールになります。
<img width="1429" alt="AWS_マネジメントコンソール.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/2b401852-d325-1e81-fcf9-9ba509989e96.png">
AWSマネジメントコンソールのサービス検索画面。100以上のサービスを利用することができます。

### ルートアカウント
AWSを利用するために最初に作成するアカウントを**ルートアカウント**と言います。
ルートアカウントの作成にはメールアドレスとクレジットカードが必要です。アカウントを作成しただけでは課金はされませんが、サービスを利用すると利用量に応じて登録したクレジットカードに請求がくるので注意が必要です。

AWSではルートアカウントを用いることは**非推奨**とされています。ルートアカウントはAWSの全てのサービス・リソースに対するアクセス権限を持つため、アカウントをハッキングされたり、オペレーションミスが発生した際のリスクが高いためです。
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)にもこのことが書かれています。

> ベストプラクティスとして、ルートユーザー は日常業務に使用しないでください。代わりに、IAM エンティティ (ユーザーおよびロール) を作成します。

ルートアカウントは[MFA(Multi-Factor Authentication：多要素認証)](https://aws.amazon.com/jp/iam/details/mfa/)を設定し、管理者のみが利用できる状態とすることが望ましいです。(MFAは「二段階認証」ともよく呼ばれます。)

定常業務ではルートアカウントの代わりに**IAM**というサービスをユーザアカウント管理に利用します。

### IAM(Identity and Access Management)
[**IAM**](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction.html)とはIdentity and Access Managementの略で、ユーザーに対して AWSへのアクセスを安全に制御するための仕組みです。
アクセス権限を付与される実体としては**IAMユーザー**と**IAMロール**の2種類があり、アクセス権限はポリシーとしてこれらに関連づけられます。

#### IAMユーザー
[IAMユーザー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users.html)はパスワードを用いてAWSマネジメントコンソールにサインインすることができます。
ルートアカウントと異なり、それぞれのIAMユーザーに許される権限は、ポリシーによってコントロールすることができます。
管理者によって必要最小限の権限を持つIAMユーザーを作成され、その認証情報を担当者に共有し使用する流れとなります。
なお、IAMユーザーもルートアカウントと同様にMFAの設定は推奨です。

#### IAMロール
[IAMロール](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles.html)は許可される権限がポリシーで定義されるという点ではIAMユーザーと同じですが、それ単体でサインインすることはできません。
IAMユーザーは1人につき1つ割り当てられるべきなのに対し、IAMロールは複数の人に関連づけることができます。
これだけだと何のために必要なのかと思われるかも知れませんが、応用的な活用として[一時的セキュリティ認証情報(AWS STS)](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html)を使用して動的に一時ユーザーを作成する際に、権限付与に使われます。(よく分からなくても構いません。)

## リージョンとアベイラビリティゾーン
AWSのグローバルインフラストラクチャについて理解していきましょう。

### AWSのデータセンター
<img width="1260" alt="データセンター_-_AWS_のデータセンター.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/664bc7ff-c10f-459f-5892-f33826ac1aa4.png">
引用元：[AWSのデータセンター](https://aws.amazon.com/jp/compliance/data-center/data-centers/)

データセンターとは大量のサーバーを収容し、電力を確保し、安全に稼働させ続ける施設のことです。
AWSは独自のデータセンターを世界中に多数保有しています。独自に構築することで強固なセキュリティ、地震や洪水などの自然災害対策、電力効率の改善などを実現しています。

### リージョン
AWSのデータセンターは世界各地に存在しており、地理的に離れたロケーションのことを**リージョン**と言います。
2018年12月現在、世界中に20のリージョンが存在しており、さらに4つの新しいリージョンが追加される予定です。

<img width="839" alt="AWS_グローバルインフラストラクチャ___AWS.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/36bacd2a-60bc-a524-fad9-570693657d9f.png">
引用元：[グローバルインフラストラクチャ](https://aws.amazon.com/jp/about-aws/global-infrastructure/)

図中の数字は各リージョンで利用できるアベイラビリティゾーンの数を表しています。(後述)
日本では東京リージョンと大阪リージョンが利用できます。
※ただし大阪は「ローカルリージョン」の扱いであり招待制となっています。(2018年12月現在)

マネジメントコンソールでは現在のリージョンをヘッダ右側部分で確認することができ、リージョンの切り替えも自由に行えます。うっかり意図しないリージョンでサービスを利用しないよう、しっかりと確認しておきましょう。

<img width="406" alt="AWS_マネジメントコンソール.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/11f1858b-c670-4ca9-d094-3083582fdda6.png">

リージョンによってはコスト単価や利用可能サービスが微妙に異なります。新しいサービスはまず**米国東部（バージニア北部）**リージョンに導入され、徐々に他のリージョンに広がっていくことが多いです。

リージョンはさらに複数のアベイラビリティゾーンで構成されています。

### アベイラビリティゾーン(AZ)
アベイラビリティゾーン(Availability Zone、AZと略されます)はリージョンを構成する要素で、それ自体複数のデータセンタで構成され、高い耐障害性を提供します。
リージョンとAZの関係は以下の図が分かりやすいです。

<img width="508" alt="リージョンとアベイラビリティーゾーン_-_Amazon_Elastic_Compute_Cloud.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/1c143634-5777-35ba-a1b4-fc73b42fbba7.png">
引用元：[リージョンとアベイラビリティゾーン](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)

この図の通り、リージョンは複数のAZから構成されています。
リージョン間は「東京とロンドン」のように地理的に遠く離れているため、通信にはレイテンシ(遅延)が発生します。(数十〜数百msec)
一方で同一リージョン内のAZ間では高速なNWが敷設され、数msecという低レイテンシを実現しています。

### 可用性を向上させる工夫
ビジネスの観点からはITシステムの可用性は非常に重要な指標です。可用性とは「システムがどれだけ停止せずにユーザーへサービスを提供できるか？」ということです。
例えばECサイトであればシステムトラブルにより停止してしまうと、その時間の分だけ売上の機会を喪失してしまいます。大規模なシステムであれば僅かな停止が大きな損失へと繋がってしまいます。

可用性を向上する1つの手段として、**システムの冗長化**があります。また、冗長化の構成方法には複数のサーバを同時に稼働する**Active-Active構成**と、バックアップ用サーバを用意して障害時に切り替える**Active-Standby構成**のパターンがあります。

#### Multi-AZ構成
AWSではさらに可用性を向上させる仕組みとして**Multi-AZ構成**があります。複数のAZに分散してシステムを稼働させることで、一方のAZ内のインスタンス障害やAZ自体の障害が発生しても、他方のシステムでサービスの提供を継続させることができます。

以下はMulti-AZでActive-Active冗長構成を組む例です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194749/17127b23-7ccb-97a7-877b-ecbd5d75df5b.png)

Active-Active構成では同様の役割を持つサーバ(Webサーバなど)を複数同時に稼働しますが、これらを異なる複数のAZに分散させて配置します。こうすることで、片方のAZに障害が起きてサーバが使えなくなっても、他方のAZに配置されているサーバが稼働しているためサービス提供を継続することができます。(このようにサーバの数が少なくなりつつも稼働し続けることを**縮退**と呼びます。)

なお、図の上の方にある装置はロードバランサ(負荷分散装置)と呼ばれ、バックの複数サーバにリクエストを振り分けてくれます。AWSでは[ELB(Elastic Load Balancer)](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)というサービスを利用することができます。

以下はMulti-AZでActive-Standby冗長構成を組む例です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/194749/ad5670dc-5d47-19c2-a37b-1093c675e7b1.png)

Active-Standby構成はDBサーバでよく使われますが、平常時はメイン側のサーバ(マスタサーバ)が稼働し、マスタサーバの障害時にはバックアップ側のサーバ(スタンバイサーバ)へ処理を切り替えます。この切り替え処理のことを**フェイルオーバー(Failover)**と呼びます。
スタンバイサーバはフェイルオーバー時にすぐにサービスを提供できるように、平常時にマスタサーバのデータを逐次同期します。これを**同期レプリケーション**と呼びます。レプリケーションとは複製のことです。

AWSではマスタサーバとスタンバイサーバを異なるAZに配置することでMulti-AZ構成を実現できます。DBサーバで簡単にMulti-AZ構成を実現するサービスとして[Amazon RDS(Relational Database Service)](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Welcome.html)があります。RDSを用いたMulti-AZ構成について、詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Welcome.html)をご覧ください。

#### リージョン間レプリケーション
可用性はMulti-AZで良いではないかと思われるかもしれませんが、重要なシステムでは数十年に一度起こるような大災害でもサービスを提供し続けなければならない場合もあります。これは**DR(Disaster Recovery、災害復旧)**という考え方であり、AWSで実現するための方法は**リージョン間レプリケーション**です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/194749/2deff991-7d0a-61a7-1c1b-87d1a1f42b5a.png)
引用元：[AWS リージョン間のデータレプリケーション](https://docs.aws.amazon.com/ja_jp/quickstart/latest/oracle-database/app-a.html)

物理的に離れた別のリージョンにシステムのバックアップを取っておくことで、メインのリージョンが停止するような大災害が起こっても、バックアップリージョンでシステムを直ちに稼働させ、サービスを提供することができます。上の図ではデータベースサーバとAmazon S3のデータをバックアップリージョンに複製しています。

リージョン間レプリケーションはDR以外にもグローバルに展開するサービスで各地からのアクセスレイテンシを低下させるために使われることもあります。

なお、リージョンやAZは「東京」「シンガポール」のように大雑把なロケーションしか分からず、データセンターの詳細な位置は公開されていません。セキュリティの観点から当然ですね。
リージョンとAZについて詳しく知りたい方は[こちら](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)をご覧ください。

## VPC(Amazon Virtual Private Cloud)
次にAWSの最も基本的なサービスである[VPC(Amazon Virtual Private Cloud)](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/what-is-amazon-vpc.html)について学びましょう。
VPCとは仮想プライベートクラウドのことで、ユーザーごとに独立したクラウドリソースを論理的に切り出してサービスとして提供する機能です。
AWSのインフラストラクチャ上では膨大な数のユーザーのシステムが稼働していますが、VPCのおかげで他ユーザーの状況を気にせずに、自社のサービスを構築することができます。

プライベートな空間ということで、VPCではプライベートIP空間がCIDR形式(10.0.0.0/16など)で割り当てられます。
VPCは1つのリージョンの中に作られます。リージョン内の複数のAZを利用することはできますが、リージョン間を跨って作ることはできません。

以下はVPCの例です。CIDRブロックが割り当てられていることが分かります。

<img width="903" alt="vpcs___VPC_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/39d8c721-f129-9f9e-0c79-5099610f5655.png">

VPCの中に**サブネット**を作成し、サブネットの中に**EC2インスタンス**を作成するのがAWSにおけるIaaS利用の第一歩です。

###  サブネット
サブネットはVPC内に作ることができるより小さなネットワークです。新しいサブネットを作る際は　VPCのCIDRの範囲内からサブネットのCIDRを指定します。
EC2インスタンスを利用するためにはサブネットが欠かせません。VPCに直接EC2インスタンスをデプロイすることはできません。

ポイントはサブネットは単一のAZにしか作れないということです。**複数のAZに跨ったサブネットを作ることはできません。**
よって、EC2を利用して先ほど説明したMulti-AZ構成とするためには、**AZごとにサブネットを作成し、それぞれのサブネットに分散させてEC2インスタンスをデプロイする**ことが必要となります。

### VPC外部との通信
VPCは仮想とはいえプライベートな空間ですので、基本的に通信は内部に閉じており、外部と通信することはできません。しかし、サービスとしてインターネット公開したり、開発中に会社のPCからEC2インスタンスにログインしたりするためにはVPC外部と通信できないといけないですよね？
このような場合はVPCが外部と通信するための出口として**ゲートウェイ**を作成します。

VPCが外部と通信するためのゲートウェイとして主に以下のものがあります。

| ゲートウェイの種類          | アイコン | 説明                         |
|:----------------------:|:------:|:----------------------------:|
| インターネットゲートウェイ     |  ![NetworkingContentDelivery_AmazonVPC_internetgateway.png](https://qiita-image-store.s3.amazonaws.com/0/194749/c2993a41-26e0-bdfa-7018-fe254e6c8b13.png) | インターネットに接続するためのゲートウェイ  |
| 仮想プライベートゲートウェイ   |  ![NetworkingContentDelivery_AmazonVPC_VPNgateway.png](https://qiita-image-store.s3.amazonaws.com/0/194749/bf1de584-bd84-1a56-f6a0-1c7af1bf5b6e.png) | VPCと外部環境の間にVPN接続や専用線接続を行うためのゲートウェイ |

#### インターネットゲートウェイ
VPCに[インターネットゲートウェイ](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html)を作成すると、VPC内部のEC2インスタンスがインターネット接続が可能になります。
インターネット接続のためにはパブリックIPアドレスが必要です。VPC内のEC2インスタンスは基本的にプライベートIPアドレスしか持っていませんから、別に割り当ててあげる作業が必要です。EC2インスタンスにパブリックIPを割り当てる方法の1つとして[Elastic IPアドレス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)があります。

なお、AWSアカウント作成時に最初から作られているVPCには、インターネットゲートウェイが1つ割り当てられています。
<img width="944" alt="インターネットゲートウェイ___VPC_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/5e1b10ad-5ee3-823b-5451-b7a62235745f.png">

#### 仮想プライベートゲートウェイ
仮想プライベートゲートウェイはVPCと外部環境をVPN接続したり、専用線接続するために必要なコンポーネントです。
これらの場合はプライベートIPのままVPC外部と通信を行うことができます。
VPCと専用線接続を行うためのサービスは[AWS Direcr Connect](https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/Welcome.html)と言います。

それぞれの接続イメージ図を公式ドキュメントから示します。サービスの詳細については各ドキュメントを参照してください。

<img width="693" alt="AWS_マネージド_VPN_接続_-_Amazon_Virtual_Private_Cloud.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/0030b040-5a1e-d7d6-965c-938f7c5e77e8.png">
仮想プライベートゲートウェイを用いたVPN接続の例
引用元：[AWSマネージドVPN接続](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_VPN.html)

<img width="797" alt="AWS_Direct_Connect_とは_-_AWS_Direct_Connect.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/ba9ddec2-d37e-7ef0-a943-579c7c4b3523.png">
仮想プライベートゲートウェイを用いたDirect Connect接続の例
引用元：[AWS Direct Connectとは](https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/Welcome.html)

## 責任共有モデル
話が大きく変わりますが、クラウドサービスにおけるセキュリティの観点で非常に重要な概念について説明します。
このご時世、ITサービスにはセキュリティの担保が必須となっています。クラウドサービスの場合、インフラストラクチャはクラウド事業者が提供し、その上のアプリケーションはユーザーが開発するということが良くあります。
このような場合に、クラウド事業者の責任範囲とユーザーの責任範囲を定義するものが**責任共有モデル**と呼ばれるものです。

AWSにおける責任共有モデルの考え方は[こちら](https://aws.amazon.com/jp/compliance/shared-responsibility-model/)に書かれています。

どこまでがユーザーが責任を負わなければいけないかは、AWSのサービスによって異なります。
大雑把には「クラウドサービスの分類」で説明したIaaS/PaaS/SaaSの図のうち、「クラウドサービス」と書かれている領域はAWSの責任範囲であり、それより上の領域はユーザーの責任範囲となります。

IaaSの場合、責任共有モデルは"クラウド内のセキュリティ"はユーザーの責任範囲、"クラウドのインフラストラクチャ"はAWSの責任範囲となっています。

<img width="577" alt="責任共有モデル_–_アマゾン_ウェブ_サービス__AWS_.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/e3316937-3a76-de50-cf82-6de5fe06ffc4.png">

以下、この図の場合の責任範囲を説明しましょう。

### AWSの責任領域
#### ① グローバルインフラストラクチャ
リージョンやAZ、データセンター内に存在するサーバーのセキュリティはAWSが責任を持って管理します。

#### ② サーバーリソース
サービスとして提供するCPU、ストレージなどのリソース、アカウント管理のためのデータベース、リージョンやAZの物理的なネットワーキングはAWSが責任を持って管理します。

#### ③ ソフトウェア(ハイパーバイザ)
ここでいうソフトウェアとはユーザーに論理的に分離されたサーバーリソースを提唱するための仮想化ソフトウェア(ハイパーバイザ)のことです。仮想化ソフトウェアについてはAWSが責任を持って管理します。

### ユーザの責任領域
#### ④ インスタンス上のデータやネットワークトラフィック
ユーザーにサービスとして提供される仮想マシンをインスタンスと呼びます。この図におけるサーバーはインスタンスと解釈してください。インスタンス上に記録されるデータの保護やインスタンスに流れるネットワークトラフィックの保護はユーザの責任範囲です。

#### ⑤ OS、ネットワーク、ファイアウォール
インスタンス上のOSやファイアウォールの管理はユーザーの責任範囲です。従ってインスタンスOSのセキュリティパッチやソフトウェアライブラリの更新はユーザが行う必要があります。
AWSではファイアウォール機能を提供するマネージドサービスとして[セキュリティグループ](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_SecurityGroups.html)があります。セキュリティグループを活用して、適切に通信を制御することもユーザーの責任です。

#### ⑥ アプリケーション
インスタンス上にデプロイするアプリケーションのセキュリティ対策はユーザの責任範囲です。

#### ⑦ アプリケーション上のデータ
ユーザーがデプロイしたアプリケーションが持つデータはユーザの責任範囲です。

### PaaSやSaaSの場合
PaaSやSaaSではIaaSに比べてAWSの責任範囲がより広くなります。
大雑把にはPaaSはIaaSのものに加えて④⑤もAWSの責任範囲となり、ユーザーは自身がデプロイするアプリケーションの管理に集中することができます。
SaaSの場合は全ての領域がAWSの責任となり、ユーザーは管理する必要がありません。サービスとして利用するのみとなります。

## AWSのコスト
AWSのコストについて考えてみましょう。最初の方でAWSはコスト効率が良いという説明がありましたが、何も考えずに使っていてはむしろ従来のIT資産よりもコストが高くなることもあり得ます。
クラウドサービスでは従来以上にコスト管理が重要となってきます。

### 使った分だけ課金
クラウドサービスの課金体系の特徴は、**オンデマンドに使った分だけ料金を支払う**ということです。これにより初期投資を行わなくて済むというメリットがあります。
一方で使った分だけ課金されるため、きちんと管理しないと無尽蔵にコストが増えていってしまいます。
予算の管理をおろそかにして、目の前の欲しいものをひたすらに買い続けていると、気づいた時には貯金が底を尽きてしまうようなものです。
よってクラウドサービスにおけるコスト管理で最も重要なのは**コストの把握、可視化**です。
**可視化できないものは管理もできない**とは良く言ったものです。

### コストの把握と分析
まずはコストを把握してみましょう。
マネジメントコンソールのヘッダー部分のアカウントをクリックし、プルダウンから「請求ダッシュボード」をクリックします。

<img width="320" alt="AWS_マネジメントコンソール.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/8414d2e7-7e91-ab67-3857-48f21e61720e.png">

請求ダッシュボードでは月額コストを把握できます。
下記のグラフでは「先月の月額コスト」「今月の1日から本日までにかかったコスト」「今月の月額コスト予測」が表示されています。
<img width="578" alt="Billing_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/3a890a23-10bb-0e38-8962-f5ed240b0c0e.png">

　「料金明細」をクリックすると、サービス毎のより詳細なコストを確認できます。
<img width="1176" alt="Banners_and_Alerts_と_Billing_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/04212043-c4c3-ec42-b409-d002df000c77.png">

これらを定期的に確認し、余計なコストが発生していないかを把握し、コスト削減のためのアクションを打てるようになります。

#### コストエクスプローラー
より詳細にコストを分析するツールとして[コストエクスプローラー(Cost Explorer)](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/cost-explorer-what-is.html)があります。
コストエクスプローラではサービスやリージョン、タグなど様々な条件でフィルタを掛けることができます。ユーザーがフィルタ条件をカスタマイズすることで、コストを様々な観点から分析することが可能となります。
結果はグラフ表示されるため、コストの可視化としても利用できます。
以下はサービスごとのコストを可視化した例です。

<img width="969" alt="Banners_and_Alerts_と_Cost_Reports.png" src="https://qiita-image-store.s3.amazonaws.com/0/194749/a42d60a9-b2a9-03ac-f013-d302e5f304f1.png">

横軸の単位は「日別」「月別」から選択することができ、最大過去13ヶ月までのコストデータを表示することができます。

なお、デフォルトではコスト管理系のサービスはルートアカウントのみ権限があります。
IAMユーザーでコスト管理サービスを利用するためには、ルートアカウントにてIAMユーザーへコスト管理サービスへのアクセスを許可してください。(参考は[こちら](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/grantaccess.html))

### コストシミュレーションツール
コスト分析と同じく重要なのがコスト見積もりです。AWSではWeb UIベースの簡易見積もりツールとして[AWS Simple Monthly Calculator](https://calculator.s3.amazonaws.com/index.html)が利用できます。

AWS Simple Monthly Calculatorでは、利用するサービスやインスタンスを1つずつ入力していくと、1ヶ月あたりのトータルコストが表示されるようになっています。
詳細までは決まらなくとも大まかなコスト感を掴むにはこのサービスで十分です。新しくAWSでのシステム構築する場合、まずはこのツールを利用してコスト見積もりを行ってみましょう。

## AWSの資料
AWSには膨大なサービスが提供されており、全てを理解することは容易ではありません。
幸いなことにAWSは公式ドキュメントが非常に充実しているので、必要に応じて読み込んで理解を深めましょう。
AWSのドキュメントは以下の3つが基本となります。

### ① Black Belt
AWSではBlack Belt Online Seminar シリーズとしてオンラインセミナーが展開されており、その資料が公開されています。各サービスの概要が分かりやすく説明されており、入門編として非常にオススメのコンテンツです。

コンテンツの一覧は[こちら](https://aws.amazon.com/jp/aws-jp-introduction/)。膨大な量の資料があることが分かりますね。
AWS初心者にオススメの資料をピックアップします。まずは以下の資料を一通り読んでみましょう。
Black Beltを読むコツとしては、サービスの詳細な仕様まで理解しようとせず、大まかな特徴をイメージできることをゴールとしてサクサク読んでいくことです。

| 分類 | サービス名 | リンク |
|:-:|:-:|:-:|
|コンピューティング | Amazon EC2  | [こちら](https://www.slideshare.net/AmazonWebServicesJapan/20180411-aws-black-belt-online-seminar-amazon-ec2)  |
|コンピューティング | Elastic Load Balancing(ELB)  | [こちら](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2016-elastic-load-balancing)  |
|コンピューティング | Auto Scaling|  [こちら](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-auto-scaling) |
|データベース|Amazon RDS|  [こちら](https://www.slideshare.net/AmazonWebServicesJapan/20180425-aws-black-belt-online-seminar-amazon-relational-database-service-amazon-rds-96509889) |
|ストレージ & コンテンツ配信|Amazon EBS|  [こちら](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-amazon-elastic-block-store-ebs-83913049/AmazonWebServicesJapan/aws-black-belt-online-seminar-amazon-elastic-block-store-ebs-83913049) |
|ストレージ & コンテンツ配信|Amazon S3|  [こちら](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-s3) |
|ネットワーキング|Amazon VPC|  [こちら](https://www.slideshare.net/AmazonWebServicesJapan/20180418-aws-black-belt-online-seminar-amazon-vpc) |
|管理ツール|Amazon CloudWatch|  [こちら](http://www.slideshare.net/AmazonWebServicesJapan/black-belt-online-seminar-amazon-cloudwatch) |
|管理ツール|AWS CloudFormation|  [こちら](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-aws-cloudformation) |
|セキュリティ & アイデンティ|AWS IAM|  [こちら](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-aws-identity-and-access-management-aws-iam) |

「こんなにたくさん読まないといけないのか・・・」と気を落とさず。サクサク読んでいくのがコツですよ！

### ② AWSドキュメント
サービスの概要をざっとキャッチアップするのにはBlack Beltが適していますが、より細かい仕様まで正しく理解するにはドキュメントを読み込みましょう。
AWSドキュメントにはユーザーガイド、開発者ガイド、APIリファレンス、チュートリアルなどがあり、[こちら](https://docs.aws.amazon.com/index.html#lang/ja_jp)に一覧がまとまっています。

「このサービスの特徴や仕様を細かく調べたい！」という時にはAWSドキュメントを当たってみましょう。
なお、サービス名でググってもこれらのドキュメントがヒットすることが多いです。検索も活用していきましょう。

### ③ ホワイトペーパー
AWSの技術的なノウハウ、ベストプラクティスを学ぶためにはホワイトペーパーが適しています。一覧は[こちら](https://aws.amazon.com/jp/whitepapers/)。
こちらも膨大な量のドキュメントが存在しています。必要に応じてピックアップして読み込んでいきましょう。

なお、ホワイトペーパーは英語しか存在しないドキュメントも数多く存在します。
英語が苦手な方にとってはしんどいかもしれませんが、ここは良い機会と考えリーディングにチャレンジしてみましょう。
技術の世界では最新の情報は英語でしか流通していないことが多く、英語のドキュメントを読破する能力は必ず役立ちます。筆者も英語はすこぶる苦手だったのですが、AWSのホワイトペーパーを通じて少しずつリーディングも苦にならなくなっていきました。

オススメのホワイトペーパーをいくつか挙げておきます。

|   タイトル  |  リンク   |
|:-----------:|:----------:|
|アマゾン ウェブ サービスの概要|[こちら]()|
|AWS Well-Architected フレームワーク|[こちら](https://d1.awsstatic.com/International/ja_JP/Whitepapers/AWS_Well-Architected_Framework_2018_JA_final.pdf)|
|AWS セキュリティのベストプラクティス|[こちら](https://d1.awsstatic.com/whitepapers/ja_JP/Security/AWS_Security_Best_Practices.pdf)|
|伸縮性の自動化|[こちら](https://d1.awsstatic.com/whitepapers/cost-optimization-automating-elasticity.pdf)|
|AWS Well-Architected フレームワーク – コスト最適化の柱|[こちら](https://d1.awsstatic.com/whitepapers/architecture/AWS-Cost-Optimization-Pillar.pdf)|

## AWSを学ぶメリット
最後にこれからAWSを学ばれるみなさんのモチベーションとなるように、AWSを学ぶことのメリットを筆者なりに述べたいと思います。

### すぐに活かすことができる
シンプルに最も使われているサービスに習熟することは、ビジネスの機会が直接的に増えることを意味します。今は大企業でもベンチャー企業でもクラウド利用が当たり前になりつつあり、その中で最もシェアの高いAWSを学べばすぐに活かすことができます。
業務で活用できれば社内評価にも繋がりますし、転職市場でもニーズが高く重宝されるスキルとなっています。実際、「稼げるIT関連資格2018年版」でも2位と4位にAWS関連資格がランクインしており、AWSを学ぶことで年収アップにも繋がると言えるでしょう。(ソースは[こちら](https://itjinzai-lab.jp/article/detail/1006))

### フルスタックエンジニアになれる
一昔前ではシステム開発においては「アプリケーションエンジニア」「サーバエンジニア」「ネットワークエンジニア」など役割によって組織や担当者が分かれていることが普通でした。しかし、近年はビジネスの価値やスピードが求められていることから、これら全てに知見を持つ「フルスタックエンジニア」の市場価値が高くなっています。
AWSではEC2のようなサーバ環境を提供するサービスだけでなく、DevOps(※)を実現するためのサービス群も非常に充実しています。これらのサービスを上手く活用してシステム開発を行うことで、インフラからアプリケーションまで一貫して俯瞰することになり、フルスタックエンジニアに近づくことができるはずです。

※DevOpsとは従来別々に行われていたアプリケーション開発(Development)とシステム運用(Operation)の活動を密に連動させ、ビジネスのスピードを向上させる考え方のことです。(参考は[こちら](https://aws.amazon.com/jp/devops/what-is-devops/))

### Well Architectを知ることができる。
先に述べた通り、AWSにはAmazon社内で培われたノウハウや、より良いアーキテクチャ(Well Architect)を構築するためのエッセンスが詰まっています。各サービスの設計思想やホワイトペーパーなどのドキュメントからこれらを学ぶことができます。
突き詰めれば全てのシステムはユーザのためにあり、**ユーザ体験を向上させること**はいつの時代でも共通の課題です。システムが停止しないためにはどうすれば良いか？ レスポンスをより早くするには？ AWSをシステム実現の単なる手段と捉えるだけでなく、ユーザ体験の向上という本質を理解することが大切です。そうすれば、もしAWSが時代遅れとなっても、培われた知識やスキルは新しく登場した技術にも活かすことができるでしょう。

## まとめ
今回はAWS勉強会入門編として、AWSとは何なのか？ AWSのサービス概要や特徴などを解説してきました。本文中でも紹介したドキュメントなどを参考に引き続き学習を進めていってください。

[^1]: [Amazon S3](https://aws.amazon.com/jp/s3/)は拡張性と耐久性に優れたクラウドストレージサービスです。
[^2]: [Amazon EMR](https://aws.amazon.com/jp/emr/)はHadoopなどのビックデータフレームワークを簡単に実行できるサービスです。