ざっくり理解するAWSの基本

# これは何？
AWSのことを全く知らない状態から、ちょっと知ってる状態になるための記事です。

# そもそもAWSって？
Amazon Web Servicesの略で、Amazon社が提供するクラウドサービスの総称です。
100種類以上のサービスが存在し、クラウドサービスとしては世界最大規模です。
サーバーやネットワークなどのインフラ構築が簡単にでき、使った分だけ支払う従量課金型です。

# AWSのインフラを理解するためのキーワード3つ
#### 1. リージョン
世界中にある地理的に離れた領域のことです。
東京リージョン、ロンドンリージョン、北カリフォルニアリージョンのように呼びます。
各リージョンごとにサーバーを構築できるため、海外事業展開などに対応できます。

#### 2. アベイラビリティゾーン
物理的なデータセンター群のことです。
リージョンの中に複数のアベイラビリティゾーン（データセンター）があります。
耐障害性を高めるために複数設置されています。

#### 3. エッジロケーション
世界中に配置されているデータセンターのことです。
特定のサービスで、ユーザーへの応答速度向上のために使われます。
アベイラビリティゾーン以外にもデータセンターがあるという理解でOKです。

# とりあえずこれは押さえておけ！というAWSのサービス

|サービス名|サービス内容|
|:--|:--|
|VPC（ブイピーシー）|仮想ネットワークのサービス|
|EC2（イーシーツー）|仮想サーバーのサービス|
|Route53（ルートゴジュウサン）|DNSのサービス|
|RDS（アールディーエス）|データベースのサービス|
|ELB（イーエルビー）|ロードバランサーのサービス|
|S3（エススリー）|ストレージ（データ保管）のサービス|
|IAM（アイアム）|認証認可のサービス|
|CloudWatch（クラウドウォッチ）|利用状況を収集・監視するサービス|

# AWSを使うために最初にやるべきこと
#### 1. アカウントの作成
クレジットカード、携帯電話、メールアドレスがあれば、アカウントを作成できます。
無料利用枠があるので、誰でも無料で始められます。
サービスの種類によって30日間無料、12ヶ月間無料、常に無料と分かれています。

#### 2. 料金アラートの設定
この金額を超えたらアラートをメールで通知するという設定をしておきます。

1. AWS Budgetsで「予算を作成」

#### 3. IAMユーザーの作成
ルートユーザーとは別に作業用ユーザー（IAMユーザー）を作成します。
セキュリティの観点から、できる限りルートユーザーを使用しないのが望ましいです。

1. IAMで「ユーザーを追加」

#### 4. CloudTrail（クラウドトレイル）で操作ログの記録
いつ誰が何をしたのかを記録しておくことで、不正操作などのチェックをできるようにします。
デフォルトで有効になっており、無料で利用できますが、有効期間は90日です。
永久保存するためには有料のS3に保存する設定を行う必要があります。

1. S3への保存はCloudTrailで「証跡の作成」

# 各サービスについてもう少し詳しく
## VPCとは
AWS上に仮想ネットワークを作成できるサービスです。
リージョンの中の複数のアベイラビリティゾーンにまたがって作成されます。
VPC、サブネット、インターネットゲートウェイ、ルートテーブル、セキュリティグループ、ネットワークACLの料金は無料です。

1. 「VPCを作成」
1. 「IPv4 CIDR の手動入力」をCIDR表記で入力

#### サブネット
VPCを細かく区切ったネットワークです。
Webサーバーはパブリック、DBサーバーはプライベートのように、ネットワークを分割したい時に使います。

1. 「サブネットを作成」
1. 設置対象のVPC IDを指定
1. サブネット名を自由に入力
1. アベイラビリティゾーンを選択
1. IPv4 CIDR ブロックをCIDR表記で入力

#### セキュリティグループ
仮想ファイアウォールのことです。
サーバ単位で設定できます。許可のみ設定できます。

#### ネットワークACL
セキュリティグループと同じく仮想ファイアウォールのことです。
サブネット単位で設定できます。許可/拒否の両方を設定できます。

#### インターネットゲートウェイ
インターネットとVPCを繋げる仮想のルーターです。
VPCは、作成しただけだとインターネットに繋がらないため、設定します。

1. 「インターネットゲートウェイの作成」
2. 作成後、「アクション」 → 「VPCにアタッチ」

#### ルートテーブル
IPアドレスの行き先を管理している設定です。
「宛先IPアドレス」と「ターゲット（次のルーター）」という書式になっています。
1つのサブネットに1つ設定でき、設定すると自動的にルーターが動きます。

1. 「ルートテーブルを作成」
1. 作成後、「サブネットの関連付け」→「サブネットの関連付けを編集」
1. 作成後、「ルート」→「ルートを編集」
    1. インターネットに接続させる場合
        1. 送信先を「0.0.0.0/0」に設定
        1. ターゲットを作成したインターネットゲートウェイにする

#### NATゲートウェイ
プライベートIPアドレスをグローバルIPアドレスに変換します。
セキュリティパッチやソフトウェアのアップロードのために使用します。
NATサーバからプライベートサブネットへのアクセスはできないため、セキュリティのリスクが増えることはありません。
アベイラビリティゾーンごとに作成するのが推奨されています。

#### [ 補足1 ] IPアドレスの表記について
1. CIDR(サイダー)表記（例：192.168.128.0/24）
    1. 「/」の後ろは、ネットワーク部が先頭部分から何ビット目までなのかを記載
    1. 24の場合、24ビットなので、「192.168.128」までが固定、「.0」の部分が可変となる（192.168.128.0 ~ 192.168.128.255までが利用できる）
1. サブネットマスク表記（例：192.168.128.0/255.255.255.0）
    1. 「/」の後ろは、ネットワーク部を表すビットと同じ部分を1(表記としては255)に、ホスト部を表すビットと同じ部分を0にする
1. ルーティングではプレフィックス長(/の後ろ)が長い（数字の大きい）ものを優先してルーティングするので、「0.0.0.0/0」と「10.0.0.0/16」のルートテーブルがあり、両方に当てはまる場合は「10.0.0.0/16」にルーティングされる

#### [ 補足2 ] VPC設計のポイント
1. IPアドレスはプライベートIPアドレス範囲から指定する
    1. 10.0.0.0 ~ 10.255.255.255
    1. 172.16.0.0 ~ 172.31.255.255
    1. 192.168.0.0 ~ 192.168.255.255
1. 作成後は変更できないため、ホスト部は大きめに設定する
    1. 大きさは/28 から /16。/16が推奨
1. 他のVPCの範囲と重複しないようにする
1. 異なるシステムの場合はVPCではなくアカウントを分けて使う

#### [ 補足3 ] サブネット設計のポイント
1. 将来に必要なIPアドレス数を見積もって設定する
    1. /24 が標準的
1. サブネットの分割はルーティングポリシーとアベイラビリティゾーンを基準に行う
    1. インターネットアクセスがあるものとないものがある場合
    1. サーバーを複数たてるなど、2つ以上のアベイラビリティゾーンを使用する場合


## EC2とは

Elastic Compute Cloudの略で、AWSクラウド上の仮想サーバーです。
インスタンスというのはEC2からたてられたサーバーのことです。

1. AMI（アミ）の選択
1. インスタンスタイプの選択
1. インスタンスタイプの詳細設定
    1. 自動割り当てパブリックIP
        1. パブリックIPをAWSが自動で割り振ってくれる（ただし起動するたび変わる）
        1. インターネットアクセスがある場合、有効にする
    1. キャパシティーの予約
        1. アベイラビリティゾーンごとにリソースが決まっており上限に達すると起動できなくなる
        1. その問題を回避したい場合は設定するが、インスタンスを停止していても料金が発生する
        1. 練習の場合は「なし」でOK
    1. IAMロール
        1. EC2インスタンスが他のAWSサービスと連携するときの権限
    1. テナンシー
        1. ハードウェアを占有するか、共有するか
1. ストレージの追加
1. セキュリティグループの設定
1. SSHキーペアの設定

#### AMI
Amazon Machine Imageの略で、インスタンス起動に必要なOSのイメージです。
AWSやサードパーティから提供されています。
自分でカスタムAMIを作成して、使用することもできます。

#### インスタンスタイプ
サーバーのスペックを定義したものです。
CPU、メモリ、ストレージなどのスペックが高くなるほど、料金も高くなります。

#### キーペア
公開鍵と秘密鍵のペアのことです。
公開鍵をAWS上で管理し、秘密鍵をローカルPCで管理します。
インスタンス起動時に公開鍵がEC2にコピーされます。
EC2のOSにログインする時、秘密鍵を使ってログインできるようになります。

#### ストレージ
サーバーにくっつけるデータの保存場所です。下記の2種類があります。

##### 1. EBS(Elastic Block Store) 
高い可用性と耐久性を持つストレージで、費用がかかります。
他のインスタンスに付け替えが可能で、インスタンスを停止、終了しても、保持可能です。
DBなどの永続性と耐久性が必要なデータを置きます。
ネットワーク経由で保存するため、EC2と同じアベイラビリティゾーンにあるECSだけ利用可能です。
EBSは他のEC2に付け替えが可能です。

##### 2. インスタンスストア
インスタンス専用の一般的なストレージです。
他のインスタンスへの付け替えはできず、インスタンスを停止、終了すると、消えます。
一時的なファイルやキャッシュなどを保持するために、使用します。

#### セキュリティグループ
ファイアウォールの役割を担っているものです。
インバウンドがサーバーに入る通信、アウトバウンドがサーバーから出ていく通信に関する設定です。

1. 「セキュリティグループの作成」
1. 「ルールの追加」
    1. ソースにはセキュリティグループも設定可（Webサーバーからのみアクセスしたい場合など）

#### Elastic(エラスティック)IPアドレス
グローバルIPアドレスを取得し、インスタンスに付与できるサービスです。
インスタンスのパブリックIPアドレスは、起動・停止するごとに別のIPアドレスが割り振られます。
Elasctic IPアドレスを割り振ると、インスタンスを削除するまで固定のIPアドレスになります。
利用していない場合は、課金されます。

1. 「Elastic IPアドレスを割り当てる」
1. 作成後、「アドレスの関連付け」

#### EC2 Auto Scaling
自動でEC2インスタンスの数を増減する機能です。
インスタンス数の最大と最小を同じにすることで耐障害性を上げることができます。
Auto Scalingの利用は無料です。

#### [ 補足1 ] インスタンスへの接続方法
ターミナル、コマンドプロンプトなどのCLIでsshコマンドを入力（入力時「{」「}」は入力しない）
`ssh ~i {アクセスキー} ec2-user@{EC2のパブリックIPアドレス}`


## Route53とは

DNSサービスで、ネームサーバーの役割を果たします。
エッジロケーションの中で最も近いロケーションから応答を返します。

#### ホストゾーン
DNSのリソースレコードの集合、ゾーンファイルのようなものです。

1. 「ホストゾーンの作成」
1. 「レコードセットの作成」→ タイプでAを選択

#### レコードセット
リソースレコード（ドメイン名やホスト名の設定を定義したひとまとまりのデータ）のことです。

#### ルーティングポリシー
レコードセットに対してどのようにルーティングするかを決めます。
シンプル、加重、レイテンシー、位置情報、フェイルオーバーなどの種類があります。

#### ヘルスチェック
サーバーの稼働状況をチェックします。

#### [ 補足1 ] リソースレコードのタイプ
|レコードタイプ|内容|
|:--|:--|
|SOA(エスオーエー)レコード|ドメインのゾーンの管理情報|
|NSレコード|ゾーンを管理するネームサーバーの情報|
|Aレコード|ドメイン名に紐づくIPアドレス(IPv4形式)|
|AAAA(クアッドエー)レコード|ドメイン名に紐づくIPアドレス(IPv6形式)|
|CNAME(シーネイム)レコード|ドメインの別名（あだ名）|
|MXレコード|ドメインに紐づくメール受信サーバー|

#### [ 補足2 ] ネームサーバーをRoute53へ変更
ホストゾーンを作成するとNSレコードとSOAレコードが自動的に作成されます。
しかし、ネームサーバーがRoute53になっているわけではないので、変更が必要です。
変更はドメインを購入したサービスなどでできます。

## RDSとは
フルマネージドなリレーショナルデータベースのサービスです。
マルチAZ（複数のアベイラビリティゾーンを使うこと）やリードレプリカを簡単に構築できます。
自動的にバックアップを取得してくれたり、ソフトウェアメンテナンスをしてくれます。
RDSはssh接続して設定を変更することができないため、設定グループを変更します。

1. 「データベース」 → 「データベースの作成」
1. マルチAZにしたい場合、「スタンバイインスタンスを作成する」
1. スナップショットを手動で作成した場合、自分で削除しない限り削除されない

#### サブネットグループ
RDSを起動させるサブネットを制御します。

1. 「DBサブネットグループを作成」

#### パラメータグループ
DB設定値を制御します。

1. 「パラメータグループの作成」
1. 設定値を変更する場合「パラメータグループアクション」 → 「編集」

#### オプショングループ
RDSへの機能追加を制御します。
プラグインを使いたい場合などに設定をします。

1. 「オプショングループの作成」
    1. デフォルトのものも作成されるがそちらは編集しない



## ELBとは
負荷分散のサービスで、受け取ったリクエストを複数のサーバに振り分けます。
自動的にスケールアップやスケールアウトするので、ELB自体は単一障害点にはなりません。
ALB,NLB,CLBの3種類があります。

#### ALB(Application Load Balancer)
OSI参照モデルのレイヤー7のアプリケーション層で機能します。
主にWebサーバの負荷分散に使用します。
負荷分散の方法にURLパスによって処理するサーバを変えるパスベースルーティングがあります。

#### NLB(Network Load Balancer)
OSI参照モデルのレイヤー4のトランスポート層で機能します。
主にWebサーバ以外の負荷分散に使用します。
低レイテンシーで高スループットの処理が可能です。

#### CLB(Classic Load Balancer)
旧世代のロードバランサー。現在は使用を非推奨。



## S3とは
安価で耐久性の高いクラウドストレージサービスです。
容量無制限で、1ファイル最大5TBまで格納可能です。
バケットやオブジェクトに対してアクセス制限できます。

#### バケット
1. オブジェクトの保存場所です。名前はグローバルでユニークな必要があります。

#### オブジェクト
1. データ本体のことです。オブジェクトごとに固有のURLが付与されます。
1. バケット内のオブジェクト数は無制限です。

#### キー
1. オブジェクトの格納URLのパスです。

#### ストレージクラス
クラスによって料金が違います。
クラスによってはAZ障害でデータが失われてしまうものもあります。

#### バケットポリシー
S3ごとにバケットのアクセス権限を設定できます。

#### ACL
S3バケット単位やオブジェクト単位で簡易的なアクセス権限を設定できます。

#### ブロックパブリックアクセス
バケット単位、オブジェクト単位で意図せず外部公開できないようにする設定です。
デフォルトでは外部公開できない設定になっています。

#### S3のよくある利用シーン
1. 静的コンテンツの配信
1. バッチ連携用のファイル置き場
1. ログなどの出力先
1. 静的ウェブホスティング



## IAMとは
AWS操作をセキュアに行うための認証認可の仕組みです。

#### IAMユーザー
AWSの利用者やアプリケーションがAWSの操作に使用します。
MFA認証の設定が推奨されています。

#### IAMグループ
IAMユーザーをまとめるグループです。
グループごとに権限を付与できます。

#### IAMポリシー
AWSにアクセスする権限設定です。管理ポリシーとインラインポリシーの2種類があります。

##### 1. 管理ポリシー
IAMユーザーやIAMグループにアタッチして使うポリシーで、使いまわすことができます。

##### 2. インラインポリシー
IAMユーザーやIAMグループに埋め込んで使うポリシーで、使いまわすことができません。

#### 権限の優先順位
デフォルトで全て拒否(暗黙的な拒否)
明示的な拒否 >> 明示的な許可 >> 暗黙的な拒否

#### IAMロール
AWSサービスに対してAWS操作権限を付与します。


## CloudWatchとは
モニタリングに関する機能を提供するサービスです。
2つのメトリクスがあります。

##### 1. 標準メトリクス
AWSがあらかじめ定義しているメトリクス

##### 2. カスタムメトリクス
利用者が定義したメトリクス

#### CloudWatch Alarms
メトリクスの閾値を超えたらアクションする機能です。

#### CloudWatch Logs
ログファイルの保存、閲覧、監視ができる機能です。



## CloudFrontとは
高速にコンテンツを配信するCDN（Content Delivery Network）サービスです。
オリジンサーバー上にあるコンテンツをエッジロケーションにコピーし、そこから配信を行います。
エッジサーバーにキャッシュを保持するため、オリジンサーバーの負荷を減らすことができます。

1. CloudFrontディストリビューションを作成
    1. ディストリビューション = CloudFrontのルール

#### SSLサーバー証明書
ブラウザとサーバーの通信を暗号化するための電子証明書です。
WEBサイトの運営者が本当に存在するかを確認した後に発行されます。

##### [ 補足1 ] CloudFrontのドメインネームの変更方法
CloudFrontをただ設定するだけだと、画像アドレスがCloudFrontのドメインになります。
SEO的にサイトのドメインに変更することが望ましいです。
そのためにはSSL証明書を取得する必要があります。

1. Request or Import a Certificate with ACM を押下
1. Route53でドメイン検証のホストゾーンを作成
--- SSL証明書が発行できたら ---
1. 編集 → CNAMEsに配信したいドメイン（サブドメイン）を入力
1. カスタムSSL証明書を選択
1. Route53でCNAMEレコードを作成



## CloudFormationとは
EC2やRDSなどのリソース作成をテンプレートを使って自動化できるサービスです。
テンプレートは自由に作成可能です。
課金はされませんが、作成されたEC2などのリソースのお金はかかります。

作成するとき
1. stackの作成を押下

削除するとき
1. 対象を選択して削除ボタンを押下
    1. 作成されたリソースがすべて自動で削除される


## Lightsailとは
料金やスペックが事前に決められたプランを選択して、
簡単にインスタンスを作成できる仮想サーバのサービスです。
スペックは後から変更できませんが、低価格です。


## BeanStalkとは
定番構成の作成とアプリケーションのデプロイや管理をするサービスです。


## VPCエンドポイントとは
VPC内からVPC外のAWSサービスへのアクセスを可能にします。
外部のネットワークを経由しないため、セキュアにアクセスすることができます。



# インフラ設計における重要な観点
|観点|内容|具体的指標例|
|:--|:--|:--|
|可用性|サービスを継続的に利用できるか|稼働率、災害対策|
|性能・拡張性|システムの性能が十分で、拡張しやすいか|性能目標、拡張性|
|運用・保守性|運用と保守がしやすいか|運用時間、監視|
|セキュリティ|情報が安全に守られてるか|公開範囲、情報漏洩対策|
|移行性|他システムに移行しやすくなっているか|移行方式の規定、設備|