FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

【AWS】EC2インスタンス間のデータ転送について

こんにちは、貴子です。
今回はAWSでサーバー構築中に、一番つまずいたことについてお話します。

やりたいことは、こんな感じ。
f:id:no_sugiyama:20150722164545p:plain

EC2-1からserver1にアクセスする時は、EC2-2を通してアクセスしたいのです。


EC2-1のRoute Tablesの設定

まずAmazonGUIからEC2-1のRoute Tablesの設定をします。
server1にアクセスする時はEC-2を通すようにしました。

f:id:no_sugiyama:20150722164605p:plain

続いて、現状態でデーター転送ができるか試してみます。
server1はgitサーバーなので、gitコマンドを使ってrecipesディレクトリの取得します。

・EC2-2から取得できることを確認する
f:id:no_sugiyama:20150722164629p:plain

・EC2-1でも同じコマンドで試してみる
f:id:no_sugiyama:20150722164704p:plain

失敗しました(´・ω・`)

EC2-1とEC2-2のgitポートでの疎通確認等、ひと通り試した後に
ギブアップして先輩社員に教えてもらいました。

原因1:EC2の【Source/dest. check】機能について

EC2インスタンスでは、送信元/送信先チェックをデフォルトで行います。
EC2-2でSource/dest.checkが有効だと、送信元(EC2-1)/送信先(server1)チェックが働き、
どちらにもEC2-2のアドレスがないため、EC2-1から来たパケットを弾いてしまいます。
なのでEC2-2のSource/dest.checkをDiseble(無効)にしてあげます。
f:id:no_sugiyama:20150722164729p:plain

原因2:iptablesのNATの設定について

EC2-2のiptablesは、AWSのセキュリティグループでIP制限をかけていたので使っておらず、
インストール時のままでした。
なので、下記のような設定をしてあげます。

「/sbin/iptables -t nat -A POSTROUTING -o eth0 -s 0.0.0.0/0-j MASQUERADE」

-A POSTROUTINGでネットワーク内部から送信するパケットに対し、-s 0.0.0.0/0 全てのprivateIPアドレスがeth0から出る時に、IPマスカレードを行います。
えっと、つまり、全てのパケットが1つの外部ネット(eth0)のIPアドレスを使用して
外に出て行くようになるのです。

f:id:no_sugiyama:20150722164755p:plain

これで準備が整いましたので、再度試してみます。
f:id:no_sugiyama:20150722164816p:plain
取得出来ました!

まとめ
EC2でパケットの転送を行うには、Source/dest. checkをDisabledにすることと、
iptablesのNAT設定が必要です。

感想
この問題に半日〜一日ぐらいかけて悩んでしまって、時間を無駄にしてしまいました(ノД`;)時間を無駄にはしたけれど、Source/dest. checkの機能をしれて、
もっとAmazonのドキュメントを読んで機能を知ろう!と再確認できたので凄く良い経験になりました。

ちなみに、次回はAmazon summit TOKYOに参加するので、それについて書こうかと思ってます。
初めてAmazon summit TOKYOに行くので、今からwktkしてます+(0゚・∀・)