AWS
EC2

特定IPアドレス群からのみアクセスを許可したいときのEC2インスタンスとロードバランサーのセキュリティグループの設定例

いつも混乱するのでメモ。

やりたいこと

  • ロードバランサーは特定のIPアドレス(xx.xx.xx.xx/xx)からのHTTPSアクセスのみ受け入れる。
  • ロードバランサーはHTTPSアクセスを配下のインスタンスのHTTPポートに転送する。
  • EC2インスタンスはロードバランサーからのHTTPアクセスのみ受け入れる。

設定

ロードバランサー

項目
名前 foo-lb
DNS名 foo-lb-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com
ポート構成 443(HTTPS) を 80(HTTP)に転送
ソースセキュリティグループ sg-aaaaaaaa, sg-xxxxxxxx

EC2インスタンス

項目
名前 foo-server
IPv4パブリックIP nnn.nnn.nnn.nnn
セキュリティグループ sg-bbbbbbbb

セキュリティグループ

sg-aaaaaaaa

(設定なし)

sg-bbbbbbbb

方向 プロトコル(ポート) ソース/送信先
インバウンド HTTP(80) sg-aaaaaaaa
アウトバウンド すべて 0.0.0.0/0

sg-xxxxxxxx

方向 プロトコル(ポート) ソース/送信先
インバウンド HTTPS(443) xx.xx.xx.xx/xx
アウトバウンド すべて 0.0.0.0/0

補足・注意点

  • sg-aaaaaaaaのインバウンド(HTTPS)にxx.xx.xx.xx/xxを入れてもいいです。ここでは他でも同様のIP許可設定を行うことを想定し、IP許可用のセキュリティグループとしてsg-xxxxxxxxを作って流用できるようにしました。
  • sg-xxxxxxxxのインバウンドの設定を増やせば複数のIPアドレス帯域にも対応できます。
  • 誤ってロードバランサーからsg-aaaaaaaaを外すと、EC2インスタンスに設定されているsg-bbbbbbbbのインバウンドにsg-aaaaaaaaしか無いため、ロードバランサーからEC2インスタンスへのHTTPデータ転送ができなくなります。
  • sg-aaaaaaaaのインバウンドのソースにsg-xxxxxxxxを入れてもxx.xx.xx.xx/xxからのアクセスは許可されません。ソースにセキュリティグループ自体を指定した場合は、ソースがそのセキュリティグループが指定されているインスタンスになるだけだからです。
  • アクセス制限しない場合はsg-aaaaaaaaのインバウンド(HTTPS)に0.0.0.0/0を入れ、、ロードバランサーのソースセキュリティグループはsg-aaaaaaaaのみにします。