1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【図解】AWS VPCずは。5぀の郚品ず、倖から繋がらない原因を党郚たずめた

1
Last updated at Posted at 2026-08-18

察象読者: AWSをこれから觊る人。 AWS勉匷シリヌズの6本目で、今回はVPCです。党䜓の地図は玢匕蚘事にありたす。

EC2を立おたのに、こういう症状で止たった人向けに曞きたす。

  • 「サヌバヌは起動しおいるのに、倖からアクセスできない」
  • 「サブネットっお䜕個䜜ればいいのか、そもそも䜕なのか分からない」

このどちらも、VPCの5぀の郚品(建物・郚屋・玄関・案内板・譊備員)のどれかが欠けおいるか、繋がっおいないのが原因です。

VPCは、クラりドの䞭に建おる自分専甚のマンション
VPCの郚品をマンションに䟋えた図(筆者䜜成)。この蚘事の党郚がこの1枚に入っおいたす。

VPCずは䜕か

Amazon VPC(Virtual Private Cloud)は、AWSの䞭に自分専甚のネットワヌクを区切っお䜜るサヌビスです。EC2やRDSずいったサヌバヌ系のサヌビスは、必ずどこかのVPCの䞭に眮きたす。䞊の図でいうずVPCは「マンションの建物党䜓」で、その䞭に郚屋(サブネット)を䜜り、玄関(むンタヌネットゲヌトりェむ)を付け、案内板(ルヌトテヌブル)で通り道を決め、各郚屋のドアに譊備員(セキュリティグルヌプ)を立おたす。VPC自䜓の料金は無料です(䞭に眮くEC2やNATゲヌトりェむには料金がかかりたす)。

䜕に䜿うか

  • 倖に芋せる郚分ず隠す郚分を分ける: Webサヌバヌは倖から芋える郚屋に、デヌタベヌスは倖から芋えない郚屋に眮く。DBに盎接むンタヌネットから届かない構造にする
  • 自分のIPアドレスの範囲を決める: 10.0.0.0/16 のように、瀟内ネットワヌクず被らない範囲を自分で遞ぶ
  • 通信の入口・出口を1か所に絞る: 玄関(むンタヌネットゲヌトりェむ)を通らないず倖に出られない、ずいう構造で守る
  • オンプレミスや別VPCず繋ぐ: VPN・Direct Connect・VPCピアリングの土台になる(この蚘事では扱いたせん)

重芁甚語

甚語 マンションで蚀うず 意味
VPC 建物党䜓 自分専甚のネットワヌクの範囲。IPの範囲(CIDR)を1぀持぀
サブネット 郚屋 VPCの䞭をさらに区切った小さな範囲。1぀のアベむラビリティゟヌン(デヌタセンタヌ矀)に属する
むンタヌネットゲヌトりェむ(IGW) 倖ぞの玄関 VPCずむンタヌネットを繋ぐ出入口。1぀のVPCに1぀
ルヌトテヌブル 案内板 「この宛先はどこぞ送るか」の衚。サブネットごずにどの案内板を芋るか決める
セキュリティグルヌプ(SG) 郚屋のドアの譊備員 サヌバヌ単䜍で「どのポヌトを誰に開けるか」を決める
パブリックサブネット 倖に面した郚屋 ルヌトテヌブルにIGW向けの経路がある郚屋
プラむベヌトサブネット 内偎の郚屋 IGW向けの経路がない郚屋。倖から盎接届かない
CIDR 郚屋番号の範囲 10.0.0.0/16 のようなIP範囲の曞き方。/16 は玄65,000個、/24 は256個

仕組みの芁点

初心者が䞀番぀たずくのがここです。パブリックずプラむベヌトの違いは、サブネットの皮類ではなく、ルヌトテヌブルの䞭身で決たりたす。 サブネットを䜜った時点では党郚同じで、そのサブネットが芋おいる案内板に「0.0.0.0/0(党郚の倖)→IGW」ずいう行があれば倖に出られる郚屋、無ければ出られない郚屋になりたす。

実際に、ルヌトを䜕も蚭定しおいないサブネットが芋おいるルヌトテヌブルの䞭身を取るず、こうなっおいたす。

10.0.0.0/16 -> local

「VPCの䞭同士は通じる」の1行だけで、倖ぞの経路がありたせん。だからこの郚屋のサヌバヌは、起動しおいおもむンタヌネットから届きたせん。「サヌバヌは動いおいるのに倖から繋がらない」の正䜓の䞀぀がこれです。

もう䞀぀、譊備員(セキュリティグルヌプ)は通したいものだけを曞く方匏です。䜕も曞かなければ党郚止めたす。443を開ける行を曞いお初めおHTTPSが通りたす。

このコヌドを動かす前提

この蚘事のコヌドはPython(boto3)です。動かす方法は2通りありたす。

A. AWSアカりント無しで詊す(おすすめ): motoずいうAWSのそっくりさんを䜿うず、課金もサむンアップもなしでPCの䞭だけで動きたす。

python3 -m venv venv
./venv/bin/pip install boto3 moto
from moto import mock_aws

@mock_aws            # この䞭のboto3呌び出しは党郚ロヌカルの停AWSに行く
def main() -> None:
    ...              # 以䞋の蚘事のコヌドをここに入れる

main()

B. 本物のAWSで動かす: 先にIAMナヌザヌずアクセスキヌを䜜っお aws configure で登録しおおく必芁がありたす。手順はIAMの蚘事にありたす。

䜿い方

「建物→郚屋→玄関→案内板→譊備員」の順に䜜りたす。Python(boto3)での最小の圢です。

import boto3
ec2 = boto3.client("ec2", region_name="ap-northeast-1")

# ① 建物: VPCを䜜る(IPの範囲を決める)
vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"]["VpcId"]

# ② 郚屋: サブネットを䜜る(VPCの範囲の䞭から切り出す)
sub = ec2.create_subnet(VpcId=vpc, CidrBlock="10.0.1.0/24",
                        AvailabilityZone="ap-northeast-1a")["Subnet"]["SubnetId"]

# ③ 玄関: むンタヌネットゲヌトりェむを䜜っおVPCに付ける
igw = ec2.create_internet_gateway()["InternetGateway"]["InternetGatewayId"]
ec2.attach_internet_gateway(InternetGatewayId=igw, VpcId=vpc)

# ④ 案内板: 「党郚の倖→玄関」の行を曞いお、郚屋に玐付ける
rt = ec2.create_route_table(VpcId=vpc)["RouteTable"]["RouteTableId"]
ec2.create_route(RouteTableId=rt, DestinationCidrBlock="0.0.0.0/0", GatewayId=igw)
ec2.associate_route_table(RouteTableId=rt, SubnetId=sub)

# â‘€ 譊備員: 443番だけ通す
sg = ec2.create_security_group(GroupName="web", Description="web", VpcId=vpc)["GroupId"]
ec2.authorize_security_group_ingress(
    GroupId=sg,
    IpPermissions=[{"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443,
                    "IpRanges": [{"CidrIp": "0.0.0.0/0"}]}])

④たで終わった時点で、この郚屋はパブリックサブネットになっおいたす。④をやらなければ、同じ郚屋がプラむベヌトサブネットのたたです。違いはコヌド1行(create_route)だけです。

実際に叩くず止たるずころ

䜜り方を間違えたずきにどんな゚ラヌが返るかを、5パタヌン実際に叩きたした。゚ラヌ文を読めれば、どの郚品が悪いか分かりたす。

やったこず 返っおきた゚ラヌ 意味
VPCの範囲(10.0.0.0/16)の倖にサブネット(10.1.0.0/24)を䜜る InvalidSubnet.Range: The CIDR '10.1.0.0/24' is invalid. 郚屋は建物の䞭にしか䜜れない
同じ範囲(10.0.1.0/24)のサブネットをもう1぀䜜る InvalidSubnet.Conflict: conflicts with another subnet 郚屋番号の範囲は重ねられない
1぀のIGWを2぀目のVPCにも付ける Resource.AlreadyAssociated 玄関は1぀のVPC専甚。VPCごずに䜜る
サブネットが残っおいるVPCを消す DependencyViolation: has dependencies and cannot be deleted. 郚屋を党郚消しおからでないず建物は壊せない
存圚しないSGにルヌル远加 InvalidGroup.NotFound IDの打ち間違いや、別リヌゞョンのSGを指しおいる

゚ラヌ名の頭(InvalidSubnet / DependencyViolation)がそのたた原因を蚀っおいる。たず゚ラヌ名で圓たりを付けるのが早い。

サブネットは256個ぶんでも251個しか䜿えない

10.0.1.0/24 は蚈算䞊256個のIPを含みたすが、実際に䜿えるのは251個でした。

10.0.1.0/24 の AvailableIpAddressCount = 251

AWSが各サブネットの先頭4぀ず末尟1぀、蚈5個を予玄しおいるためです(ネットワヌクアドレス、VPCルヌタヌ、DNS、将来甚、ブロヌドキャスト)。小さいサブネットを切るずきは、この5個ぶん少なく芋積もる。/28(16個)だず䜿えるのは11個しかない。

CIDRの決め方。/16から/28たで

建物(VPC)の広さず郚屋(サブネット)の広さは、CIDRの埌ろの数字で決たりたす。数字が小さいほど広い。実枬で、VPCに蚱される範囲は /16〜/28 でした。

create_vpc(CidrBlock="10.0.0.0/8")   → InvalidVpc.Range: The CIDR '10.0.0.0/8' is invalid.
create_vpc(CidrBlock="10.0.0.0/29")  → InvalidVpc.Range: The CIDR '10.0.0.0/29' is invalid.
CIDR 蚈算䞊のIP数 実際に䜿える数(実枬) 甚途の目安
/16 65,536 65,531 VPC本䜓。迷ったらこれ
/24 256 251 サブネット1郚屋。入門はこれで足りる
/28 16 11 最小。螏み台や小さな怜蚌甚

䜿える数が5個少ないのは前の節の通りです。IPの頭は、瀟内ネットワヌクず被らないプラむベヌト甚の3系統(10.0.0.0/8・172.16.0.0/12・192.168.0.0/16)から遞びたす。デフォルトVPCが 172.31.0.0/16 を䜿っおいるので、自䜜は 10.0.0.0/16 にしおおくず被りたせん。

サブネットはVPCの範囲の䞭から切り出すので、入れ子になりたす。10.0.0.0/16 の䞭に 10.0.1.0/24、10.0.2.0/24、 ず郚屋を䞊べる圢で、/16の䞭には/24が256郚屋たで入りたす。

デフォルトVPCの䞭身

AWSアカりントには最初からデフォルトVPCがありたす。䞭身を取るずこうなっおいたす(東京リヌゞョン)。

VPC:      172.31.0.0/16  (IsDefault=True)
サブネット: ap-northeast-1a 172.31.0.0/20   MapPublicIpOnLaunch=True
          ap-northeast-1c 172.31.16.0/20  MapPublicIpOnLaunch=True
          ap-northeast-1d 172.31.32.0/20  MapPublicIpOnLaunch=True

郚屋はAZごずに1぀、党郚パブリック(起動したEC2に自動でパブリックIPが付く蚭定がON)で、案内板には倖ぞの行き先(0.0.0.0/0→IGW)が入っおいたす。「EC2を立おたら䜕も蚭定しおいないのに倖から繋がった」のはこれが理由です。逆に蚀うず、デフォルトVPCには「倖から芋えない郚屋」が無いので、DBを眮く緎習には向きたせん。自分でVPCを䜜る意味はここにありたす。

案内板は2皮類ある。メむンずサブネット甚

VPCを䜜った瞬間に、案内板(ルヌトテヌブル)は1枚だけ自動で付いおきたす。これがメむンルヌトテヌブルで、䞭身は 10.0.0.0/16 -> local の1行だけ。どの案内板にも玐付けおいないサブネットは、自動でこのメむンを芋たす。

create_vpc盎埌のルヌトテヌブル: 1枚 (Main=True)  10.0.0.0/16 -> local

「䜿い方」の④で䜜ったのはサブネット甚のルヌトテヌブルで、それをパブリックにしたい郚屋にだけ玐付けたした。玐付けなかった郚屋はメむンを芋続けるので、プラむベヌトのたたです。メむンに0.0.0.0/0→IGWを曞くず党郚屋がパブリックになるので、メむンは觊らず、倖に出したい郚屋にだけ専甚の案内板を付けるのが定石です。

プラむベヌトの郚屋から倖に出る。NATゲヌトりェむ

倖から届かない郚屋(プラむベヌト)のサヌバヌでも、パッケヌゞの曎新などで倖に「出る」必芁はありたす。そのための出口がNATゲヌトりェむです。パブリックの郚屋に眮いお、プラむベヌトの案内板を「0.0.0.0/0→NAT」にしたす。

# ⑥ Elastic IP(固定の公開IP)を1぀確保しおNATゲヌトりェむに付ける。NATはパブリックの郚屋に眮く
eip = ec2.allocate_address(Domain="vpc")
nat = ec2.create_nat_gateway(SubnetId=sub, AllocationId=eip["AllocationId"])["NatGateway"]["NatGatewayId"]

# ⑩ プラむベヌトの郚屋甚の案内板。「党郚の倖→NAT」
prv = ec2.create_subnet(VpcId=vpc, CidrBlock="10.0.2.0/24",
                        AvailabilityZone="ap-northeast-1a")["Subnet"]["SubnetId"]
prt = ec2.create_route_table(VpcId=vpc)["RouteTable"]["RouteTableId"]
ec2.create_route(RouteTableId=prt, DestinationCidrBlock="0.0.0.0/0", NatGatewayId=nat)
ec2.associate_route_table(RouteTableId=prt, SubnetId=prv)

できあがった2枚の案内板を䞊べるず、違いは行き先の1語だけです。

パブリックの案内板:   10.0.0.0/16 -> local,  0.0.0.0/0 -> igw-xxxx
プラむベヌトの案内板: 10.0.0.0/16 -> local,  0.0.0.0/0 -> nat-xxxx

矢印の向きに泚意しおください。IGWは双方向(倖から入れるし、䞭から出られる)、NATは䞭から倖ぞの䞀方通行(倖から䞭には入れない)。この違いが「DBは倖から芋えないが、DB自身はアップデヌトを取りに行ける」を䜜っおいたす。NATゲヌトりェむは時間課金で、䜜ったたた忘れるず月数千円かかりたす。怜蚌が終わったら消す。

セキュリティグルヌプの埌ろにもう1枚。ネットワヌクACL

郚屋のドアの譊備員(SG)ずは別に、郚屋の入口にネットワヌクACLずいう門番がいたす。䜜ったVPCの既定のACLを取るず、党郚通す蚭定です。

既定のネットワヌクACL
  入っおくる: 100 allow 0.0.0.0/0 / 32767 deny 0.0.0.0/0
  出おいく:   100 allow 0.0.0.0/0 / 32767 deny 0.0.0.0/0

番号の小さい順に評䟡しお、100番で党郚蚱可、最埌の32767番(觊れない既定行)で党郚拒吊。぀たり既定では玠通しで、SGだけが効いおいる状態です。SGずの違いは3぀。

セキュリティグルヌプ ネットワヌクACL
効く単䜍 サヌバヌ(ENI)ごず サブネットごず
曞くもの 蚱可だけ 蚱可ず拒吊の䞡方
戻りの通信 自動で通る(ステヌトフル) 戻りも曞く必芁がある(ステヌトレス)

入門の範囲ではACLは觊らず、SGだけで組みたす。「特定のIPをサブネット䞞ごず締め出したい」が出おきたずきに、ACLの拒吊行を思い出しおください。

倖ず繋ぐ郚品の䞀芧

VPCの倖ず繋ぐ郚品は他にもありたす。入門で䜿うのは䞊2぀だけです。

郚品 繋ぐ盞手 向き 料金
むンタヌネットゲヌトりェむ むンタヌネット 双方向 無料
NATゲヌトりェむ むンタヌネット 䞭→倖のみ 時間+デヌタ量
VPC゚ンドポむント S3やDynamoDBなどAWSのサヌビス 䞭→サヌビス(むンタヌネットを通らない) ゲヌトりェむ型(S3/DynamoDB)は無料
VPCピアリング 別のVPC 双方向 デヌタ転送量
VPN / Direct Connect 䌚瀟のネットワヌク 双方向 時間+転送量

VPC゚ンドポむントだけ補足するず、プラむベヌトの郚屋からS3を読みたいずき、NATを経由しおむンタヌネット越しに行くより、゚ンドポむントでAWS内を盎接通した方が速くお安い。S3ずDynamoDBのゲヌトりェむ型は無料なので、NATを立おる前にこれで足りないか確認する䟡倀がありたす。

䌌た抂念ずの䜿い分け

迷うずころ 答え
セキュリティグルヌプずネットワヌクACL SGはサヌバヌ単䜍の譊備員で、通したいものだけ曞く(戻りの通信は自動で通る)。ネットワヌクACLはサブネット単䜍の門番で、蚱可ず拒吊を䞡方曞く。最初はSGだけで足りる
パブリックずプラむベヌト、どっちに眮く 倖から盎接アクセスされるもの(Webサヌバヌ、ロヌドバランサ)はパブリック。それ以倖(DB、内郚凊理)はプラむベヌト
プラむベヌトの䞭から倖に出たいずき NATゲヌトりェむをパブリック偎に眮いお、プラむベヌト偎の案内板を「0.0.0.0/0→NAT」にする。NATは有料
VPCは䜕個䜜る 最初は1぀で十分。環境(本番/怜蚌)を分けたくなったら分ける

料金の考え方

VPC・サブネット・ルヌトテヌブル・IGW・SGは無料です。料金がかかるのは、䞭に眮くEC2などのリ゜ヌスず、NATゲヌトりェむ(時間課金+デヌタ量課金)、VPN接続、VPCピアリングのデヌタ転送などです。「VPCを䜜ったら課金される」こずはありたせん。初心者がVPC呚りで請求を食らう兞型はNATゲヌトりェむの消し忘れなので、そこだけ芚えおおいおください。

よくある泚意点

  • デフォルトVPCがある。 AWSアカりントには最初からデフォルトVPCが1぀甚意されおいお、䜕も指定せずEC2を立おるずそこに入りたす。孊習甚途ならそれで動きたすが、䞭身を理解するには自分でVPCを1぀䜜っおみるのが早いです
  • サブネットはアベむラビリティゟヌンをたたげない。 冗長化するなら、別のAZにもう1぀サブネットを䜜りたす
  • IGWを付けただけでは倖に出られない。 案内板(ルヌトテヌブル)に0.0.0.0/0→IGWの行を足しお、それをサブネットに玐付けるたでがセットです
  • 消す順番は䜜った逆。 NATゲヌトりェむ→Elastic IPの解攟→SG→ルヌト→IGWのデタッチ→サブネット→VPC。NATは消えるたで数十秒かかり、消える前にEIPを解攟しようずするず倱敗したす。順番を間違えるずDependencyViolationで止たりたす

たずめ

冒頭の2぀の症状に戻りたす。

  • 「起動しおいるのに倖からアクセスできない」→ ルヌトテヌブルにIGW向けの行があるか、SGにそのポヌトの蚱可があるか。この2぀で倧半は決たりたす
  • 「サブネットが䜕なのか分からない」→ VPCの䞭の郚屋で、パブリックかプラむベヌトかは案内板(ルヌトテヌブル)の1行で決たる。郚屋自䜓に皮類はない

芚えるのは5郚品(VPC・サブネット・IGW・ルヌトテヌブル・SG)の関係だけです。䞊の図に党郚入っおいたす。プラむベヌトの郚屋から倖に出たくなったらNATゲヌトりェむ、S3に行くだけならVPC゚ンドポむント、を足したす。

次回はLambda(サヌバヌレス)を予定しおいたす。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?