2021/11/18

EKSのロードバランサーでIPアドレスのアクセス制限を設定する

eksawsk8s

EKSで立てているネットワークロードバランサーにipアドレスによるアクセス制限をつける必要があったため対応しました。

結構簡単で、loadBalancerSourceRangesというプロパティを追加するだけでした。これをつけるとAWS側でこの設定値に基づいてSecurity Groupが自動で更新されていました。(便利ですね)

apiVersion: v1
kind: Service
metadata:
  name: your-app
  namespace: your-namespace
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  loadBalancerSourceRanges:
    - "XXX.XXX.XXX.XXX/32"  # e.g. your office ip
    - "YYY.YYY.YYY.YYY/24"
  ports:
    - name: https
      port: 443
      targetPort: 443
  selector:
    app: your-app

ただ、落とし穴もあり、たくさん設定すると、うまく動作しない場合があります。

私の場合は、たくさん設定しすぎてうまく動かなくなり、原因を調査したところ、kubectl describe svcで以下のメッセージが表示されていて原因が判明しました。

Warning SyncLoadBalancerFailed 60m service-controller (combined from similar events):
 Error syncing load balancer: failed to ensure load balancer: error authorizing security group ingress:
 "RulesPerSecurityGroupLimitExceeded: The maximum number of rules per security group has been reached.\n\tstatus code: 400, request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

どうやら、Serurity Groupのルールが60個(デフォルトの上限値)を超えてしまっており、追加しようとしていたip whitelistのrangeを追加できないためでした。

この場合は、うまくip whitelistの設定値を減らして工夫するか、不必要な公開portを削除して対応しましたが、どうしても減らせない場合はAWSでの上限値の変更を行う必要があります。

以上です。