AWS Hands-on for Beginners を理解しながら進めてみた #1


<br></br>
### #1 [AWS上にセキュアなプライベートネットワーク空間を作成する](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Network1-2022-reg-event.html?trk=aws_introduction_page "ハンズオン公式サイト")

# 背景

久しぶりの投稿になります。
現在、都内の金融系SI企業でインターンをさせて頂いており、大変ありがたいことに[AWSハンズオン](https://aws.amazon.com/jp/events/aws-event-resource/hands-on/"ハンズオン公式サイト")を自由に進められる検証環境を用意していただきました。
以前、個人開発をした際には無料利用枠にこだわり、サービスの想定外の課金におびえながらインフラ構築をすすめていたのですが、今は好奇心の赴くままにサービスを触れており、とても恵まれていると日々、感じております。

# 本題

最初のハンズオンとして、「[AWS Hands-on for Beginners - Network編#1 AWS上にセキュアなプライベートネットワーク空間を作成する](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Network1-2022-reg-event.html?trk=aws_introduction_page "ハンズオン公式サイト")」を進めていきました。

ハンズオンでは、最初にハンズオンのゴールの全体像について大まかに説明し、その後は具体的にAWSマネジメントコンソール上での操作が説明されます。ハンズオンに従って手を動かしていけば、あっという間に目的のシステムができてしまいます(汗)
ハンズオン自体はYoutube動画なので、個人でも登録をすれば視聴可能です。
~~もっと早く知りたかった！~~

以下が、今回のハンズオンの全体像になります。
##### ネットワーク構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850329/9a5fbf3b-6f7c-9924-ddac-61c171b8ba6d.png)
##### ルートテーブル一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850329/52cca0e8-8204-fb54-5d94-c776ac0d2bb8.png)
本ハンズオンの最終形： ① + ②'' + ③
・Public Route Table：Public subnet に適用したルートテーブル
・Private Route Table：Private subnet に適用したルートテーブル
・VPC Endpointsでは、ルートテーブルに①, ②''の両方を指定したため、実質的に③のルートテーブルに等しい
##### セキュリティグループ一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850329/514badf8-7b3d-2ef8-ea35-449e0a87fdd6.png)

次に、大まかな手順について説明します。

1. VPCを作成する
1. IGWをVPCにアタッチする
1. サブネットを作成する
1. Private, Publicな設定のルートテーブルを作成する
1. 作成したルートテーブルを適切なサブネットに割り当てる
1. パブリックサブネットにEC2(Webサーバ)を立てる
1. WebブラウザからサーバーへHTTPリクエストし、ページを確認
1. SSMの許可を付与したIAMロールを作成
1. SSMの設定を行い、適切なエンドポイントをパブリックサブネットに設定
1. プライベートサブネットにEC2を立てる
1. NAT Gateway のエントリをプライベートサブネットのルートテーブルに加え、SSMに接続
1. NAT Gateway のエントリを削除
1. PrivateLinksのインターフェイスをパブリックサブネットに設定し、SSMに接続
1. S3を立て、プライベートサブネットのEC2のロールにS3へのアクセス権のポリシーを追加
1. Endpointsのエントリをルートテーブルに加え、S3に接続
1. 作成したシステムを全て削除

##### また、EC2はWebサーバとしての挙動を期待するため、以下の設定をしました。

①セキュリティグループ(インバウンド)のプロトコルにTCPを指定
②以下のスクリプトをユーザーデータに記述 (EC2起動時に実行)
```bash
yum -y update
# httpdパッケージをインストール
yum -y install httpd
# httpdのサービスを有効化
systemctl enable httpd.service
# httpdのサービスをスタート
systemctl start httpd.service`
```

ブラウザからのHTTPリクエストで、実行中のWebサーバー(Apache)が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850329/ec37c919-f374-0b1a-7c66-77f91480db47.png)
# まとめ
本ハンズオンでは、**プライベートサブネットに立てたインスタンスからVPC外部のサービス(SSM)にアクセスする手段** が4通り紹介されていました。

* **Internet Gateway 経由でのアクセス**
① NAT Instance：インスタンス単位で管理するNAT(EC2の機能)
② NAT Gateway：複数のインスタンスに適用可能なNAT(VPCの機能) ← (推奨)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850329/16781390-1b57-d34c-45b1-97355e618de0.png)

NAT Instace の場合、以下が相違点です。
(1) NAT-Gatewayの代わりにNATインスタンスを立てて、NATを実現する点
(2) デフォルトゲートウェイのターゲットに NAT Instance の NIC(ENI) を指定する点

<br></br>
* **Internet Gatewayを経由せずにアクセス**
③ Gateway Endpoint
　Gateway型のエンドポイント。2種のサービス(S3, DynamoDB)にのみ対応し、サブネットに紐づけられます。
④ Interface Endpoint
　AWS PrivateLink で利用される。 多くのサービスに対応し、ルートテーブルに紐づけられます。

# その他

ハンズオンの内容は視聴者の理解を深めるための工夫が多いと感じました。
<p>例えば、実行中のEC2サーバーについて、それが置かれたパブリックサブネットに割り当てたルートテーブルを、プライベートルートテーブルに変更するとどうなるか、という実験です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850329/5c91e0f3-ffa8-b203-971c-429844565e57.png)


</p>実際のサービスではこのような実験はできないのでありがたいです。
<p>その他、EC2を誤ったサブネットに建てるというミスをしたが、そのようなケース対応が<a href="https://repost.aws/ja/knowledge-center/move-ec2-instance">公式情報</a>にあったので、手動でAMIを作成して事なきを得ました(冷や汗)。</p>

また、以下の不要なサービスは忘れずに削除しました。
* 誤って作成した停止中のEC2
* 一時バックアップ目的のAMI（課金対象)


[次の記事](https://qiita.com/okigaruni_/items/9a7e13df357cff82f6fe)

# 参考サイト
https://dev.classmethod.jp/articles/aws-vpcendpoint-privatelink-beginner/

※ VPC Endpoint について、理解が不十分な点がございました。上の参考サイトをもとに、記事を一部修正しましたのでご了承ください。

<br>
最後まで記事を読んでくださり、ありがとうございます。もし内容に誤りがございましたら、ご指摘いただけますと幸いです。