VPCを学ぶ - つながってないサーバ

# 孤立したサーバ

## 概要

まずはインターネットにつながっておらず、ネットワークスイッチにつながっているだけという構成を再現してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50220/7ec879b8-2560-4775-93b2-81c023a8e739.png)



つまるところ、自宅にサーバを買ってきて、LANケーブルとネットワークスイッチを1:1で配線し電源を入れただけ。といった状態を体験したい。

## 設定の独自解釈のER図

VPCはサブネットを複数持つ。
EC2はサブネットを指定する。

```mermaid
---
title: VPC-Subnet-EC2
---
erDiagram
    VPC ||--|{ Subnet : hasMany
    EC2 ||--|| Subnet : hasOne

```


## 目標

どこからもつながらないサーバなので、どこからも操作できないはず。


# 以下手順

# VPC

VPCは Virtual Private Cloudの略で、EC2はこれのうちのどこかに所属することになっている。

なので、VPCをまずは作るが、できるだけ何もないVPCを作る


## できるだけ何もないVPCを作成

### 作成画面を出す

1. VPCダッシュボードへ行く
    1. ダッシュボードからサービスを検索「VPC」
1. 左のメニューから「お使いのVPC」
1. 右上の「VPCを作成」ボタンを押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50220/1f40ecba-9fa1-48c1-99a7-54e893d5638e.png)

### パラメータ入力

**作成するリソース**

あえて「VPCのみ」

**名前タグ**

わかりにくいとツライのでとかにしておく

`learning-{{年月日}}-{{名前}}`

実例) `learning-250417-kato`

**IPv4 CIDR ブロック**

「IPv4 CIDRの手動入力」を選ぶ

**IPv4 CIDR**

`10.0.0.0/16` とする

**IPv6 CIDRブロック**

ちょっといったんv6は考えないんで `IPv6 CIDR ブロックなし`

**テナンシー**

「デフォルト」

**タグ**

操作なし

### 作成

プレビューコードはオススメ

```
aws ec2 create-vpc --instance-tenancy "default" --cidr-block "10.0.0.0/16" --tag-specifications '{"resourceType":"vpc","tags":[{"key":"Name","value":"learning-20250417"}]}' 
```

確認したら、「VPCを作成」ボタンを押す。
デフォルトだと 5VPC/regionなので、割とすぐ上限がくるので注意。

# サブネットの作成

作成したVPCの中に、スイッチングハブを設置した感じで作成する。

サーバー(EC2)を作成する際、どのスイッチングハブに接続するかを指定するのが必須なので、ここで作っておかねばならない。

### 作成画面を出す

1. VPCダッシュボードへ行く
    1. ダッシュボードからサービスを検索「VPC」
1. 左のメニューから「サブネット」
1. 右上の「サブネットを作成」ボタンを押す

### パラメータ

**VPC ID**
先ほど作ったものを指定する。
例) `learning-250417-kato`

**サブネットの設定**

**サブネット名**

先ほどのに所属してるのがわかるようにしておく

例) `learning-250417-subnet1`

**アベイラビリティーゾーン**

ここでAZを指定できる。
「指定なし」だと、自動になるらしい。
いったん「指定なし」としておく

**IPv4 VPC CIDR ブロック & IPv4 サブネット CIDR ブロック**

VPC作成時に指定した `10.0.0.0/16` が表示されているが、これより狭いブロックを指定する必要がある。

`10.0.0.0/16` (同じ値) とする

**サブネットを作成**

サブネットを作成ボタンを最後に押す


# EC2

## できるだけ何もないEC2を作成

### 作成画面を出す

1. EC2ダッシュボードへ行く
    1. ダッシュボードからサービスを検索「EC2」
1. 左のメニューから「インスタンス」
1. 黄色の「インスタンスを起動」ボタンを押す

### パラメータ入力

**名前とタグ**

`learning-ec2-{{日付}}` とでもしておく
例) `learning-ec2-25-417`

**アプリケーションおよびOSイメージ**

デフォルトの「Amazon Linux 2023 AMI」でOK

アーキテクチャなどなどもそのまま。

**インスタンスタイプ**

デフォルトの `t2.micro` でOK。

**キーペア(ログイン)**

「キーペアなしで続行(推奨されません)」を選択してもいいが、「新しいキーペアの作成」で作成&ダウンロードしておいてもよい。
（どうせログインできないが、キーを設定してあってもログインできないというのを体験できる）

**ネットワーク設定**

右の「編集」ボタンをクリックして設定する。以下、クリックすることででてくるメニューにおいて操作する。

**VPC**

ここでさっき作成したVPCを選択する。
例) `learning-20250417`

**サブネット**

さきほど作成したものが入っていることを確認する

`learning-250417-subnet1` となっているはず

**パブリックIPの自動割り当て**

インターネットにつながってない孤立したものを作ってみたいので、ここでは「無効化」を選択

**ファイアウォール (セキュリティグループ)**

これはL4で指定できる。どこからもつながらない予定だが、一応「どこからでもsshはできる」という設定にしておく。(= デフォルト)

**セキュリティグループ名**

`learning-launch-wizard-{?}` とする

**説明**

デフォルトでOK

**インバウンドセキュリティグループのルール**

デフォルトでOK

**高度なネットワーク設定**

とりあえずここでは開かない。もしかしたらここで厳密に指定できるのかも。

**ストレージを設定**

デフォルトでよい。

**高度な詳細**

開かない

**概要**

インスタンス数は1でよい。他、上で入力したパラメータが表示されていることを確認する。

### 作成

「プレビューコード」を押してコマンドをみておくとよい

```
aws ec2 create-security-group --group-name "launch-wizard-5" --description "launch-wizard-5 created 2025-04-22T08:37:55.027Z" --vpc-id "vpc-0xxxxxxxx" 
aws ec2 authorize-security-group-ingress --group-id "sg-preview-1" --ip-permissions '{"IpProtocol":"tcp","FromPort":22,"ToPort":22,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]}' 
aws ec2 run-instances --image-id "ami-0e449927258d45bc4" --instance-type "t2.micro" --block-device-mappings '{"DeviceName":"/dev/xvda","Ebs":{"Encrypted":false,"DeleteOnTermination":true,"Iops":3000,"SnapshotId":"snap-0c458689b862e29ba","VolumeSize":8,"VolumeType":"gp3","Throughput":125}}' --network-interfaces '{"SubnetId":"subnet-0e97da846f5d737ed","AssociatePublicIpAddress":false,"DeviceIndex":0,"Groups":["sg-preview-1"]}' --credit-specification '{"CpuCredits":"standard"}' --tag-specifications '{"ResourceType":"instance","Tags":[{"Key":"Name","Value":"learning-ec2-25-417"}]}' --metadata-options '{"HttpEndpoint":"enabled","HttpPutResponseHopLimit":2,"HttpTokens":"required"}' --private-dns-name-options '{"HostnameType":"ip-name","EnableResourceNameDnsARecord":false,"EnableResourceNameDnsAAAARecord":false}' --count "1" 
```

「インスタンスを起動」ボタンを押して作成

# 確認

1. EC2ダッシュボードへ行く
    1. ダッシュボードからサービスを検索「EC2」
1. 左のメニューから「インスタンス」
1. `learning-ec2-{{日付}}` を選択する

プライベート IPv4アドレスあれど、パブリックIPv4 DNSやElastic IPアドレスが空っぽなのを確認できる。

これはつまりどこにもつながってないということ、、、なはず。

「接続」ボタンをクリックして、接続を試みる。

## 『EC2 Instance Connect』 タブ

以下のような警告がでて、接続できない。

> パブリック IPv4 または IPv6 アドレスが割り当てられていません
パブリック IPv4 または IPv6 アドレスがない場合は、EC2 Instance Connect を使用できません。あるいは、次を使用して接続を試みることができます。 EC2 Instance Connect エンドポイント 。

と

> インスタンスはパブリックサブネットにありません
関連付けられたサブネット subnet-0xxxxxd (learning-250417-subnet1)  はパブリックサブネットではありません。
EC2 Instance Connect を使用するには、インスタンスがパブリックサブネット内にある必要があります。 サブネットをパブリックサブネットにするには、サブネットルートテーブル内のルートをインターネットゲートウェイに追加します。 

## 『セッションマネージャー』タブ

これはそもそも設定してないのでどうにもならない。

## 『SSH クライアント』タブ

キーペアが設定されていなければ、SSH経由では接続できません

と表記されている。

インスタンスIDとプライベートIP アドレス( `10.0.185.242` など)で接続方法の手順が記載されているが、VPC内のこのアドレスに接続する方法はない。

## 『EC2 シリアルコンソール』タブ

これがサポートされてれば、無理矢理みることはできたかもしれないが、今回のEC2タイプは対応していないので用いることはできない。