先日、お仕事の方のブログ↓にも書いたのだけど、僕は、自分の勉強も兼ねて、サーバ(Amazon EC2 インスタンス)を2台ほど運用してみている。
サーバには Web アプリケーション(Rails)をデプロイしていて、サーバへのリクエストは前段にいる ELB が受け付け、2台に配分されるように構成している。図に表すと以下のようなイメージになる。
これら2つのインスタンスは、諸事情によりプライベートサブネット内には押し込めておらず、パブリックな IP アドレスを持っている。ssh したいときとかには踏み台を経由する必要なくダイレクトにアクセスできるのでそれは便利なのだけど、いくら ELB を構えていても各インスタンスはグローバルに晒されてしまっているので、それはちょっと心もとない。
そこで「各インスタンスへの http / https アクセスは ELB からのもののみ、受け付けられるようにしたいなぁ」と思い、少し調べてみたところ、下記のページを発見。どうやらできる様子(そりゃそうか)。
次のステップとして、僕は AWS のリソース構築には CloudFormation を使っているので、上記の設定を CloudFormation で実施するにはどうすればいいのかも調べてみた。
これにはすこし手間取ってしまったのだけど、結果的に以下の p-r でやっているような形で実現できた。
かいつまんで書くと、
- 対象のインスタンスに当てているセキュリティグループの
SecurityGroupIngress
を以下のように変更する"CidrIp" : "0.0.0.0/0"
などとしているところに、代わりとしてSourceSecurityGroupId
を指定するSourceSecurityGroupId
の値として指定するのは、ELB に当てているセキュリティグループの ID。- ELB のセキュリティグループも CloudFormation で作っている場合なら
"SourceSecurityGroupId" : { "Ref" : "ELB のセキュリティグループの論理名" }
といった感じで OK。
というかんじ。おわり。
まとめ
これでほんの少しだけあるべき姿に近づけた気がする。でもやっぱりプライベートサブネットに入れたいな。(踏み台サーバのコストがネック...。。)