初学者のためのAWS入門(1)

ここでは、AWSを基礎から学ぶ人向けに必要な情報をまとめていきます。
#### 初学者のためのAWS入門シリーズ
- 初学者のためのAWS入門(1) -> この記事です。 
- [初学者のためのAWS入門(2) - CloudFormation入門1] (https://qiita.com/mshinoda88/items/c5b238212c2de850efdd) 
- [初学者のためのAWS入門(3) - CloudFormation入門2]
(https://qiita.com/mshinoda88/items/65e7e145c7ec943af403) 
- [初学者のためのAWS入門(4) - S3でBasic認証を設定してリポジトリを公開](https://qiita.com/mshinoda88/items/dfb1ee355fbcb08e47e5)
- [初学者のためのAWS入門(5) - S3+Athena+QuickSightでデータ分析結果の可視化](https://qiita.com/mshinoda88/items/54d1d8c3b660e88e6198)
- [初学者のためのAWS入門(6) - Lambdaでサーバレス実行してみる](https://qiita.com/mshinoda88/items/1b44f2a19c0a0895ab60)

・AWSの概略を把握する（サービス一覧把握、クラウドとオンプレの比較、AWSの基礎用語把握、課金体系を把握、ストレージコストの把握）
・EC2でインスタンスを作ってみる
・IAMユーザを作ってみる
・S3を触ってみる
・S3にデータをおいて、EC2にマウントしてみる
・AWS CLIを導入してみる
・ファイアウォールの設定を触ってみる

# 1. AWSの主なサービス一覧

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/78dc4b06-0130-336d-a86a-3714cc9862dd.png)

### コンピューティング
#### Amazon EC2
正式名称は Amazon Elastic Compute Cloud で、AWSのIaaSのひとつ。さまざまなスペックの仮想マシンを作成して実行できる。EBS（Elastic Block Store）やELB（Elastic Load Balancing）と統合されている。

#### Amazon Lightsail
VPSサービス。EC2とは料金プランが異なり、ほとんど設定をすることなくWordPressやRedmineなどがインストールされたサーバを起動できる。

#### Amazon Elastic Container Service
Dockerコンテナのクラスタ管理サービス。従来クラスタはEC2で管理されていたが、２０１８年AWS Fargateが発表され、EC2を起動せずにコンテナを実行できるようになった。

#### AWS Lambda
サーバ不要でアプリケーションコードのみをデプロイすることで、イベント駆動でコードが実行できるサービス。他のサービスとのハブとなり、サーバレスアーキテクチャの中核となるサービス。

#### AWS Batch
バッチ処理を実行できるサービス。サーバ不要・処理の実行という点でLambdaと似ているが、Lambdaにはリクエストあたりの最大実行時間が300秒という制限があるため、時間のかかる処理や複雑な処理をしたい時に使用する。処理は ジョブ という単位で登録し、ECSコンテナクラスタで実行される。

#### AWS Elastic Beanstalk
アプリケーションのデプロイ・管理サービスで、AWSのPaaSのひとつ。EB単体のものではなく、実態はEC2やS3、RDSやELBなどをプロビジョニングするサービス。

#### AWS Multi-Factor Authentication (MFA) 
ユーザー名とパスワードに加えて保護のレイヤーを追加できる、簡単なベストプラクティス。
MFA を有効にすると、ユーザーが AWS ウェブサイトにサインインするときに、ユーザー名とパスワード (第 1 の要素、つまりユーザーが知っているもの) の他に、AWS MFA デバイスからの認証コード (第 2 の要素、つまりユーザーが持っているもの) を入力することが必要になる。このように複数の要素を組み合わせることによって、AWS アカウントの設定とリソースのセキュリティが強化される。

### ストレージ
#### Amazon S3
正式名称は Amazon Simple Storage Service で、年間で99.99%の可用性と99.999999999%の耐久性を実現するよう設計されたオブジェクトストレージ。アクセスポリシー、データの暗号化、バージョニング、MFA削除、ライフサイクル管理ポリシー、イベント通知。さらに、静的Webサイトホスティング、タグ付け、クロスリージョンレプリケーションなど、およそSimpleとは言えない豊富な機能を備えている。

#### Amazon EFS
正式名称は Amazon Elastic File System で、フルマネージドなNFSサーバサービス。最大数千のEC2インスタンスからの同時アクセスが可能で、ペタバイト単位まで自動的にスケールする。

#### Amazon Glacier
頻繁に使用されないデータ（コールドデータ）に最適化された低コスト、高耐久性を備えたストレージサービス。アーカイブ、バックアップ用途に向いており、S3のライフサイクル管理を利用することで自動的にデータを移行したりできる。

#### AWS Storage Gateway
オンプレミスのアプライアンスからクラウドベースのストレージに接続できるサービス。ファイルベース、ボリュームベース、テープベースという異なったインタフェースでの接続がサポートされている。

### データベース
#### Amazon RDS
正式名称は Amazon Relational Database Service で、フルマネージドなRDBサーバサービス。Amazon Aurora、PostgreSQL、MySQL、MariaDB、Oracle、Microsoft SQL Serverの6つのデータベースエンジンから選択できる。

#### Amazon DynamoDB
フルマネージドなNoSQLデータベースサービス。セカンダリインデックスやスループットキャパシティによるパフォーマンスの調整ができる。

#### Amazon ElastiCache
フルマネージドな分散型インメモリデータストアサービス。キャッシュエンジンとしてmemcachedとRedisがサポートされている。

#### Amazon Redshift
フルマネージドなデータウェアハウスサービス。PostgreSQL互換のインタフェースを備えるため、PostgreSQLの管理ツールが使用できる。

### 移行
#### AWS Migration Hub
各種移行ツールの、アプリケーションの移行状況を追跡できるダッシュボードサービス。Migration Hub自体はオレゴンリージョンのみサポートしている。

#### AWS Application Discovery Service
オンプレミスのサーバの基本情報、使用状況、設定などのデータ収集サービス。Migration Hubに統合されている。

#### AWS Database Migration Service
同一DB製品間でのデータ移行、別DB製品への移行サービス。ソースとしてRDB以外にMongoDBがサポートされていたり、ターゲットとしてRDB以外にS3やDynamoDBがサポートされている。Migration Hubに統合されている。

#### AWS Server Migration Service
オンプレミスのVMwareまたはHyper-Vの仮想マシンをAWS クラウド環境に移行するサービス。Migration Hubに統合されている。

#### AWS Snowball
オンプレミスのサーバとS3との間で、オフラインでデータを移行するサービス。ペタバイトクラスのデータ移行が主なユースケースのひとつ。

### ネットワーキング ＆ コンテンツ配信
#### Amazon VPC
正式名称は Amazon Virtual Private Cloud で、AWS クラウドに作成できる仮想ネットワークサービス。サブネット、Elastic IP、セキュリティグループ、ネットワークACL、ゲートウェイ、ルートテーブルといったリソースが用意されている。

#### Amazon CloudFront
静的および動的Webコンテンツを配信するCDNサービス。HTTP/HTTPS経由でのWebコンテンツとRTMPを使用してのメディアファイルのストリーミングがサポートされている。

#### Amazon Route 53
フルマネージドなDNSサーバサービス。リソースのヘルスチェック（＋DNSフェイルオーバー）、多様なルーティングポリシーとトラフィックポリシー、通常のレコードタイプのほかエイリアスレコードもサポートされている。

#### Amazon API Gateway
RESTful APIを作成、デプロイできるサービス。エンドポイントとして、Webサイト、Lambda関数、その他のAWSサービスがサポートされている。Swaggerファイルによるインポート／エクスポートがサポートされている。

#### AWS Direct Connect
オンプレミスのネットワークとAWSのネットワーク（VPC）を接続するプライベートネットワークサービス。一般的にDXと略される。

### 機械学習
#### Amazon Amazon SageMaker
フルマネージドな機械学習サービス。調査、クレンジング、前処理に対してセットアップなしで利用可能なJupyterノートブックを実行するインスタンスが提供される。機械学習モデルを早く簡単に構築、トレーニング、ホスティングできる。

#### Amazon Amazon Comprehend
フルマネージドな自然言語処理サービス。テキストの中から場所や人物、キーフレーズ、感情（肯定的／否定的／混在／中立）などが検出できる。

#### AWS DeepLens
ディープラーニングに対応したプログラム可能なビデオカメラ。Kinesis Video StreamsやRekognition Video、SageMakerやLambdaと統合、連携できる。

#### Amazon Lex
Chatbotなどの、音声やテキストに反応する対話型インタフェースを構築するサービス。自然言語処理にAlexaと同等のディープラーニング技術を使用できる。

#### Amazon Machine Learning
機械学習のモデルを構築し、予測を生成するサービス。モデルのデータソースとして、S3に保存されたデータセット、RedshiftまたはRDSのMySQLが使用できる。

#### Amazon Polly
テキストを自然な音声に変換するテキスト読み上げサービス。SSML（Speech Synthesis Markup Language）を使用して発音、ボリューム、話す速度など、音声のさまざまな要素をカスタマイズできる。また、レキシコンによる単語の発音のカスタマイズも可能。

#### AWS Rekognition
画像の検索と分析サービス。画像内の物体、シーン、テキスト、顔の検出、有名人の認識、および不適切なコンテンツの識別ができる。また動画でも使用可能となるRekognition Videoも発表された。

#### Amazon Transcribe
音声をテキストに変換する文字起こしサービス。電話音声など不鮮明なものも可能で、すべての単語へタイムスタンプ付与、複数話者の認識などの機能も予定されている。なお執筆時点でプレビュー版です。

#### Amazon Translate
テキストベースのコンテンツを多言語へ変換できるニューラル機械翻訳サービス。既存のテキストを大量に翻訳するバッチ翻訳と、オンデマンドで翻訳するリアルタイム翻訳の両方に対応している。なお執筆時点でプレビュー版です。

### 分析
#### Amazon Athena
標準SQLを使用してS3のデータを分析できるインタラクティブクエリサービス。Prestoで構築され、CSV、JSON、ORC、Avro、Parquet などのさまざまな標準データフォーマットに対応し、自動で並列的に実行される。

#### Amazon EMR
正式名称は Amazon Elastic MapReduce で、フルマネージドな（HadoopやSparkなどの）ビッグデータフレームワークサービス。ストレージとしてHDFS、S3を直接利用できるEMRFS、ローカルファイルシステムがある。

#### Amazon CloudSearch
フルマネージドなカスタム検索サービス。スケーラブル、高い信頼性とパフォーマンス、豊富な検索機能などを備える。Solrベース。

#### Amazon Elasticsearch Service
フルマネージドなElasticsearchクラスタサービス。KibanaやLogstashがサポートされ、S3、Kinesis、DynamoDBとの統合も可能。

#### Amazon Kinesis
リアルタイムでストリーミングデータを処理できるサービス。高速かつ継続的にデータの取り込みと集約を行うことができる Kinesis Data Streams 。S3、Redshift、Elasticsearch Serviceなどの送信先にリアルタイムのストリーミングデータを提供する Kinesis Data Firehose 。標準SQLを使用してストリーミングデータの処理や分析ができる Kinesis Data Analytics といったサービス群からなる。

#### Amazon QuickSight
簡単に高速にデータを分析・可視化できるクラウドBIサービス。データソースとしてRDB（RDSやオンプレのRDBなど）やS3、AthenaやRedshift、ExcelやCSVなどのファイル、SaaS（Salesforce）が使用できる。アドホック分析やダッシュボードを作成しデータを可視化できる。

#### AWS Data Pipeline
サービス（ノード）間のデータの移行および変換を行えるサービス。連携可能なサービスとしてDynamoDB、RDS、Redshift、S3がサポートされている。定義した処理はEC2またはEMRで実行され、スケジュール機能と組み合わせることでジョブスケジューラとしても利用できる。

#### AWS Glue
フルマネージドなETL（Extract、Transform、Load）サービス。RDSやS3といったデータソースをクロールしてデータカタログを構築、次にETL処理をジョブとしてトリガ登録（スケジュール／連結／オンデマンド）することで処理を実行する。

### セキュリティ、アイデンティティ、コンプライアンス
#### AWS IAM
正式名称は AWS Identity and Access Management で、ユーザー認証やアクセス許可によって、AWSリソースへのアクセスを安全に制御するためのサービス。ユーザー、グループ、ロールといったリソースにアクセス許可を定義したポリシーを紐付けることでアクセス制御を行う。また、STS（Security Token Service）を使用することで、一時認証情報を利用したクロスアカウントアクセスやIDフェデレーションが可能となる。

#### Amazon Cognito
ユーザー認証（IDの発行）とアプリケーションデータの同期を行えるサービス。ユーザーディレクトリを作成、管理し、モバイルアプリおよびWebアプリに、サインアップとサインインを追加できる Cognito User Pools 。フェデレーテッドIDプロバイダで認証し、STSによる一時的な認証情報を作成できる Cognito フェデレーテッドアイデンティティ 。アプリケーション関連のユーザーデータのオフラインでのアクセスとデバイス間の同期をサポートする Cognito Sync といった機能がサポートされている。

#### Amazon GuardDuty
VPCフローログ、CloudTrailイベントログおよびDNSログを監視・分析する、継続的なセキュリティモニタリングサービス。GuardDutyが生成した結果はCloudWatch Eventsとの連携が可能（執筆時点ではCLIのみ設定可能）。

#### Amazon Inspector
AWSリソース（執筆時点ではEC2インスタンスのみ）の動作を分析する自動化されたセキュリティ評価サービス。評価ターゲットの各インスタンスにはInspectorエージェントをインストールする。エージェントは、安全な通信の使用、プロセス間のネットワークトラフィック、AWSリソースの動作や設定といったデータ（テレメトリー）を収集・分析し、セキュリティルールと比較を行う。

#### Amazon Macie
S3に保存されているデータを、機械学習によって自動的に検出、分類、保護するフルマネージドなセキュリティサービス。個人情報（PII）や知的財産などの機密データを認識し、さらにアクセスパターンとユーザーの動作を分析することで、不正アクセスの危険や不注意によるデータ漏洩などを監視する。

#### AWS Single Sign-On
Microsoft Active Directoryの認証情報を使用してシングルサインオンを管理するサービス。AWS Organizationsで管理されているAWSアカウントやビジネスクラウドアプリケーション（Office 365、Salesforce、Boxなど）、SAML 2.0をサポートするアプリケーションにSSO可能となる。クラウドのAD（Microsoft AD）あるいはオンプレミスのAD（Microsoft ADと信頼関係またはAD Connector）がサポートされるが、Simple ADはサポートしていない。

#### AWS Certificate Manager
AWSの各種サービスで使用するSSL/TLS証明書のプロビジョニング、管理、およびデプロイができるサービス。Webサイトやアプリケーションに直接証明書をインストールすることはできず、サポートされているサービスにインストールして使用する。発行される証明書の有効期限は13ヵ月で、自動的に更新される。執筆時点でサポートされているサービスはELB、CloudFront、EB、API Gateway、CloudFormationとなっている。

#### AWS CloudHSM
フルマネージドなハードウェアセキュリティモジュール（HSM）管理サービス。FIPS 140-2 レベル3に準拠しており、高いセキュリティ要件が求められるサービスでも利用できる。CloudHSMクラスタの作成には、リージョン内の各AZにHSMを作成したHA（高可用性）構成にすることが推奨されている。

#### AWS Directory Service
フルマネージドなディレクトリサーバサービス。執筆時点では、クラウドネイティブなグラフベースのディレクトリストアである Amazon Cloud Directory 。モバイルアプリまたはWebアプリにサインアップとサインインを追加するユーザーディレクトリ Amazon Cognito Your User Pools 。マネージド型Microsoft Active Directoryである Microsoft AD 。Samba 4を搭載したAD互換のディレクトリ Simple AD 。そして、オンプレのADと連携する AD Connector の、5種類のディレクトリタイプが提供されている。

#### AWS WAF
CloudFrontまたはALBに転送されるHTTP/HTTPSのリクエストをモニタリングし、悪意のあるリクエストを検出・防御できるWebアプリケーションファイアウォール。条件、ルール、Web ACLを作成することで、コンテンツへのアクセスを制御できる。また、先日マネージドルールが利用可能となった。

#### AWS Shield
DDoS攻撃からAWSリソースを保護するためのサービスで、 Standard と Advanced の2つの異なる保護レベルが提供されている。Standardは無料で自動的に適用され、SYN/UDPフラッド攻撃やリフレクション攻撃といったL3/L4レベルの攻撃を緩和する。AdvancedはELB、CloudFront、Route 53を対象とするアプリケーション保護を強化する有料サービスで、L3/L4/L7レベルのDDoS攻撃を緩和する。

#### AWS Artifact
ISO、PCI、SOCレポートなどの、AWSクラウドでのコンプライアンスとセキュリティに関するドキュメントをオンラインでダウンロードできるサービス。ダウンロードしたドキュメント（監査アーティファクト）は信頼している相手のみと、セキュアなドキュメント共有サービスを使用して共有することが推奨されている。

# 2. クラウドとオンプレの比較  

| 項目 | クラウド |オンプレ    |
|:-----------|:------------------|:------------------|
| 準備期間    | ◎　即時利用可能 |△　初期契約/設定に時間かかる|
| 初期費用    | ◎　なし |△　初期費用が必要な場合もある|
| 維持費用    |◯　従量課金(上限設定可能) | ◯　基本固定　&　追加費用        |
| 障害対      |◎　クラウド事業者が対応 | △　原則自社対応       |
| セキュリティ   |◎　クラウド事業者が対応 |◯　原則自社対応で強化できる       |
| カスタマイズ  |△　設定変更&連携で対応 |◎　柔軟にカスタマイズできる       |

# 3. VPC

## 3-1. VPC (Virtual Private Cloud)とは

VPCはAWS専用の仮想ネットワーク。
家庭内でインターネットを利用する際、ルーターやゲートウェイなどのネットワーク機器が必要となる。
一方、VPCはそれらの機器を仮想的に用意し、ネットワーク環境を構築できるサービス。

## 3-2. リージョン
AWSのグローバルなバックボーンは、「**リージョン**」と呼ばれる地理的に離れた領域がそれぞれ接続されることで構成されている。
各「リージョン」ではAWSのサービスがそれぞれ独立して提供されており、言い方を変えると「リージョン」は**お互いに完全に分離されるよう設計されたAWSのネットワークとサービスの「集合」**となる。

リージョン一覧
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions

たとえば、日本には東京リージョン（"ap-northeast-1"）があり、米国にはバージニア北部リージョン（"us-east-1"）、オレゴンリージョン（"us-west-2"）などがあります。
また、政府の業務に関わる米国連邦政府、州、各地方自治体等が利用する GovCloud（米国）リージョン（"us-gov-west-1"）なんていうものもある。

「リージョン」が完全に分離されていることによって、AWS全体としては最大限の耐障害性と安定性が実現されている。

## 3-3. アベイラビリティ・ゾーン

AWSにおけるリージョンは2つ以上の「アベイラビリティーゾーン」から成り立っており、「アベイラビリティーゾーン」は1つ以上の独立したデータセンターで構成されている。

<img src="https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/aws_regions.png">

AWSの東京リージョン（"ap-northeast-1"）では、2つのアベイラビリティーゾーンを利用いただくことができ、各アベイラビリティーゾーンには"ap-northeast-1a"や"ap-northeast-1c"といったIDがつけられています。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-regions-availability-zones

| コード | 名前 |
|:-----------|:------------------|
| ap-east-1 | アジアパシフィック (香港) |
| ap-northeast-1 | アジアパシフィック (東京) |
| ap-northeast-2 | アジアパシフィック (ソウル) |
| ap-northeast-3 | アジアパシフィック (大阪) |
| ap-southeast-1 | アジアパシフィック (シンガポール) |
| ap-southeast-2 | アジアパシフィック (シドニー) |
| ap-south-1 | アジアパシフィック (ムンバイ) |
| me-south-1 | 中東 (バーレーン) |

## 3-4. VPCの基本コンポーネント
AWS VPCには様々なコンポーネントが用意されており、それらを組み合わせることで自由にネットワーク環境を構築できる。ここでは現場でもよく使われるコンポーネントについて簡単に説明する。
![aws-components.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/1955ef09-0d16-452a-99bc-f74217cd8682.png)

#### IGW(インターネットゲートウェイ)
VPCをインターネット接続できるようにするコンポーネント。
![component-igw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/655b4237-ca33-354b-d949-d2394b915584.png)

#### Subnet(サブネット)
VPCという大きなネットワークのくくりの中に、小さいネットワークの集まりを作ることができるコンポーネント。

例えばVPCで全体のネットワーク空間を、下記のアドレス範囲で設定したとする。
10.0.0.0 /16
このアドレスの範囲内で、インターネットと通信できるパブリックなネットワークと、外部から遮断したいプライベートなネットワークを定義する。
　　10.0.1.0/24…パブリックサブネット
　　10.0.2.0/24…プライベートサブネット

このようにサブネットを利用することで、ネットワークごとに役割を与えることができ、管理しやすくなる。
![aws-subnet-example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/490e55a2-049c-6ce3-c170-1be52f58cc5e.png)

#### Route Table(ルートテーブル)
ネットワークの経路を設定するコンポーネントです。
![component-routetable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/a9b75ea3-381a-dec0-fd59-29c1fd1111b2.png)
サブネット内の通信がどの宛先のネットワークに対して、どのコンポーネント（IGWとかEC2とか）に転送されて欲しいかを設定する。
一つのサブネットに一つのルートテーブルを用意できる、指定がない場合はVPC作成時に自動生成されるメインルートテーブルがサブネットに割り当てられる。

#### Elastic IP(固定IP)
EC2のインスタンスに対して固定IPを割り当てるコンポーネント。独自ドメインのWebサイトを外部公開する場合などに使用する。
![component-elasticip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/653ca265-162c-a697-cea9-85f24c4be5b9.png)

#### NGW(NATゲートウェイ)
アドレス変換を行うためのコンポーネント。パブリックサブネットに設置し、プライベートサブネットから外部への通信ができるようにNATする時に使用する。
![component-natgw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/0fc08271-433b-d39e-abd8-5d8b38de54d5.png)

#### 実際のVPC設計例
![aws-privatesubnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/db55f361-e475-50b9-7096-7f8a87d7e218.png)

プライベートサブネットから外部へ通信させたいときはNAT GWをパブリックサブネットに設置。合わせてルートテーブルの設定も行う。
![aws-natgw-rt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/833fbb13-cd6b-c992-8ebd-d8596b5f61b4.png)

AZ-Aで障害が起きた時のことを考え、AZ-Cに同じ内容でインフラを構築し、冗長構成とする。
![aws-active-standby.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/66b3a238-423c-1a46-f1b7-1bf3e8564be7.png)

# 4. IAM(Identity and Access Management) 
「どのサービス（リソース）に対する」「どのような操作を」「誰に」
許可するか・許可しないかを定義出来る

<img width="799" alt="iam_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/fcd92de6-8a86-774f-0888-51875c1fca84.png">

## 4-1. IAM を用いてユーザに権限を付与するまでの流れ
1. 操作権限定義<br>
AWSサービスやAWSリソースに対する操作権限を「IAMポリシー」として定義する。
2. ポリシーのアタッチ<br>
IAMポリシーを「IAMユーザー」や「IAMグループ」にアタッチする。

## 4-2. IAMポリシー
AWSサービスやAWSリソースに対する操作権限をJSON形式で定義したもの。
IAMポリシーの定義項目は以下のとおり。

| 項目 | 内容 |
|:--|:--|
| Version | IAMポリシーの文法バージョン（2017年12月現在は「2012-10-17」） |
| Effect | ここで定義するポリシーが許可を与えるポリシー（Allow)か拒否するポリシー（Deny)かを設定 |
| Action | 「どのAWSサービス」に対する「どのような操作」を許可(拒否)するかを設定 |
| Resource | 「どのAWSリソース」に対する操作を許可(拒否)するかを設定 |

## 4-3. IAMポリシー例
- EC2リソースの閲覧
- EC2インスタンスの開始
- EC2インスタンスの停止

上記権限を付与するポリシーは以下

```bash
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:Describe*",
                "ec2:StartInstances",
                "ec2:StopInstances*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

#### Action
Action にEC2関連の全ての参照権限を示す ec2:Describe*
EC2のインスタンスの開始と停止権限の ec2:StartInstances ec2:StopInstances を設定
* を用いることで ec2:Describe* から始まる全ての権限を許可している

#### Resouce
Resouce に * を設定することで全てのリソースに対して権限を付与している
Resouce に Amazonリソースネーム(ARN) を設定することでAWSリソース個別指定することも可能
ARNは arn:aws:ec2:region:account:instance/instance-id のように指定できる

```bash

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:Describe*",
                "ec2:StartInstances",
                "ec2:StopInstances*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:region:account:instance/i-xxxxxxxxx",
            "Resource": "arn:aws:ec2:region:account:instance/i-yyyyyyyyy"
        }
    ]
}
```

#### Effect
Effect に Allow Deny を設定することで許可 / 拒否を設定できる

## 4-4. IAMユーザーとIAMグループ

AWSの操作を行うためのユーザーを **IAMユーザー** と呼ぶ

- IAMユーザーは主にマネジメントコンソールにログインする用途で使用される
- IAMユーザーにIAMポリシーをアタッチすることで操作権限を付与できる
- アクセスキーとシークレットキーのキーペアを払い出しIAMユーザーと同等の権限をプログラムに付与することもできる
- IAMグループ は同じ権限を付与すしたいIAMユーザーをひとまとめに管理する
- IAMグループにIAMポリシーをアタッチすることでIAMユーザーへ一律に権限を付与することができる

## 4-5. ルートユーザーの扱い

- AWSアカウント作成時に設定したアドレスとパスワードでログインできる **ルートユーザー**　が存在する
- ルートユーザーはAWSアカウントに対する全ての操作が可能
- 更に下記の操作はルートユーザーのみが実行可能
    - AWSアカウント全体の設定変更（メールアドレス / パスワード変更など）
    - AWSサポートのプラン変更
    - EC2からのメール上限緩和申請
    - 逆引きDNS申請
    - 侵入テスト申請
    - AWSアカウントの停止

- Admin権限を付与したIAMユーザーでも上記操作はできない
- これらからルートユーザーは 日常の開発/運用 では使用しない
- 初めにAdmin権限を付与したIAMユーザーを作成しそのユーザーで作業を行うようにする
- AWSアカウントは **二要素認証** をかけ上記のようなルートユーザでしかできない作業以外で使用しない

# 5. AWSの基礎用語

## 5-1. AMI(Amazon Machine Image)

AMIとはインスタンスの起動に必要なイメージファイル。
AWSにおいては各種OSのインストールや設定が済んだ状態のものがイメージファイルとして用意され、好きなOSをコピーしてインスタンスを作ることでサーバーとして動かすことができる。

イメージファイル
イメージファイルとはDVDなどのハードディスクに保存されたデータをファイルやフォルダの構造を保ったまま保存、コピーしたデータのこと。
DVDの中身そっくりそのままなので仮想ドライブ(ハードコピーと異なり実体がないので読み込みも仮想のドライブ)で再生が可能。

## 5-2. AWS CLI(Command Line Interface)

AWS CLIは、AWSのサービスをコマンドラインから操作し、管理するためのツール。
このツールはプラットフォームや開発言語の制限がなく、Linux、Mac、Windowsなど様々なOSで利用可能。

シェルスクリプトと組み合わせることで、AWSの作業を自動化できる点は非常に魅力的。

# 6. EC２の課金体系

AWS には、コンピューティング、ストレージ、およびデータ転送 (アウト) と
いう、支払い対象となる 3 つの基本的特性があります。 
<img width="613" alt="ec2_kakin.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/1b3cd18a-7527-3442-7aeb-f06e687575c7.png">
・これらの特性は、使用している AWS 製品に応じてわずかに異なります。
・データ転送 (アウト) は有料ですが、インバウンドデータ転送、または同じリー
ジョン内のその他アマゾン ウェブ サービス間でのデータ転送は無料。
・アウトバウンドデータ転送は、Amazon EC2、Amazon S3、Amazon RDS、
Amazon SimpleDB、Amazon SQS、Amazon SNS、および Amazon VPC 全体で
集約されてから、アウトバウンドデータ転送の料金が課されます。

# 7. ストレージのコスト

課金ポイントは3つ
<img width="542" alt="s3_kakin.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/fc7f0a88-f218-fafc-ad6c-eab940cfb2c4.png">

## 7-1. ストレージ容量

保存容量に対して課金されます。低冗長化ストレージを指定すると2割くらい安くできる。
容量でかいけど殆どアクセスしないものはライフサイクル設定でGlacierに移動しましょう。

## 7-2. データ転送

課金されるのは(S3からの)送信だけ。受信（S3へのアップロード）は無料。

あとAWSでは 同一リージョン内の(AZ非依存な)AWSサービスとの通信は無料 です。
例えば同一リージョンのEC2とS3間の通信は送信も受信も無料。
**一番高いインターネットへのデータ送信だけ**と考えておけばよい。

## 7-3. リクエスト数

S3ではGET/PUT/POST/LIST/COPYなどのリクエスト数に対しての課金もある。

GET は安い（$0.0037/10,000req、OPTION/HEADとかも、全部この料金）
PUT/POST/LIST/COPY は高め（$0.0047/1,000req、GETの12.7倍）
DELETE は無料

例えば1日100万GETされると月に3千万リクエストで課金は$11.1。

## 7-4. 関連リンク

Amazon S3 料金表
http://aws.amazon.com/jp/s3/pricing/

Amazon Web Services Simple Monthly Calculator
https://calculator.s3.amazonaws.com/calc5.html?lng=ja_JP

# 8. EC2でインスタンスを作成する

## Step.1 AWSにログイン

AWS マネジメントコンソールにてログイン
https://console.aws.amazon.com/

## Step.2 EC2のインスタンスを作成する

Amazon EC2 ダッシュボードに移動
https://us-east-2.console.aws.amazon.com/ec2/v2/home
![ec2_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/9eb96306-6452-7982-2644-75d53926b34a.jpeg)

右上の「サポート」の左をクリックしてリージョンを選択する（画面では「オハイオ」）
![ec2_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/52e17cdd-8db7-651d-4912-5b9b18274fe0.jpeg)

画面中央の「インスタンスの作成」を選択する
<img width="1207" alt="ec2_05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/4ccef8bc-f9c2-9257-114d-2039ee71e249.png">

## Step.3 インスタンスを設定する

### Step 3-1. AMIの選択 - ソフトウェア構成を選択する画面
今回は「Ubuntu18.04」を採用
<img width="1294" alt="ec2_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/5720758f-973d-9891-2bda-ac8184dc58f9.png">


### Step 3-2. インスタンスタイプの選択
仮想サーバーのスペックを選択する画面（今回は「t2.micro」を採用）
<img width="1301" alt="ec2_07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/686230db-25f4-1f85-6f92-b074ceb59964.png">

「確認と作成」を押すと一気に 3-7. まで飛ばされますが、ここは丁寧に見ていきます。

### Step 3-3. インスタンスの詳細の設定
ネットワークを選択。デフォルトで良いならそのまま。
サブネットを選択。ここは「-1a」を選択。（1aはパグリックサブネットです）
自動割り当てパブリックIPは「有効」を選択。(これを有効にしないとインスタンス起動時に接続可能なパブリックIPが割り当てられない)
<img width="1305" alt="ec2_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/36317f63-b265-d878-693f-fae94604813b.png">


### Step 3-4. ストレージの追加
ストレージのサイズを指定します。初期状態では8GBです。
<img width="1302" alt="ec2_09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/e50a9a96-5649-9428-8637-4bcf1c7401ba.png">

### Step 3-5. タグの追加
ここは必須ではないので、スキップ。
<img width="1308" alt="ec2_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/e2fe9450-d622-ee3e-f297-dd93abdc01c5.png">

### Step 3-6. セキュリティグループの設定
既存の設定を再利用する際には「既存のセキュリティグループ」を選択。今回は「新しいセキュリティグループ」を作成しています。
実際の詳細設定は後ほど実施することにします。
<img width="1311" alt="ec2_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/d9f207fb-aa54-81ef-34eb-f2778a75674d.png">

### Step 3-7. 確認 - 作成するかの確認画面
確認して「起動」を押下する。
<img width="1306" alt="ec2_12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/d375bd07-71ff-b21d-2539-a0ba36e19e3f.png">

キーペアの作成をするか問われる画面が出てくる。
![ec2_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/3de0abfc-231b-9021-0480-cec214d4f9e5.jpeg)

今回は「新しいキーペアの作成」を行う（既存のキーペアを使用したい場合は「既存のキーペア選択」から選択）

キーペア名を入力し、「キーペアのダウンロード」から.pemファイルのダウンロードを行う
（**再度ダウンロードは不可なので大切に**）

インスタンスの作成を押したら、画面が切り替わりインスタンス作成中の画面に遷移します
（数分かかります）

### Step 3-8. インスタンス一覧へ
Amazon EC2 ダッシュボードに戻り左側の、「インスタンス」を選択。
作成したインスタンスを確認する。
<img width="1034" alt="ec2_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/7b071886-1417-607d-cf1c-187f3578c685.png">

インスタンスを選択した際の詳細情報。
<img width="1007" alt="ec2_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/5d4aa164-80ae-ffa6-aa57-17203c39be79.png">

### Step 3-9. インスタンス名設定
作成したインスタンスの「Name」欄を編集し、インスタンス名を設定する。
「Name」欄にマウスホバーすると編集アイコンが表示されるので、クリックして編集する。
<img width="501" alt="ec2_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/12309cce-34ba-ed56-3b33-b7b7579376a0.png">


## Step.4 インスタンスへの接続

Tera Term,PuTTy,Xshell等クライアントソフトを使い、先ほどのIPに接続。
ここでは「Secure Shell App」を使用。

### Secure Shell App
Secure Shell App - Chrome ウェブストア
https://chrome.google.com/webstore/detail/secure-shell-app/pnhechapfaindjhompbnflcldabbghjo?hl=ja

<img width="370" alt="chrome_secureshellapp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/115c58d0-4d24-f721-baf5-008c3a2f2bd3.png">

ChromeのURL欄に「chrome://apps/」を入力
→「Secure Shell App」を選択。

### 実際の接続
<img width="1191" alt="chrome_secureshellapp02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/9840c9bb-b008-70f6-86e5-219116666a21.png">

IP : インスタンスの「IPv4 パブリック IP」
User : ubuntu
PORT : 22
「インポート」をクリックして、キーペアの.pemファイルを指定する。

# 9. S3を使ってみる
サービスから「S3」を入力して検索。
<img width="797" alt="s3_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/8a0c19f0-fdc6-004c-ab0d-c0a616f85d04.png">

「バケットを作成する」を押下。ここではバケット名「bkt-sampledomain01」を作成
<img width="686" alt="s3_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/14b1ddab-e0c2-e813-d11f-c2cea2a21163.png">

バケット名を入力して、「次へ」
<img width="1086" alt="s3_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/37c163a2-7488-0fcb-e5b2-b9cbbdd14299.png">

特に設定変更なしで「次へ」
<img width="1075" alt="s3_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/9c1360f7-6d60-d4d7-0371-d1828915fa03.png">

特に設定変更なしで「次へ」
<img width="1076" alt="s3_05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/044a899d-9d5d-0112-f67d-3df811158937.png">

「バケットを作成」を押下
<img width="1075" alt="s3_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/e1c51e5c-9360-6101-59b8-e3fb8490fbc1.png">

バケットが作成されたことを確認する。
<img width="1030" alt="s3_07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/0a8c6903-aa04-ca87-e448-75ff8f645522.png">

# 10. S3をマウントしてみる
以下の手順でEC2にS3をマウントしてみます。
1. S3 Bucket の準備　→　上記で済
2. IAMロールの準備
3. IAMロールをEC2インスタンスに割当て
4. s3fs-fuse のインストールと設定
5. マウントの自動化

※ １と２はAWSコンソール画面での操作
※ ３と４はインスタンスにSSH接続してから操作

## 10.1 IAMロールの準備

### IAMサービスを選択

IAMを検索して、
<img width="799" alt="iam_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/8c73d5b6-e4ef-e4fa-acdf-cb16fd6ed6e2.png">

「ロールの作成」を押下
<img width="725" alt="iam_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/7528624f-0c19-26ea-5895-d91e1e7ce35e.png">

### サービス選択
ロールを利用するサービスとして「EC2」を選択→「次のステップ」押下
<img width="811" alt="iam_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/044a0ff0-dd72-32b0-0caf-f280e8031b91.png">

### ポリシー設定
ポリシー名「AmazonS3FullAccess」を選択
<img width="808" alt="iam_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/88cbec1a-9d49-cff5-3545-fdcd8a24e28e.png">

### タグの追加
そのまま「次のステップ」押下
<img width="794" alt="iam_05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/8ddd763d-fb17-3a16-a017-a47afac664c5.png">

### ロール名設定
ロール名を入力して「ロールの作成」押下
<img width="796" alt="iam_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/0b891a18-cf7d-0284-a652-421ef479f1d7.png">

### 確認
- ロール名：access-s3-role
- ロールの説明：access to S3 FullAccess
を確認する。
<img width="918" alt="iam_07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/7b5bc012-43b9-80ab-e75a-eccc2f292bfd.png">

## 10-2. IAMロールをEC2インスタンスに割当て
作成したロールをインスタンスに割り当てる。

EC2のインスタンス一覧で、該当EC2インスタンスの右クリックでメニュー表示。
「インスタンスの設定」→「IAMロールの割り当て/置換」を選択。
<img width="603" alt="iam_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/9a045905-e2c2-e0a5-0bdc-4fc1423b0934.png">

作成したIAMロールを選択して、「適用」押下
<img width="1095" alt="iam_09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/cb0650e4-1391-ae28-0324-40b79815fa90.png">

## 10-3. s3fs-fuse のインストールと設定

### 1. gitなど必要なものをインストールする

```bash

$ sudo apt-get install automake autotools-dev g++ git libcurl4-gnutls-dev libfuse-dev libssl-dev libxml2-dev make pkg-config
```

### 2. s3fsをgitからインストールする

```bash

$ git clone https://github.com/s3fs-fuse/s3fs-fuse.git
```

もろもろの設定（これでs3fsが /usr/local/bin 下におかれる）

```bash

$ cd s3fs-fuse
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
```

### 3. マウントポイントの作成
※root権限のディレクトリとして作成されるがマウント時にownerを設定するのでOK

```bash

$ sudo mkdir /mnt/s3
```

マウント時のownerのuid, gidを確認する

```bash

$ id ubuntu
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),110(lxd)
```

マウントする：s3fs 「バケット名」 「マウント先ディレクトリ」　の書式。
バケット名「bkt-sampledomain01」を指定。マウントディレクトリは「/mnt/s3」を指定。

```bash

$ sudo s3fs bkt-sampledomain01 /mnt/s3 -o rw,allow_other,uid=1000,gid=1000,default_acl=public-read,iam_role=access-s3-role
```

allow_other: root 以外（マウントしたユーザー以外）も利用可能とする。
これでS3のbucketをインスタンスにマウント出来た。
しかし再起動するとマウントは解除されてしまうので、再起動しても自動マウントされるように設定しておく。

## 10-4. マウントの自動化

インスタンスを再起動しても自動でマウントされるように設定を行う。
/etc/rc.local にマウントコマンドを書き込んでおけば起動時に自動で実行してくれる。

```bash

$ sudo vi /etc/rc.local
s3fs bkt-sampledomain01 /mnt/s3 -o rw,allow_other,uid=1000,gid=1000,default_acl=public-read,iam_role=access-s3-role
$ sudo chmod u+x /etc/rc.local 
$ ls -l /etc/rc.local
-rwxr--r-- 1 root root 60 Feb 20 13:25 /etc/rc.local

```

systemd で管理されていていて、その内容は以下の通り。

```bash

$ sudo vi /lib/systemd/system/rc-local.service
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
```

これでインスタンスを再起動しても自動でS3のバケットがマウントされる。

```bash
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  760K  394M   1% /run
/dev/xvda1       49G   40G  8.5G  83% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/loop1       18M   18M     0 100% /snap/amazon-ssm-agent/1455
/dev/loop0       89M   89M     0 100% /snap/core/7396
/dev/loop2       66M   66M     0 100% /snap/google-cloud-sdk/99
/dev/loop4       90M   90M     0 100% /snap/core/7713
/dev/loop5       66M   66M     0 100% /snap/google-cloud-sdk/100
tmpfs           395M     0  395M   0% /run/user/1000
s3fs            256T     0  256T   0% /mnt/s3
/dev/loop6       18M   18M     0 100% /snap/amazon-ssm-agent/1480
```

# 11. AWS CLI を利用する

## 11.1 AWS CLIを利用するための準備
AWS CLIを利用するシーンとしては下記の2つが考えられる。

- 自分のPCやAWS以外のサーバーから利用<br>
専用のIAMユーザーを作成し、アクセスキーの発行が必要
- EC2のインスタンス上から利用<br>
必要な権限を有したIAMロールを作成し、EC2インスタンスにアタッチする（推奨）
またはアクセスキーを利用する

→ EC2インスタンスから利用する方法は2種類ありますが、「IAMロールを作成してインスタンスへ割り当てる方法」が推奨されている。
→ その理由は、アクセスキーが万が一流出した場合、外部から不正利用される可能性があるため。
→ ここではIAMロールをEC2インスタンスへアタッチするやり方で設定を進める。

## 11.2 AWS CLI のインストール

```bash

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py
$ sudo pip install awscli     # インストール
$ sudo pip install -U awscli  # 最新バージョンにアップデート
```

## 11.3 コマンド補完を有効に

AWSコンプリータを見つけて、有効にする。
aws_completer　のフルパスを　~/.bash_profileファイルの行末に追加する。

```bash
$ find / -name aws_completer 2> /dev/null
/usr/local/bin/aws_completer
$ sudo vi ~/.bash_profile
# ファイルの行末に以下を追記
complete -C '/usr/local/bin/aws_completer' aws
```

補完の確認

```bash

$ aws ec2 describe-i <-ここでtab　下記のように出力される
describe-iam-instance-profile-associations   describe-images                              describe-instance-credit-specifications 
describe-id-format                           describe-import-image-tasks                  describe-instance-status 
describe-identity-id-format                  describe-import-snapshot-tasks               describe-instances 
describe-image-attribute                     describe-instance-attribute                  describe-internet-gateways
```

# 12. ファイアウォールの設定

## 12.1 セキュリティグループとは

AWSのファイアウォール機能の一つ。（他には、後述するACLなどがある）
プロトコル、ポート範囲、送信元／送信先IPアドレスによるパケットフィルターが可能。

- インスタンス単位に適用することができる。
- セキュリティグループを作って何も設定しなければ何も通信を通さない。<br>
→ 許可したい通信に応じて許可ルールを作成することでそこに穴を開ける。（拒否ルールは設定できない）

## 12.2 セキュリティグループに関連する基礎用語

#### インバウンドルール
そのセキュリティグループに関連付けられたインスタンスにアクセスできるトラフィックを規制するルール

#### アウトバウンドルール
そのセキュリティグループに関連付けられたインスタンスからどの送信先にトラフィックを送信できるか（トラフィックの送信先と送信先ポート）を制御するルール

#### ステートフル
サーバーがクライアント側アプリケーションの状態(セッション状態)を覚えていること。
セキュリティグループはインバウンド/アウトバウンド通信の際に、「このサーバー(/ポート番号/プロトコル)での通信は許可されているんだな」と覚えているので、それに対するアウトバウンド/インバウンド通信はセキュリティグループで設定がされていなくても許可される。
このように往復のやり取りが必須となる通信において自動的に応答の通信を許可する仕組みを「ステートフル・インスペクション」という。

#### ステートレス
ステートフルの反対でサーバーがセッション状態を覚えていないこと。
AWSにはセキュリティグループ以外にもネットワークACL(アクセスコントロールリスト)というファイアウォールがあり、こちらはステートレス。そのためインバウンド/アウトバウンド両方の設定が必要。

## 12.3 セキュリティグループの設定方法

### マネジメントコンソールから作成する場合
1.「AWSマネジメントコンソール」に入り、「EC2」を選択する。
2.「セキュリティグループ」を選択→「セキュリティの作成」を選択する
<img width="855" alt="sg_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/6ba24122-e1a5-8c32-f4d6-10269a4875ef.png">

3.セキュリティグループ名をつけ、VPCを選択し、「インバウンド」タブを選択。
「編集」ボタンを押下。
<img width="795" alt="sg_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/2311be96-1934-33cb-38c6-2533e52366fd.png">

以下は設定例。
①ソース「0.0.0.0/0」は任意のクライアントからアクセス可能。SSHログイン可能にするのは通常は制限すべき。
②８０８０番ポートは「50.100.200.0/24」のネットワークからのみアクセス可能にされている。
③８０番ポートはHTTP(Webサーバ)として利用するので、通常は全通しにする。
④443番ポートはHTTPS(Webサーバ)として利用するので、通常は全通しにする。
⑤3306番ポートはMySQLの標準ポート。通常はポート番号を変更したうえで、特定ホストからのみアクセス可能にする。

<img width="991" alt="sg_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/9ff017d5-a87a-b9f2-48ed-462b19f0980f.png">


### マネジメントコンソールからセキュリティグループを割り当てる場合
1. 「AWSマネジメントコンソール」に入り、「EC2」を選択する。
2. セキュリティグループを追加したいインスタンスを選択して右クリックでメニュー表示。
<img width="677" alt="sg_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199265/10907d99-c5e5-6c74-a071-0b0bb0450007.png">

3. 「ネットワーキング」→「セキュリティグループの変更」を選択する
4. 適用したいセキュリティグループを選択する

### AWS CLIから設定する場合
#### セキュリティグループの作成
$ aws ec2 create-security-group --description ＜value＞ --group-name ＜value＞ [--vpc-id <value>][--dry-run | --no-dry-run][--cli-input-json <value>][--generate-cli-skeleton <value>]

#### セキュリティグループの確認
$ aws ec2 describe-security-groups --group-id ＜value＞

## セキュリティグループのルール追加

#### インバウンドのSSHポート22を開けるとき
$ aws ec2 authorize-security-group-ingress --group-id ＜value＞ --protocol tcp --port 22 --cidr 0.0.0.0/0


## 12.4 ACL
ネットワークアクセスコントロールリストの略。
セキュリティグループとの違いは
・サブネットレベルで動作する
・ルールの許可と拒否設定が可能である
・ステートレスである