【AWS】作って学ぶインフラ構築１

# はじめに
こんにちは、愛知でWEBエンジニアをしているkokuboと申します。

実務でサーバー業務を始めてから約1年。
今回は基礎的な部分を改めて学習したことをアウトプットも兼ねて紹介させていただきます。

実務で手を動かしながら学んだこの1年はかなり充実した1年でした。
是非とも一緒にインフラを構築しながら読んでいただけると幸いです。

# 概要
**【目標】**
　AWS内に公開サーバーと非公開のサーバーを作成し、外部から公開サーバーを介して非公開サーバーにアクセスする。

- 実際の業務での使用例
  - DBサーバー（非公開）に踏み台サーバー（公開）からアクセスを行う

 　
**【学べること】**
- AWSの基本的な構造が学習できる
  - インターネットからサーバー到達までの一連の流れ
- ネットワークの基礎知識
- 安全に作業を行うための基礎知識

　
**【ネットワーク構成】**
![スクリーンショット 2024-09-01 15.48.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033765/69b18619-3ae5-711b-b7c8-8bfc26263c74.png)
![uploading...0]()


　
**【今回参考にした資料】**
　以下の書籍を参考にしました、この書籍は私がサーバーを担当する前にサーバーエンジニアの先輩たちがおすすめしてくれたもので、非常に丁寧で分かりやすくAWSを触り始めるのにはピッタリな書籍だと思います。
 
<img width="50%" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033765/92ab0607-9a13-2969-8d83-c13c7bfec7d9.png">

# 出てくる用語を簡単に
※AWSでは略された用語がよく出てくるので、英語に展開すると意味が理解しやすいと思います。

- IAM（Identity and Access Management）
  - AWSリソースへのアクセスを管理するためのサービス
- VPC（Virtual Private Cloud）
  - AWS上に作成できる自分専用のネットワーク
- アベイラビリティーゾーン（AZ）
  - どの地域にネットワークを設置するか
  - 耐障害体制を高めるために分離して設置する
- サブネット
  - VPCのIPアドレス範囲を分割する単位
  →公開用と非公開用でIPアドレスを分割
  - この中にサーバーを設置する
- インターネットゲートウェイ（IGW）
  - VPCとインターネットを繋ぐ入り口
- NATゲートウェイ
  - パブリックサブネットとプライベートサブネットを繋ぐ入り口
- ルートテーブル
  - どの入り口(ゲートウェイ)を通るかを指定する
- セキュリティーグループ
  - 入り口と向き先をIPアドレスで制限する
- EC2（Elastic Compute Cloud）
  - 手軽に使用できる仮装サーバーサービス

# 手順１：安全に作業するために
**※初心者の方は必ず設定をお願いします**
1. ルートユーザーのアクセスキーの削除・MFAの有効化
→どちらもIAMの「セキュリティ認証情報」から設定を行えます
　MFAは「[Google Authenticator](https://apps.apple.com/jp/app/google-authenticator/id388497605)」などで登録をしてください
1. IAMユーザーの作成
　・ユーザー、ユーザーグループを作成
　・グループに「PowerUserAccess」ポリシーを追加
　・ユーザーにグループを紐づける
1. IAMユーザーでログインをして準備完了

　
【**注意点**】
　仮にメール、PASS、アクセスキーの流失により不正利用された場合、サーバーを山ほど作成されるなどで**1000万円規模**の請求が来た事例があります。よって、以下の項目は特に注意をお願いします。
ーーーーーーーーーーーーーーーーーーーーーーーー
・パスワードは複雑なものを使用する
　→パスワードポリシーを設定するのが良い
・使用していなくても定期的なパスワードの変更を行う
・IAMユーザーを使用する（ルートは何でもできてしまう）
・ルートとIAMに多要素認証 (MFA)の設定
・絶対にメール、PASS、アクセスキーを公開しない（Git気を付ける）
ーーーーーーーーーーーーーーーーーーーーーーーー

# 手順２：VPCの作成
VPCの画面から「VPCを作成」を押下し、以下の項目を入力する
<table>
  <thead>
    <tr>
      <th>項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td> 作成するリソース </td> <td>VPCのみ</td>
  </tr>
  <tr>
    <td> 名前タグ </td> <td>vpc-study</td>
  </tr>
  <tr>
    <td>IPv4 CIDR ブロック</td> <td>「IPv4 CIDR の手動入力」にチェック</td>
  </tr>
  <tr>
    <td> IPv4 CIDR</td> <td>10.0.0.0/16</td>
  </tr>
  <tr>
    <td>IPv6 CIDR ブロック</td> <td>なし</td>
  </tr>
  <tr>
    <td> テナンシー </td> <td>デフォルト</td>
  </tr>
</table>

【備考】
- タグ
  - 検索がしやすくなる。分かりやすい名前や、プロジェクトごとでタグを使用すると後々便利
- IPv4 CIDR
  - 設定できるIPアドレスの範囲、今回は詳しく書きません

# 手順３：サブネットの作成（公開・非公開）
VPC→サブネットの画面から「サブネットを作成」を押下し、以下の内容を入力する
<table>
  <thead>
    <tr>
      <th>サブネット種類</th> <th>項目</th> <th>入力値　</th>
    </tr>
  </thead>
  <tr>
    <td rowspan = "5"> 公開サブネット </td> <td> VPC ID </td> <td>作成したVPC<br>(vpc-study)</td>
  </tr>
  <tr>
    <td> サブネット名 </td> <td>public-subnet-study</td>
  </tr>
  <tr>
    <td> アベイラビリティーゾーン </td> <td>ap-northeast-1a（東京）</td>
  </tr>
  <tr>
    <td> IPv4 VPC CIDR ブロック </td> <td>VPCを選択すると入力される</td>
  </tr>
  <tr>
    <td>IPv4 サブネット CIDR ブロック</td> <td>10.0.0.0/20</td>
  </tr>
  <tr>
    <td rowspan = "5"> 非公開サブネット </td> <td> VPC ID </td> <td>作成したVPC<br>(vpc-study)</td>
  </tr>
  <tr>
    <td> サブネット名 </td> <td>private-subnet-study</td>
  </tr>
  <tr>
    <td> アベイラビリティーゾーン </td> <td>ap-northeast-1a（東京）</td>
  </tr>
  <tr>
    <td> IPv4 VPC CIDR ブロック </td> <td>VPCを選択すると入力される</td>
  </tr>
  <tr>
    <td>IPv4 サブネット CIDR ブロック</td> <td>10.0.64.0/20</td>
  </tr>
</table>

【備考】
- IPv4 サブネット CIDR ブロック
  - サブネットの数や、リソースの数が決まる
- 一度CIDRを登録すると後で変更できないので注意が必要


# 手順４：インターネットゲートウェイの作成
1. VPC→インターネットゲートウェイの画面から「インターネットゲートウェイを作成」を押下し、以下の内容を入力する。
1. 作成されたものをVPCにアタッチする

<table>
  <thead>
    <tr>
      <th>項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td> 名前タグ </td> <td>igw-study</td>
  </tr>
</table>

# 手順５：NATゲートウェイの作成
VPC→NATゲートウェイの画面から「NAT ゲートウェイを作成」を押下し、以下の内容を入力する

<table>
  <thead>
    <tr>
      <th>項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td> 名前タグ </td> <td>nat-study</td>
  </tr>
  <tr>
    <td> サブネット </td> <td>公開用で作成したサブネット<br>(public-subnet-study)</td>
  </tr>
  <tr>
    <td> 接続タイプ </td> <td>パブリック</td>
  </tr>
  <tr>
    <td> Elastic IP 割り当て ID </td> <td>「Elastic IP を割り当て」を押下<br>※Elastic IPが自動で作成されます</td>
  </tr>
</table>

【備考】
- 接続タイプの用途
  - パブリック：プライベートサブネット内のリソースがインターネットにアクセスする必要がある場合に使用
  - プライベート：他のVPCやオンプレミスのネットワークと通信する必要があり、インターネットアクセスを遮断したい場合に使用

# 手順６：ルートテーブルの作成・編集（公開、非公開）

### 1. ルートテーブルの作成
VPC→ルートテーブルの画面から「ルートテーブルを作成」を押下し、以下の内容を入力する

<table>
  <thead>
    <tr>
      <th> 種類</th> <th> 項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td rowspan = "2"> 公開ルートテーブル </td><td> 名前タグ </td> <td>public-rute-study</td>
  </tr>
  <tr>
    <td> VPC </td> <td>作成したVPC<br>(vpc-study)</td>
  </tr>
  <tr>
    <td rowspan = "2"> 非公開ルートテーブル </td><td> 名前タグ </td> <td>private-rute-study</td>
  </tr>
  <tr>
    <td> VPC </td> <td>作成したVPC<br>(vpc-study)</td>
  </tr>
</table>

### 2. ルートテーブルの編集
作成したルートから「ルート・サブネットの関連付け」から以下の内容で編集をする

#### 「ルート」の編集
<table>
  <thead>
    <tr>
      <th> 種類</th> <th> 項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td rowspan = "2"> 公開ルートテーブル<br>(public-rute-study) </td><td> 送信先１ </td> <td>送信先：10.0.0.0/16<br>ターゲット：ローカル</td>
  </tr>
  <tr>
    <td> 送信先２ </td> <td>送信先：10.0.0.0/0<br>ターゲット：インターネットゲートウェイ<br>igw-：作成したインターネットゲートウェイID</td>
  </tr>
  <tr>
    <td rowspan = "2"> 非公開ルートテーブル<br>(private-rute-study) </td><td> 送信先１ </td> <td>送信先：10.0.0.0/16<br>ターゲット：ローカル</td>
  </tr>
  <tr>
    <td> 送信先２ </td> <td>送信先：10.0.0.0/0<br>ターゲット：NAT ゲートウェイ<br>nat-：作成したNAT ゲートウェイID</td>
  </tr>
</table>

#### 「サブネットの関連付け」の編集
「明示的なサブネットの関連付け」の編集をする
<table>
  <thead>
    <tr>
      <th> 種類</th> <th> 項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td rowspan = "1"> 公開ルートテーブル<br>(public-rute-study) </td><td> 選択サブネット </td> <td>作成した公開サブネット<br>(public-subnet-study)</td>
  </tr>
  <tr>
    <td rowspan = "1"> 非公開ルートテーブル<br>(private-rute-study) </td><td> 選択サブネット </td> <td>作成した非公開サブネット<br>(private-subnet-study)</td>
  </tr>
</table>

# 手順7：セキュリティーグループの作成
EC2→セキュリティーグループの画面から「セキュリティグループを作成」を押下し、以下の内容を入力する

<table>
  <thead>
    <tr>
      <th> 項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td> 名前 </td> <td>bastion-sg</td>
  </tr>
  <tr>
    <td> 説明 </td> <td>bastion-sg</td>
  </tr>
  <tr>
    <td> VPC </td> <td>作成したVPC</td>
  </tr>
  <tr>
    <td> ルール </td> <td>・インバウンドルール<br>　タイプ：SSH<br>　ソース：0.0.0.0/0<br><br>・アウトバウンドルール<br>　デフォルト設定</td>
  </tr>
</table>

【インバウンドルールについて】
- Wi-Fiを使用している時など、IPアドレスが固定の場合は以下の設定の方がセキュアです
  - タイプ：マイIP
  - ソース：「マイIP」を選択すると自動でIPアドレスを入力してくれます。

# 手順8：SSHキーの作成
１. EC2→キーペアの画面から「キーペアを作成」を押下し、以下の内容を入力する
<table>
  <thead>
    <tr>
      <th>項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td> 名前タグ </td> <td>bastion-ssh-key</td>
  </tr>
  <tr>
    <td> キーペアのタイプ </td> <td>RSA</td>
  </tr>
  <tr>
    <td> プライベートキーファイル形式 </td> <td>.pem</td>
  </tr>
</table>

２. ダウンロードしたpemファイルは、PCの.ssh/以下に保存する
３. pemファイルの権限をchmod等で600に変更する
```js:
cd ~/.ssh
chmod 600 bastion-ssh-key.pem
```
　
【注意】
作成したキーの情報は外部に公開しないように注意する

# 手順９：踏み台サーバーの作成
EC2の画面から「インスタンスを起動する」を押下し、以下の内容を入力する

<table>
  <thead>
    <tr>
      <th>項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td> 名前タグ </td> <td>bastion-ec2</td>
  </tr>
  <tr>
    <td> OS </td> <td>Amazon Linux2 AMI</td>
  </tr>
  <tr>
    <td> インスタンスタイプ </td> <td>t2.micro</td>
  </tr>
  <tr>
    <td> キーペア </td> <td>作成したキーぺア</td>
  </tr>
  <tr>
    <td> VPC </td> <td>作成されたVPC<br>※最初はデフォルトのVPCが選択されています</td>
  </tr>
  <tr>
    <td> サブネット </td> <td>public-subnet-study</td>
  </tr>
  <tr>
    <td> パブリックの自動割り当て </td> <td>有効</td>
  </tr>
  <tr>
    <td> ファイアウォール<br> (セキュリティグループ) </td> <td>bastion-sg、デフォルト</td>
  </tr>
  <tr>
    <td> ストレージ </td> <td>デフォルト設定</td>
  </tr>
</table>

# 手順１０：Webサーバーの作成
踏み台サーバーと同じようにWebサーバーを作成する

<table>
  <thead>
    <tr>
      <th>項目</th> <th>入力値　　　　　　</th>
    </tr>
  </thead>
  <tr>
    <td> 名前タグ </td> <td>web-ec2</td>
  </tr>
  <tr>
    <td> OS </td> <td>Amazon Linux2 AMI</td>
  </tr>
  <tr>
    <td> インスタンスタイプ </td> <td>t2.micro</td>
  </tr>
  <tr>
    <td> キーペア </td> <td>作成したキーぺア</td>
  </tr>
  <tr>
    <td> VPC </td> <td>作成されたVPC<br>※最初はデフォルトのVPCが選択されています</td>
  </tr>
  <tr>
    <td> サブネット </td> <td>private-subnet-study</td>
  </tr>
  <tr>
    <td> パブリックの自動割り当て </td> <td>無効</td>
  </tr>
  <tr>
    <td> ファイアウォール<br> (セキュリティグループ) </td> <td>デフォルト</td>
  </tr>
  <tr>
    <td> ストレージ </td> <td>デフォルト設定</td>
  </tr>
</table>

# 手順１１：接続確認
　これでサーバーの構築は全て完了しました。あとは実際に踏み台サーバーを経由してWebサーバーにアクセスできるかどうかを確認してみましょう！
　
**【準備】**
　`.ssh/config`を作成して以下の内容を入力する
 　→ProxyCommandで経由するサーバーを選択できます
```js:
cd ~/.ssh
mkdir config

# 以下を入力
Host bastion
    HostName 踏み台サーバーのパブリックIPアドレス
    User ec2-user
    IdentityFile ~/.ssh/bastion-ssh-key.pem
    ForwardAgent yes

Host webserver
    HostName webサーバーのプライベートIPアドレス
    User ec2-user
    IdentityFile ~/.ssh/bastion-ssh-key.pem
    ProxyJump bastion
```
　
**【アクセス】**
 以下のコマンドを実行してWebサーバーにアクセスできることを確認する
```js:
ssh webserver
```

# 最後に
ここまで読んでいただきありがとございました！

今回はAWSでよくある構成を簡単に紹介させていただきました。
次回はロードバランサーやRoute53、S3などより実戦に近い環境構築を紹介させていただこうと思います。

また、今回作成していただいた環境についてですが、EC2を停止していたとしても時間が経つにつれ料金がかかってしまう場合があります。

必要がなければ削除をしましょう、AWSでは **「削除」** ボタンを押しただけでは削除できず、ある程度サービス同士の繋がりの解除をしなければなりません。今回の復習や新たな発見にも繋がりますのでぜひやってみてください！