AWSでS3を使う場合は必ずVPCエンドポイントも作成しておくクセをつけましょう。

どうもご無沙汰しております。櫻井(sakutomo0615)です。

前回の更新からだいぶ日が空いてしまいました。
今回は私が客先で遭遇した、AWS S3のアンチパターンの例を紹介したいと思います。

AWSを使っていて、ログや一時ファイルなどを置くのにS3を使うケースは多いかと思いますが、何の気なしにEC2とS3を使っている間に台数も増えて規模も大きくなると、自社が契約しているデータセンターとAWSの東京リージョンとを専用線で結ぶ、『ダイレクトコネクト』を使用するようになります。

これは私が実際に遭遇した話なんですが、まさにこのケースを踏みました。
AWSとS3に馴染みのない方向けにS3の使用手順も合わせて書きますので、『もう知ってるよ』って方は適当に飛ばしながら読んで下さい。

データセンターのFWに謎のトラフィックログが・・・

実は今の私の勤務先は慢性的なWAN回線の輻輳問題(要は回線が細いって事です)に悩まされておりまして、大して重要ではないアプリケーションのトラフィックはデータセンターを経由させない方向で最適化を進めております。

『どの通信のトラフィックが多いのか?』とFWのログを調査していたところ、ダイレクトコネクトしているはずのAWSからのトラフィックがデータセンターへ逆流しているのを発見しました。

AWS S3を単独で利用している場合のデータの流れ

VPC上にEC2インスタンスを1つと、S3bucketを1つ用意した場合のデータの流れを図にしました。簡単に言うと安い仮想マシン1台にS3バケットをマウントするとS3へのデータはこうなりますというお話です。

S3_01

誤解されがちなんですが、VPCエンドポイントを使用せずにEC2からAWS S3を利用する場合はそのトラフィックはAWSの網内で終端するわけではなく、一度インターネット上に出てからS3の外部接続点を経由してS3に向かいます。

 

不用意にダイレクトコネクトを繋いでしまうと?

私の記憶だと2015年の7月くらいまでは『もともとS3ってそういうもの』とするのが暗黙の了解な感じだったのですが、自社のデータセンターからAWSへ専用線接続する『ダイレクトコネクト』を利用すると一気に不都合が生じます。

S3_02

まさにこれが『今回私が遭遇したお話』です。もう対処メンテナンス(VPCエンドポイント)は終わったので現時点でデータセンター経由にはなっていないのですが、『どうしてこうなったか?』の話にも触れておきたいと思います。

エンドポイントを作り忘れた経緯

ちょうど当時AWS側の基盤を構築した人に話を伺う機会があったので、どういう流れでこうなったのかを共有しておきたいと思います。

 

  • 2013年の終わり頃 AWSに新基盤を構築して、開発環境とした。
  • 2014年前半 新システムが出来たので、そのまま本番環境へ転用
  • 2014年後半 ダイレクトコネクトを接続→グループ内イントラから内部アドレスで接続
  • 2014年後半 グループ社員の本格利用が始まったので、一時的な集計ファイルの置き場にS3を使い出す。
  • 2015年中盤 AWSからVPCエンドポイントサービスがリリース

 

う〜ん、これはしょうがないと言えば、しょうがないですね。リリース後にS3を追加している様なので、構築ベンダーはS3を使っている事を把握していないでしょうし、多分このシステムの担当も『は?VPCエンドポイントって何?』って感じでしょう。

多分気がついてない会社は他にもたくさんありそうな気がします。

VPCエンドポイントを作るとどうなるのか?

その後どうなったか?というお話と技術的な解説を加えて今回の記事を締めたいと思います。

結論からいくと、VPCエンドポイントを作成する事によりS3へのトラフィックはAWS網内で終端されるようになります。

S3_03

ちょうど上の図のような感じです。確かに対処メンテナンスでエンドポイントを作成して以降はデータセンター側のFWログにも通信ログが出てくる事は無くなりました。

今回の一連の騒動の中での教訓としては、

当分ダイレクト接続を使う予定は無くても、S3を使う時は必ずエンドポイントを作成するクセはつけておいた方が良い』と言う事になります。

エンドポイントを作っておいてデメリットが発生するワケでは無いですし、後でどのインスタンスがS3を使っているのか?を調べるのも手間がかかります。

やはり初期構築時にエンドポイントを作っておくルールにしておいた方が無難だと言えるでしょう。

※補足・・・VPCエンドポイントとは?

VPCエンドポイントの作り方

最後にVPCエンドポイントの作り方の手順に触れておきたいと思います。

★前提条件

  1. AWS上にEC2インスタンスが作成済みであること
  2. S3バケットも事前に作成済みであること
  3. EC2・S3が同一リージョンに作成されていること。(ほとんどが東京リージョンだと思いますが、リージョン間跨ぎはNGです。インターネット回りになります)

とします。EC2インスタンスとS3バケットの作り方はネット上にたくさんありますので、そちらの記事を確認してみて下さい。

作成手順

まずはAWSコンソールにログインしましょう。

endpoint01

▲AWSコンソールにログインすると、左下にVPCがあります。このVPCメニューを開きましょう。

 

endpoint02

▲VPCメニューを開いたら、左メニューの中にエンドポイントがありますので、これを開きます。

 

endpoint03

▲今までエンドポイントを作っていない場合(当然、作ってないんですが)は『エンドポイントの作成』をクリックして、作成ウィザードを開始します。

 

endpoint04

▲VPCのネットワークアドレスを選択します。一つしかない場合は問題ありませんが、VPCを複数持っている場合はどのVPCに対して作るのか?に注意してください。選択したら『次のステップ』へ

 

endpoint05

▲S3エンドポイントの作成の前に、『今、S3に書き込み中のジョブとかないよね?』と言った趣旨の警告が出ます。(通信経路が変わるので当然なんですが、セッションは切れます)

 

endpoint07

▲エンドポイントが作成されましたので、表示してみましょう。

 

endpoint08

▲これでVPCエンドポイントの出来上がりです。EC2のサーバー側での設定変更は特に必要ありません。

以降はトラフィックがAWSの網内で終端されるようになります。

まとめ

『そもそもVPCエンドポイントがリリースされている事自体を知らなかった』

『エンドポイントを作成しないとどうなるか知らなかった』と言う方はまだまだ多いと思います。

S3を使用しているサーバー数が多くなっている状態でダイレクト接続をしてしまうと、データセンター側に大量トラフィックが流れ込んでくる原因にもなります。

ぜひこれを機にエンドポイントを作っているかチェックをしてみて下さい。

 

 

【About】この記事を書いた人

櫻井 智行株式会社ビットクリア代表
ネットワーク・データベース寄りの意識不明系インフラエンジニア。実にものぐさ+毒舌な性格。
個人のブログはhttp://www.tank-sakurai.com