AWS学習 EC2編

# はじめに
今年からAWSを本格的に学習し始めたので、主要サービスであるEC2を構築する上で
必要な知識をまとめて行こうと思います。簡単に、私の経歴を下記にまとめたいと思います。

- 大学（文系）卒業後、6年間障害者支援の仕事に従事
- 結婚を機にIT業界に転職する
- 初めはSESに入るが、あまり開発案件にアサインすることができなかったため、1年で転職を決意
- 現在は大手技術派遣会社でpythonを利用したシステムの開発業務を行っている



## 目標
今回は踏み台サーバーを経由して作業サーバーに接続できるよう
環境を構築します。


## VPCの作成
まずはVPCの作成から行います。
VPCとは、EC2やRDS(AWSのDBサービス)を起動するために必要な箱のようなイメージと言えば伝わりますでしょうか?（厳密にはVPCの中にさらに後述するサブネットというものを切り出してその中にEC2などのインスタンスを作ります。）
AWSマネジメントコンソールにログインし、上部にある検索バーから「VPC」と検索すると対象サービスのリンクがありますので、リンクを押下して画面に遷移します。そこから「VPCの作成」を押下します
![スクリーンショット 2021-02-05 22.13.23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/f34520b5-b387-4739-5b9b-388d4f0decb6.jpeg)

次に下記の項目を入力します。



- 名前タグ: 任意のVPC名を入力
- IPv4 CIDRブロック: 10.0.0.0/16 ~ 10.0.0.0/28内（AWSで定められた範囲内）の範囲で設定します。今回は10.0.0.0/21で設定します。

![スクリーンショット 2021-02-05 22.15.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/0f7467d8-a6c8-41db-5cd4-fff9ed96229c.jpeg)

他はデフォルトOKです！「VPCを作成」を押下します。

## サブネット
サブネットとは、前述のVPCをより細かくわけたネットワークだと思ってください。このサブネットごとにネットワークの通信設定を行い、セキュリティを高めることができます。今回は踏み台サーバー用のパブリックサブネットとプラベートサブネット用の2つを作成します。

VPCサービスの左のナビゲーションペインから「サブネット」を選択。「サブネットを作成」を押下します。

続いて、下記項目を設定します。

- VPC ID: 先ほど作成したVPCを選択
- サブネット名: 任意の名前　
- アベイラビリティゾーン : 任意の項目を選択。(今回はプライベートサブネット、パブリックサブネット両方ともアジアンパシフィック(東京)ap-northeast-1aを選択)
- IPv4 CIDRブロック: 10.0.0.0/24(パブリックサブネット), 10.0.2.0/24(プライベートサブネット)

「サブネットを作成」を押下します。 今回は同じ手順でパブリックサブネット、プライベートサブネットの２つのサブネットを作成します。
下記画像はプライベートサブネットを作成した時のものです。


![スクリーンショット 2021-02-05 22.18.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/3213ba42-afdc-0dde-84a9-cb5e9fd882c8.jpeg)


無事、作成したVPC内に2つのサブネットができました。
![スクリーンショット 2021-02-05 22.19.11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/d5d92914-0b98-415f-272e-066b7abf0427.jpeg)


## インターネットゲートウェイ
VPC、サブネットを作成したので、EC2(仮想サーバー)を立てたいところですが、今のままではEC2を立てても、外部と通信することができません。そのため、作成したVPCにインターネットゲートウェイをアタッチします。
インターネットゲートウェイとはVPC内のサブネットが外部と通信するのに必要なコンポーネントとのことを指します。

「インターネットゲートウェイの作成」を押下します。

![スクリーンショット 2021-02-08 22.15.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/e80f385b-4bd1-7287-5f94-4929f38d5f6d.jpeg)

下記項目を設定します。

- 名前 : 任意の名前

![スクリーンショット 2021-02-08 22.17.14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/094b5924-3809-8455-b734-e3a058717b9a.jpeg)


「インターネットゲートウェイの作成」を押下します。


続いて、作成したインターネットゲートウェイをVPCにアタッチします。
作成したインターネットゲートウェイを選択し、右上の「アクション」から「VPCにアタッチ」を選択。

![スクリーンショット 2021-02-05 22.23.41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/cb1c0bf6-2d88-3db7-9805-f26cf4358c43.jpeg)


「使用可能なVPC」から作成したVPCを選択し、「インターネットゲートウェイのアタッチ」を選択。

![スクリーンショット 2021-02-05 22.24.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/6dbb6495-c984-fffa-4c53-5a2381e9f96b.jpeg)

これでVPCにインターネットゲートウェイがアタッチされました。

## ルートテーブル
インターネットゲートウェイはアタッチされたVPC内のサブネットのルートテーブルを参照して通信を行いますので、パブリックサブネットのルートテーブルをインターネットゲートウェイに通信するよう設定する必要があります。
ルートテーブルとは、サブネット間通信を制御するコンポーネントです。ルートテーブルにどのIPアドレスがどこに向かって通信するかを設定します。
今回はパブリックサブネットをインターネットに接続できるように設定します。
VPCサービスからサブネット、パブリックサブネットを選択します。
「ルートテーブル」タブから「ルートテーブル」の横にあるリンクを押下します。

![スクリーンショット 2021-02-05 22.25.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/a1b1d697-e0c1-faba-8298-e3eab43d3c9f.jpeg)

下の方に「ルート」タブがありますので選択肢、「ルートの編集」を押下します。

![スクリーンショット 2021-02-05 22.25.51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/4336845f-7d0e-6c2f-e52f-e1152f2d2930.jpeg)


下記項目を設定します。

- 送信先 : 0.0.0./0
- ターゲット : 作成したインターネットゲートウェイを選択

![スクリーンショット 2021-02-05 22.26.34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/0f0a0d59-6217-f61f-4cfd-2c35723b37b6.jpeg)

「ルートの保存」を押下します。

これでサブネットの通信がインターネットゲートウェイに行くようになりました。
ただし、このままですと、プライベートサブネットも同じルートテーブルが適用されてしまいますので、新しいルートテーブルを作成します。

まずはルートテーブルサービスから「ルートテーブルの作成」を押下。
![スクリーンショット 2021-02-08 22.30.36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/fb9b86e6-a2fc-9841-600d-9d7faba2e0c1.jpeg)


下記項目を設定

- 名前タグ : private-route-table（任意の名前） 
- VPC : 作成したVPCを選択


![スクリーンショット 2021-02-08 22.32.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/c11fd505-5f71-ba07-159f-307c2543dec5.jpeg)

「作成」を押下します。

プライベートサブネットのルートテーブルですが、ルートテーブルの一覧から選択し、「サブネットの関連付け」タブから「サブネットの関連付けの編集」を押下します。
![スクリーンショット 2021-02-08 22.37.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/f2eb5ef7-8b04-444f-42a0-550f394e2f59.jpeg)


そして、プライベートサブネットを選択して、「保存」を押下すれば、プライベートサブネット用のルートテーブルが更新されます。

## EC2
それでは、いよいよEC2の作成に入って行きます。
EC2とはAWSが提供している仮想サーバーで、かなり豊富な種類から、簡単にサーバーを作成することができます。

EC2サービスから「インスタンスを起動」を押下。
![スクリーンショット 2021-02-05 22.28.19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/1cfc5aa4-812c-5566-ebf0-71237cfc096f.jpeg)


色々種類がありますが、今回は「Amazon Linux2」を選択します。

![スクリーンショット 2021-02-05 22.29.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/5a6b0086-fef3-9c54-6f89-2d22eefe3d68.jpeg)


インスタンスの種類も豊富にありますが、無料枠で利用できる「t2.micro」を選択。

![スクリーンショット 2021-02-05 22.29.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/cff832a1-eda5-886b-b2e2-bcdd88f59acc.jpeg)


次に、下記項目を設定します。

- ネットワーク : 作成したVPCを選択
- サブネット : 作成したパブリックサブネットを選択
- 自動割り当てパブリックIP : 有効を選択

![スクリーンショット 2021-02-05 22.29.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/9c4f0a85-60a9-3f33-a8f2-66f14ec02cd3.jpeg)


他はデフォルトでOKですので、「次のステップ:ストレージの追加」を押下します。

ストレージはデフォルトでOKですので、「次のステップ:タグの追加」を押下します。

![スクリーンショット 2021-02-05 22.30.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/985bf693-53fa-6352-e07a-ec8532e8fe7d.jpeg)


タグの追加は任意ですが、今回は下記のように設定します。

- キー : Name
- 値 : public-ec2-0

![スクリーンショット 2021-02-05 22.30.50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/ac80f9c6-8191-df56-dc9c-ab7c359f0ad8.jpeg)


「次のステップ:セキュリティグループの設定」を押下。

セキュリティーグループとは、EC2用のファイアーウォールのようなものです。

下記項目を設定します。

- 新しいセキュリティグループを作成を選択
- タイプ : SSH
- プロトコル : TCP 
- ポート範囲 : 22 
- ソース : 現在使用しているグローバルIPアドレス
- 説明 : 任意(空欄でもOKです。)

![スクリーンショット 2021-02-05 22.31.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/a41aea04-7aac-1e81-7d38-d5e10f59c8e1.jpeg)


「ソース」については、0.0.0.0/0(全てのIPからssh接続可)でもOKですが、自信のPCが利用しているグルーバルIPアドレスを設定することで、セキュリティを高めることができます。

「確認と作成」を押下し、遷移先の画面で問題なければ「起動」を押下します。

キーペアについては、今回は既存のキーペアを選択し、「インスタンスの作成」を押下します。（新しいキーペアを作成する場合、この画面でしかダウンロードすることができないので、忘れずにダウンロードしましょう）

![スクリーンショット 2021-02-05 22.32.35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/eebfe162-9e9f-bd67-b3f8-ef88cb1ec3d5.jpeg)


インスタンスの状態が、「実行中」、ステータスチェックが「2/2のチェックに合格しました」になるまで待ちます。

![スクリーンショット 2021-02-05 22.35.47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/0b665b7f-63cd-e118-c162-942e352448e6.jpeg)


## ssh接続
それでは、作成したEC2にsshでログインしてみましょう。
今回はパブリックサブネットに配置されているEC2にログインするため、踏み台サーバーへの接続ということとなります。

sshコマンドは下記通りです。

```
chmod 400 <key_path> #コマンドの説明は割愛しますが、先にkeyの権限設定を行っています。

ssh -i <key_path> <user_name@public_IPaddress>
```
user_nameについては、EC2の場合デフォルトですと、「ec2-user」になっているはずです。public_IPaddressについては、配置したEC2インスタンスの詳細に「パブリックIPアドレス」というものがあるので、それをコピーしてください。

![スクリーンショット 2021-02-05 22.38.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/adb5b2b2-fea2-f3ad-eb22-58378dbf53f2.jpeg)


無事ログインできました。

念の為、ちゃんとインターネットに繋がるか確認しましょう。

今回は適当にyumのsearchコマンドを試してみます。

![スクリーンショット 2021-02-05 22.38.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/f3e17efa-3ce8-1b54-1993-6faa40ef5e8c.jpeg)

ネットワークへの接続が確認できました。

続いて、プライベートサブネットにも作業サーバーを配置しましょう。

作成方法は踏み台サーバーとほとんど一緒ですが、一部作成方法が変更となりますので、下記にまとめます。

- サブネット : プライベートサブネットを選択
- セキュリティグループのソース : 踏み台サーバーのプライベートIPアドレスを設定

※今回はIPアドレスを設定していますが、インスタンスが再起動したりすると毎回IPが変わってしまうのため、踏み台サーバーのセキュリティーグループを選択すると良いそうです!

![スクリーンショット 2021-02-05 22.42.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/2335e35f-6885-72fd-ae0d-541f29af7f29.jpeg)


これで、作業サーバーに接続するためには、踏み台サーバーを経由しなければならくなります。

それでは、今度は作業サーバーにsshコマンドでログインしてみましょう。

踏み台サーバーから一旦ログアウトし、キーペアを踏み台サーバーに送信します。
送信にはscpコマンドを利用します。

```
scp -i <key_path> <key_path> <user_name@public_IPaddress:file_path>
```

コマンドの詳細については、割愛させて頂きますが、file_pathは送信ファイルを送信先のどの場所に置くかを入力します。特に理由がなければ、「/tmp」とか「~/.ssh/」配下でいいと思います。

ファイルを送りましたら、再び踏み台サーバーにログインします。その後、作業サーバーにssh接続します。
接続コマンドは下記の通りです。
![スクリーンショット 2021-02-05 22.52.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/acf74510-eef3-266d-2411-8f3f4598e4d0.jpeg)


```
# 踏み台サーバーにて下記を入力
ssh -i <key_path> <user_name@private_IPaddress>
```

踏み台サーバーの時とは違い、IPアドレスには踏み台サーバーのプライベートIPアドレスを入力します。

![スクリーンショット 2021-02-05 22.54.09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/7cf67b67-65a7-c844-ed2f-420b1ff47f97.jpeg)


無事ログインできました。

しかしこのままですと、アウトバウンドも、インバウンドも通信ができません。試しに、searchコマンドを叩きますが、通信ができないことが確認できます。

![スクリーンショット 2021-02-05 22.55.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/233020ee-35a0-608e-4704-0599168512ea.jpeg)


アウトバウンド通信は行いたいため、パブリックサブネットにNATゲートウェイを作成します。

## NATゲートウェイ
NATゲートウェイとは、プライベートサブネットがアウトバウンド通信（内部から外部への通信）を行うために配置します。なお、外部から内部への通信は許可されませんが、リクエストした通信に対してのレスポンスはちゃんと返ってきます。

VPCサービスの「NATゲートウェイ」を選択。

「NATゲートウェイを作成」を押下。
![スクリーンショット 2021-02-05 22.57.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/3b81bc36-08b7-2137-3b50-1dbdc58ed791.jpeg)


下記項目を設定

- 名前-オプション : 任意の名前
- サブネット : パブリックサブネットを選択(こちらをプライベートサブネットに配置してしまうと、通信ができないので注意してください！)
- Elastic IPの割り当て ID : 既に作成済のものがなければ、下にある「Elastic IPの割り当て」を押下

![スクリーンショット 2021-02-05 22.59.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/2cd22561-6970-31cd-d02e-7891537e1dc2.jpeg)


「NATゲートウェイを作成」を押下します。

これでNATゲートウェイが作成されました。

次にプライベートサブネットのルートテーブルにNATゲートウェイを追加します。

追加方法は、パブリックサブネットのルートテーブルを編集した方法と同じです。
0.0.0.0/0のターゲットを作成したNATゲートウェイに設定します。

![スクリーンショット 2021-02-05 23.02.52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/67497aae-1981-a875-1d47-7b5726d3021c.jpeg)


これで、作業サーバーも通信できるはずです。

searchコマンドを試してみましょう

![スクリーンショット 2021-02-05 23.03.32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362856/53b4540d-a81f-abec-c4ac-f0bd86e3d573.jpeg)

無事通信することができました。

## まとめ
現在の現場では、 私の権限の制限によりEC2などを立てることができませんが、今回の記事をまとめてみて、利用しているシステムの全体像がより理解することができました。何より、こんな簡単に自分でもサーバーが作れるのか!という体験が本当に楽しかったです！

初めて画像付きの記事を投稿してみましたが、後から「あのスクショ撮り忘れた...」とか「小さくてみづらい」など、色々と問題点が見つかり、「読みやすい記事を書く」という点でも非常に勉強になりました。色々見辛い点はあると思いますが、ご容赦頂ければ幸いです。

## これからAWSを学習する人たちへ
今回の記事は、「AWSCloudTech」で体験したことを記事にしました。
正直、これからAWSを本格的に勉強したいと思ってる方は、これ一択だと思っております。コスパも内容も素晴らしいので、ぜひ参加してみてください。

https://aws-cloud-tech.com/