AWS VPCエンドポイントでS3へプライベート接続する方法|Gateway型・Interface型の違いとNATコスト削減設計

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)AWS(Amazon Linux) > AWS VPCエンドポイントでS3へプライベート接続する方法|Gateway型・Interface型の違いとNATコスト削減設計
「NATゲートウェイの料金明細を見ると、S3へのデータ転送コストが予想以上にかさんでいる」
「プライベートサブネットのEC2からS3へ直接つなぎたいが、Gateway型とInterface型のどちらを使えばいいか分からない」

プライベートサブネット内のEC2がS3へアクセスする場合、デフォルトではNATゲートウェイを経由します。東京リージョンのNATゲートウェイはデータ処理料金として1GBあたり約$0.062が発生し、月に数百GBのS3転送があると無視できない出費になります。

この記事では、AWS VPCエンドポイント(Gateway型・Interface型/PrivateLink)を使ってS3へプライベート接続する設定手順を、実際のAWS CLIコマンドと出力例つきで解説します。両方の違いと選び方、NATゲートウェイのコストを大幅に削減できる設計パターン、よくあるトラブルの対処法まで一通り説明します。

動作確認環境:Amazon Linux 2023 / AWS CLI 2.15 / 東京リージョン(ap-northeast-1)

この記事のポイント

・Gateway型は無料でS3へのルートを自動追加する
・Interface型はオンプレ・他VPCからも到達できる
・Gateway型への切替えでNATコストを大幅削減できる
・接続確認はaws s3 lsで即座にテストできる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜVPCエンドポイントが必要なのか

プライベートサブネットのEC2はインターネット接続を持ちません。そのままではS3(パブリックエンドポイント)に届かないため、通常はNATゲートウェイを経由する構成をとります。

しかしS3もAWSのサービスであり、インターネットを介さずにAWS内部のネットワークで直接つなぐ方法があります。それがVPCエンドポイントです。

VPCエンドポイントなしの通信経路(デフォルト):
プライベートサブネット → NATゲートウェイ → インターネットゲートウェイ → S3

VPCエンドポイントを使った通信経路:
プライベートサブネット → VPCエンドポイント → S3(AWS内部ネットワーク)

VPCエンドポイント経由ではデータがインターネットを通りません。セキュリティ上のメリットに加え、NATゲートウェイのデータ処理料金を節約できます。AWSはS3とDynamoDBへのアクセスに限り「Gateway型」を無料で提供しており、S3利用が多い環境では即座にコスト削減の効果が出ます。

VPC設計の基本についてはAWSのLinux環境構築とVPC設計入門で解説しています。サブネット設計の前提を確認してから本記事に取り組むとスムーズです。

Gateway型VPCエンドポイントでS3をプライベート接続する

Gateway型エンドポイントはS3とDynamoDBのみで利用でき、料金はかかりません。設定は「ルートテーブルへのエントリ追加」という仕組みで動作します。EC2インスタンスは意識せず、ルーティングが変わるだけです。

1. 現在のVPCとルートテーブルを確認する

まずVPC IDとルートテーブルIDを確認します。

# vpc 情報とルートテーブルを確認する(事前準備) aws ec2 describe-vpcs \ --query 'Vpcs[*].[VpcId,CidrBlock,Tags[?Key==`Name`].Value|[0]]' \ --output table

実行結果の例:

------------------------------------------------------ | DescribeVpcs | +-----------------------+----------------+-----------+ | vpc-0a1b2c3d4e5f6789 | 10.0.0.0/16 | prod-vpc | +-----------------------+----------------+-----------+

次にプライベートサブネットに紐づくルートテーブルIDを取得します。

# route table 一覧(プライベート用を特定する) aws ec2 describe-route-tables \ --filters "Name=vpc-id,Values=vpc-0a1b2c3d4e5f6789" \ --query 'RouteTables[*].[RouteTableId,Tags[?Key==`Name`].Value|[0]]' \ --output table

------------------------------------------------------ | DescribeRouteTables | +-----------------------+----------------------------+ | rtb-0a1b2c3d4e5f6780 | private-rtb | | rtb-0a1b2c3d4e5f6781 | public-rtb | +-----------------------+----------------------------+

2. Gateway型VPCエンドポイントを作成する

S3のサービス名(東京リージョン)は com.amazonaws.ap-northeast-1.s3 です。

# gateway type vpc endpoint を作成する aws ec2 create-vpc-endpoint \ --vpc-id vpc-0a1b2c3d4e5f6789 \ --service-name com.amazonaws.ap-northeast-1.s3 \ --route-table-ids rtb-0a1b2c3d4e5f6780

作成後、ステータスが available になったことを確認します。

aws ec2 describe-vpc-endpoints \ --query 'VpcEndpoints[?VpcEndpointType==`Gateway`].[VpcEndpointId,State,ServiceName]' \ --output table

---------------------------------------------------------------------- | DescribeVpcEndpoints | +------------------------+-----------+--------------------------------+ | vpce-0abc123def456789 | available | com.amazonaws.ap-northeast-1.s3| +------------------------+-----------+--------------------------------+

3. ルートテーブルへの自動エントリを確認する

Gateway型エンドポイントが作成されると、ルートテーブルにS3のプレフィックスリスト(pl-61a54008)宛のルートが自動で追加されます。

aws ec2 describe-route-tables \ --route-table-ids rtb-0a1b2c3d4e5f6780 \ --query 'RouteTables[*].Routes[*].[DestinationPrefixListId,GatewayId]' \ --output table

---------------------------------------------- | DescribeRouteTables | +-------------------+------------------------+ | pl-61a54008 | vpce-0abc123def456789 | +-------------------+------------------------+

pl-61a54008 がS3のプレフィックスリストIDです(東京リージョン)。このエントリが存在すれば、プライベートサブネットからS3へのリクエストはNATゲートウェイを経由せず、VPCエンドポイント経由でルーティングされます。

4. プライベートサブネットのEC2からS3接続をテストする

プライベートサブネット内のEC2にSSH接続し、S3への疎通を確認します。

# s3 バケット一覧を確認(vpc endpoint 経由の接続テスト) aws s3 ls --region ap-northeast-1 # アップロードテスト aws s3 cp /tmp/test.txt s3://your-bucket-name/test.txt --region ap-northeast-1

正常にバケット一覧やアップロード結果が返ってくれば、VPCエンドポイント経由でS3へ接続できています。

Interface型エンドポイント(PrivateLink)でS3へ接続する

Interface型(PrivateLink)はサブネットにENI(Elastic Network Interface)を作成し、DNS名をプライベートIPアドレスに解決することで通信を仲介します。オンプレミスからDirect Connect経由でのアクセスや、VPCピアリング先からのアクセスが必要な場合はInterface型を選びます。

1. Interface型エンドポイントを作成する

Interface型ではセキュリティグループの指定が必要です。先にENI用のセキュリティグループを用意しておきます。

# interface type endpoint を作成する(private-dns-enabled を必ず付ける) aws ec2 create-vpc-endpoint \ --vpc-id vpc-0a1b2c3d4e5f6789 \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.ap-northeast-1.s3 \ --subnet-ids subnet-0a1b2c3d4e5f6791 \ --security-group-ids sg-0a1b2c3d4e5f6792 \ --private-dns-enabled

aws ec2 describe-vpc-endpoints \ --query 'VpcEndpoints[?VpcEndpointType==`Interface`].[VpcEndpointId,State,DnsEntries[0].DnsName]' \ --output table

------------------------------------------------------------------------------------------ | DescribeVpcEndpoints | +------------------------+-----------+--------------------------------------------------+ | vpce-0def456abc123789 | available | vpce-0def456abc123789.s3.ap-northeast-1.vpce.aws | +------------------------+-----------+--------------------------------------------------+

2. プライベートDNS有効化とDNS解決を確認する

プライベートDNSを有効化すると、s3.ap-northeast-1.amazonaws.com がVPC内でプライベートIPアドレスに解決されます。VPCの設定で enableDnsHostnamesenableDnsSupport が有効になっていることが前提です。

# dns 設定を確認する(両方が true であることを確認) aws ec2 describe-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f6789 \ --attribute enableDnsHostnames aws ec2 describe-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f6789 \ --attribute enableDnsSupport

EC2上でDNS解決を確認します。プライベートIPが返ってくれば成功です。

# nslookup でプライベートDNS解決を確認する(プライベートサブネットEC2上で実行) nslookup s3.ap-northeast-1.amazonaws.com

Server: 10.0.0.2 Address: 10.0.0.2#53 Name: s3.ap-northeast-1.amazonaws.com Address: 10.0.1.234

プライベートIPアドレス(10.0.1.234)が返ってくれば、S3へのリクエストはVPCエンドポイントのENIを経由して転送されます。LinuxでのDNS名前解決の仕組みについてはLinux DNS設定ガイド(resolv.conf・nmcli)も参考になります。

3. セキュリティグループに443番ポートを許可する

Interface型エンドポイントのENIには、VPC内のEC2からS3への通信(HTTPS/443)を許可するインバウンドルールが必要です。

# security group に https インバウンドを許可する aws ec2 authorize-security-group-ingress \ --group-id sg-0a1b2c3d4e5f6792 \ --protocol tcp \ --port 443 \ --cidr 10.0.0.0/16

ポートの疎通確認にはLinuxポート確認コマンド(ss・lsof)も参考にしてください。

Gateway型 vs Interface型(PrivateLink)の違いと選び方

項目 Gateway型 Interface型(PrivateLink)
対象サービス S3・DynamoDBのみ 多数のAWSサービス
料金 無料 有料($0.014/h/AZ + $0.01/GB)
経路制御の仕組み ルートテーブル DNS名解決(ENI経由)
オンプレミスからの利用 不可 可(Direct Connect・VPN)
VPCピアリング経由 不可
セキュリティグループ 不要 必要(443番ポートを許可)
プライベートDNS 不要 有効化が必要
選び方の基準:

・VPC内のEC2のみがS3へアクセスする構成 → Gateway型(無料・設定シンプル)
・オンプレからDirect Connect経由でS3にアクセスしたい → Interface型(PrivateLink)
・VPCピアリング先からエンドポイント経由でS3にアクセスしたい → Interface型
・最小コストでNATゲートウェイのS3転送コストを削減したい → Gateway型

多くのケースではGateway型が最初の選択肢です。S3とDynamoDBへのアクセスが対象で、VPC内完結型の構成であれば、Gateway型で十分かつコストゼロで実現できます。

NATゲートウェイのコストをVPCエンドポイントで削減する

プライベートサブネットからS3への大量転送が発生している構成では、VPCエンドポイントへの切替えで実際のコストを大幅に削減できます。運用コストの見直しとしてまず検討すべき施策です。

東京リージョン(ap-northeast-1)のコスト比較(月100GBのS3転送の場合):
構成 月間コスト目安 内訳
NATゲートウェイ経由 約$39 データ処理$6.20 + 稼働時間$33.12($0.046/h × 720h)
Gateway型エンドポイント経由 $0 エンドポイント料金なし・同一リージョンS3転送無料
Interface型(PrivateLink)経由 約$21 $0.01/GB × 100GB + $0.014/h × 720h × 2AZ
S3専用であればGateway型一択です。NATゲートウェイはS3以外のインターネット向け通信(外部APIなど)の運用でも引き続き使うため、NATゲートウェイ自体を削除する必要はありません。ルートテーブルの優先度で「S3宛はエンドポイント経由、それ以外はNATゲートウェイ経由」という設計が自動で実現します。

設計上の注意点:
・同一VPC内の複数サブネットで効果を得るには、全プライベートサブネットのルートテーブルにエンドポイントを紐づける
・マルチAZ構成でもGateway型は1つのエンドポイントで全AZをカバーできる
・S3バケットポリシーで aws:SourceVpce 条件を使うと、エンドポイント経由のアクセスのみ許可する細かい制御も可能

冗長設計やマルチAZ構成の詳細についてはAWS冗長設計パターン入門も参考にしてください。

「S3に接続できない」エラーの対処法

1. 「An error occurred (AccessDenied)」が出る場合

S3バケットポリシーが aws:SourceVpce 条件でVPCエンドポイント経由のみを許可している場合、または逆にエンドポイントIDを明示的に拒否している場合に発生します。

まずバケットポリシーを確認します。

# bucket policy の内容を確認する aws s3api get-bucket-policy --bucket your-bucket-name

Conditionの内容を確認し、意図せずエンドポイントIDが拒否リストに入っている場合は修正します。

2. ルートテーブルにエンドポイントのエントリがない場合

Gateway型エンドポイント作成後、対象のルートテーブルにプレフィックスリスト(pl-61a54008)のエントリが追加されているか確認します。

# route table の s3 エントリ有無を確認する aws ec2 describe-route-tables \ --route-table-ids rtb-0a1b2c3d4e5f6780 \ --query 'RouteTables[*].Routes[?DestinationPrefixListId!=null]' \ --output json

空の配列([[]])が返ってくる場合は、エンドポイントが別のルートテーブルに紐づいているか、作成に失敗している可能性があります。エンドポイントの編集でルートテーブルを再指定します。

3. Interface型でタイムアウトする場合

セキュリティグループのインバウンドルールに443番ポートが許可されているか確認します。

# security group の 443 インバウンドルールを確認する aws ec2 describe-security-groups \ --group-ids sg-0a1b2c3d4e5f6792 \ --query 'SecurityGroups[*].IpPermissions[?ToPort==`443`]' \ --output json

空の場合は443番ポートの許可ルールを追加します。

4. Interface型のDNSがパブリックIPを返す場合

VPCのDNS設定が無効になっている可能性があります。

# vpc の dns 属性を有効化する aws ec2 modify-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f6789 \ --enable-dns-hostnames aws ec2 modify-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f6789 \ --enable-dns-support

有効化後に再度 nslookup s3.ap-northeast-1.amazonaws.com を実行し、プライベートIPが返ることを確認します。

本記事のまとめ

やりたいこと コマンド・手順
Gateway型エンドポイントを作成する aws ec2 create-vpc-endpoint --service-name com.amazonaws.ap-northeast-1.s3 --route-table-ids rtb-xxx --vpc-id vpc-xxx
エンドポイントの状態を確認する aws ec2 describe-vpc-endpoints --query 'VpcEndpoints[*].[VpcEndpointId,State,VpcEndpointType]' --output table
ルートテーブルの反映を確認する aws ec2 describe-route-tables --route-table-ids rtb-xxx --query 'RouteTables[*].Routes[*].[DestinationPrefixListId,GatewayId]' --output table
Interface型のDNS解決を確認する nslookup s3.ap-northeast-1.amazonaws.com
S3への接続をテストする aws s3 ls --region ap-northeast-1
VPCエンドポイントはNATゲートウェイのコスト削減とセキュリティ強化を同時に実現できる重要な設計要素です。S3とDynamoDBへのアクセスが主目的であればGateway型(無料)で十分です。オンプレミスや他VPCからのアクセスが必要な場合のみInterface型(PrivateLink)を検討してください。

VPCの基本設計についてはAWSのLinux環境構築とVPC設計入門を、マルチAZ冗長構成についてはAWS冗長設計パターン入門を合わせて参照してください。

VPCエンドポイントの設定方法だけでなく、AWSを「実務の型」として身につけませんか?

aws ec2 create-vpc-endpoint のコマンドは調べれば分かります。でも「どのルートテーブルに紐づけるのか」「Gateway型とInterface型をどう使い分けるのか」を、自信を持って設計できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。