【入門編】 VPCエンドポイント(Interface型 / AWS PrivateLink)のENIとDNS解決メカニズム – クラウドインフラと仮想化ネットワーク実践ガイド

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 でパケットの行き先を追いかけてみてください。それが一番の上達の近道です。それでは、素敵なクラウドライフを!

コメント

タイトルとURLをコピーしました