AWSのVPCエンドポイントは「専用の秘密の近道」!ENIとDNSの魔法を解き明かす
こんにちは!SREとして現場の最前線に立っていると、「VPCからインターネットに出ずにS3やDynamoDBへ安全に接続したい」という相談を毎日のように受けます。そんな時に必ず登場するのが、今回解説する「Interface型VPCエンドポイント(AWS PrivateLink)」です。
教科書を読むと「ENIが〜」「DNS名が〜」と難しそうな言葉が並びますが、実はこれ、私たちの身近な仕組みに置き換えると驚くほどシンプルなんです。さあ、一緒に紐解いていきましょう!
—
1. そもそも「VPCエンドポイント」って何者?
インターネットに繋がっていないプライベートサブネットにいるサーバーから、AWSのサービス(S3など)へアクセスしたいとします。普通なら「インターネットゲートウェイ(IGW)」という、いわば「外の世界への大きな門」を通る必要がありますよね。
でも、「わざわざ混雑する公道を通らなくても、社内専用の高速道路があったら便利じゃない?」と思いませんか?
これが「VPCエンドポイント」です。これを使うことで、AWSのサービスへインターネットを通らず、AWSの広大なバックボーンネットワーク(社内LANのようなもの)を通って直接アクセスできるようになるんです。
—
2. ENIは「荷物の受け渡しカウンター」
Interface型VPCエンドポイントを作ると、AWSはあなたのVPCの中に「ENI(Elastic Network Interface)」というものを作成します。
これをイメージするなら、「AWSのサービス宛ての郵便物を受け取るための専用カウンター」です。
- ENIの正体: あなたのサブネットに割り当てられた、プライベートIPアドレスを持つ「入り口」です。
- 役割: あなたのサーバーが「S3にデータを送りたい!」と荷物(パケット)を投げると、ENIがその荷物をさっと受け取り、AWSの内部ネットワークへ横流ししてくれるのです。
なぜサブネットごとに作るの?
もしカウンターが一つしかなかったら、行列ができてしまいますよね。だから、複数のAZ(アベイラビリティゾーン)にまたがってENIを配置することで、どこか一つのカウンターが故障しても、隣のカウンターが代わりに対応できるようにしているんです。これが「クロスAZ冗長化」の正体です。
—
3. DNSの魔法:なぜ意識しなくても繋がるの?
ここが一番の「魔法」の部分です。本来、S3のアドレス(s3.amazonaws.com)を叩くと、インターネット上の公的なIPアドレスが返ってきてしまいます。
しかし、VPCエンドポイントを有効にすると、「プライベートDNS」という機能が働きます。
1. あなたがサーバーから s3.ap-northeast-1.amazonaws.com にアクセスしようとする。
2. AWSのDNSサーバーがこっそり割り込んで、「あ、君はVPCの中にいるんだね。じゃあ、さっきのENIのIPアドレス(秘密の近道の入り口)を教えるよ!」と言って、プライベートIPを返してくれる。
3. サーバーは「お、ここが入り口か!」と勘違いして(実際は正しいのですが)、そのENIへ荷物を送る。
これによって、プログラムのコードを一行も書き換えることなく、安全なルートへ誘導されるわけです。便利ですよね!
—
4. 実践:AWS CLIで確認してみよう
実際に、VPCエンドポイントがどう設定されているか、CLIで覗いてみましょう。
# 特定のVPC内のVPCエンドポイントをリストアップする
aws ec2 describe-vpc-endpoints \
--filters Name=vpc-id,Values=vpc-xxxxxx \
--query "VpcEndpoints[*].[ServiceName,State,NetworkInterfaceIds]"
このコマンドを打つと、NetworkInterfaceIds が返ってきます。これが先ほど言った「カウンター(ENI)」のIDです。
また、もしTerraformなどで構築するなら、以下のような設定になります。
# VPCエンドポイントの定義例
resource "aws_vpc_endpoint" "s3" {
vpc_id = var.vpc_id
service_name = "com.amazonaws.ap-northeast-1.s3"
vpc_endpoint_type = "Interface"
# プライベートDNSを有効にする(魔法のスイッチ!)
private_dns_enabled = true
# どのサブネットにカウンターを置くか指定
subnet_ids = [var.subnet_a_id, var.subnet_b_id]
# セキュリティグループで通信を許可する
security_group_ids = [aws_security_group.endpoint_sg.id]
}
—
SREからの最後のアドバイス
VPCエンドポイントを使うと、ネットワーク経路がシンプルになるだけでなく、「セキュリティレベルが格段に上がる」という大きなメリットがあります。インターネットを通らないので、外部からの攻撃を受けるリスクがゼロになるからです。
ただし、一点だけ注意してください。「ENIの料金」と「データ処理量に応じた課金」が発生します。便利さと引き換えにコストがかかることは、SREとして常に意識しておきたいポイントですね。
「最初は難しそうに見えたパケットの行き来も、こうして見ると郵便物と同じなんだ」と捉えてもらえれば、インフラの世界はもっと楽しくなりますよ!
もし、「ここがまだモヤモヤする!」という箇所があれば、ぜひ現場の感覚を大切にして、実際に nslookup や ping でパケットの行き先を追いかけてみてください。それが一番の上達の近道です。それでは、素敵なクラウドライフを!
コメント