「プライベートサブネットの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で即座にテストできる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ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 | +-----------------------+----------------+-----------+
# 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
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の設定で enableDnsHostnames と enableDnsSupport が有効になっていることが前提です。# dns 設定を確認する(両方が true であることを確認) aws ec2 describe-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f6789 \ --attribute enableDnsHostnames aws ec2 describe-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f6789 \ --attribute enableDnsSupport
# 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
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
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 |
設計上の注意点:
・同一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
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
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の基本設計についてはAWSのLinux環境構築とVPC設計入門を、マルチAZ冗長構成についてはAWS冗長設計パターン入門を合わせて参照してください。
VPCエンドポイントの設定方法だけでなく、AWSを「実務の型」として身につけませんか?
aws ec2 create-vpc-endpoint のコマンドは調べれば分かります。でも「どのルートテーブルに紐づけるのか」「Gateway型とInterface型をどう使い分けるのか」を、自信を持って設計できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:AWS ACMとRoute 53でHTTPS化する方法|無料SSL証明書の発行からALB適用・自動更新まで
- 前のページへ:AWSのDR設計入門|バックアップ&リストア・パイロットライトなど4戦略とRTO/RPOの決め方
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます