Blog
VPCエンドポイントを使ったS3プライベートアクセスのススメ
こんにちは。アドテクスタジオでネットワークエンジニアをしている山本 孔明です。
前回までAXCを使用したネットワーク自動化を取り上げてきましたが、今回はAmazon Web Services(以下AWS)に関連するお話をしたいと思います。
VPCエンドポイントについて
アドテクスタジオとAWS
アドテクスタジオでは様々なプロダクトが存在し、そのインフラ基盤はプライベートクラウドだけでなく、サービスに合わせてパブリッククラウドも積極的に利用しています。その中でもAmazon S3は99.999999999%の耐久性を実現するよう設計されており、価格としても$0.0300 /GB(※1)と安価に利用が可能なため、弊社でも多くのプロダクトで利用されています。
※1 2016年4月現在、東京リージョンにおいてスタンダードストレージを最初の1TB/月までの範囲で利用した場合の価格です
VPCエンドポイントがリリースされました
これまではAmazon S3を利用する場合はインターネット経由でのアクセスが必要でしたが、VPCエンドポイントを利用することで、
VPC内のインスタンスがプライベートIPアドレスを使用して、AmazonS3へのアクセスが可能になりました!!
以下、Amazon Virtual Private Cloudユーザガイドから抜粋
エンドポイントは、VPC のインスタンスがプライベート IP アドレスを使用して、他のサービスのリソースと通信できるようにします。
インスタンスはパブリック IP アドレスを必要とせず、VPC でインターネットゲートウェイ、NAT デバイス、または仮想プライベートゲートウェイは必要ありません。
VPCエンドポイントを利用することで何が嬉しいのかという点を記載します。
- プライベートサブネットのようなインターネットに接続されていないインスタンスがS3にアクセスできる
- インターネット経由で接続するよりも価格が安い(※2)
弊社ではDirectConnectでVPCと接続をしているため、VPC内のインスタンスだけでなくDirectConnectを経由して
プライベートクラウド内のサーバも接続することを目的として進めたいと思います。
(参考)VPCエンドポイントを利用した場合の価格算出(※2)
※2 必ずご自身の環境に合わせて最新の価格を元に算出してください
※2 2016/4/25 現在の情報です。
DirectConnect+VPCエンドポイントの場合の転送費用
- Direct connect費用
すべてのロケーションで、データインは 0.00 USD/GB です。
Equinix、TY2 とアジアパシフィック (東京) リージョンの間ではローカルリージョンへのデータアウトは0.042 USD/GBです
- S3費用
同じリージョンであればデータ転送量はイン・アウト共に$0.000 /GBです。
DirectConnectのポート利用料は10Gでも2.142 USD/時間
※その他、リバースプロキシ用のインスタンス費用・回線費用などが発生します。
インターネット経由でアクセスした場合の転送費用
- S3費用
データ転送受信(イン) $0.000 /GB
インターネットへのデータ転送送信(アウト)
Amazon S3 からインターネットへのデータ転送送信(アウト) | |
---|---|
最初の 1 GB/月 | $0.000 /GB |
10 TB まで/月 | $0.140 /GB |
次の 40 TB/月 | $0.135 /GB |
次の 100 TB/月 | $0.130 /GB |
次の 350 TB/月 | $0.120 /GB |
仮に100TB程度のデータをインターネット経由からDirectConnect経由に変更すると、$6,000~$7,000程度の転送量の差が出るため、インスタンス費用などを差し引いてもお釣りがくると考えられます。ここでは既設のDirectConnectの空き帯域を使用することを想定して試算しているため、実際には回線コストや収容装置、ラックや電源費用などのコストを含め実際の環境に合わせて金額を算出してください。
VPCエンドポイント作成手順の概要
- VPCエンドポイントを作成する
- VPC内のインスタンスからグローバルへ接続できないことを確認する
- VPC内のインスタンスにリバースプロキシを設定する
- 動作確認
VPCエンドポイントを作成してみる
1. VPCエンドポイントを作成する
- VPCのダッシュボードから[エンドポイント]を選択します。
- [エンドポイント]の作成ボタンをクリックします
- 対象VPCの選択およびポリシーを適宜設定し[次のステップ]をクリックします
- 次にルートテーブルを設定をするため、対象のテーブルを選択します。
ここでは、S3へのネクストホップがエンドポイントIDとなったルートが追加されます。 - [エンドポイントの作成]をクリックします。
- 以下、注意点が出てきますので確認の上で進めてください。
S3 エンドポイントを使用する場合は、同じリージョン内の S3 アクセスで影響を受けるサブネットにおいて、インスタント から の送信元 IP アドレスは、パブリック IP アドレスではなく、プライベート IP アドレスとなります。 パブリック IP アドレスを使用する S3 への影響を受けるサブネットからの既存の接続が中断される場合があります。エンドポイントを作成、または、変更する場合は、重要なタスクが実行中でないことを確認してください。
2. VPC内のインスタンスからグローバルへ接続できないことを確認する
1 2 3 4 5 |
[ec2-user@test-server ~]$ ping 8.8.8. PING www.google.co.jp (8.8.8.8) 56(84) bytes of data. ^C --- 8.8.8.8.p ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1732ms |
事前にBucket内にファイルを配置していた場合、この時点でインスタンスからcurl https://s3-ap-northeast-1.amazonaws.com/<Your Backet>/<Your File> へアクセスすると、正常にS3への疎通が取れることが確認できるかと思います。
3. VPC内のインスタンスにリバースプロキシを設定する
今回はリバースプロキシとしてNginxを利用します。要点だけ記載しますが、Nginxをインストール後に以下のようにconfファイルを配置します。
1 2 3 4 5 6 7 8 9 10 11 12 |
[ec2-user@test-server ~]$ cat /etc/nginx/conf.d/s3.conf server { listen 80; server_name 192.168.1.1; location / { proxy_pass http://localhost/; } location /s3/ { proxy_pass https://s3-ap-northeast-1.amazonaws.com/; } } |
以上で設定は完了です。このインスタンスへアクセスするとproxy_passで設定したURLへプロキシします。
4. 動作確認
Direct Connectで接続されたネットワークから以下のようにインスタンスのIPを使ってアクセスします。
1 2 3 4 5 6 7 |
$ curl --head http://192.168.1.1/s3/<Your Backet>/<Your File> HTTP/1.1 200 OK Server: nginx/1.8.1 Date: Fri, 04 Mar 2016 11:43:43 GMT Content-Type: application/octet-stream Content-Length: 3607 Connection: keep-alive |
200 OKが返ってきました
エンドポイントの設定を削除すると以下の通りアクセスができなくなります。
1 2 3 4 5 6 7 8 |
$ curl --head http://10.133.2.69/s3/<Your Backet>/<Your File> HTTP/1.1 504 Gateway Time-out Server: nginx/1.8.1 Date: Fri, 04 Mar 2016 11:52:25 GMT Content-Type: text/html Content-Length: 182 Connection: keep-alive |
参考資料: http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-endpoints.html
Author