AWS ELB를 통해 WebSocket을 통해

6531 단어 websocketelbAWS

경위


  • Rails 5부터 ActionCable을 사용할 수있게되었습니다
  • AWS에서 쉽게 시도하고 싶습니다
  • 모처럼이므로 ELB를 사용하여 중복 구성을하십시오


  • 너무 쉽지 않았다.



    문제


  • ELB가 Websocket 연결에 필요한 Connection 헤더 및 Upgrade
  • 깎지 않도록 프로토콜을 TCP 로 하면 이번에는 X-Fowarded-For 헤더를 붙여 주지 않는다
  • 그래서 발신자의 IP 주소를 얻을 수 없습니다


  • 프록시 프로토콜을 사용할 수밖에없는 것 같습니다.



    Proxy Protocol이란?


  • HAProxy 가 책정
  • 요청 본문의 첫 번째 줄에 원본 정보를 추가하고 보내는 사양


  • PROXY TCP4 198.51.100.22 203.0.113.7 80 80\r\n
    GET / HTTP/1.1\r\n
    Host: example.com\r\n
    \r\n
    

    전체 구성





    ELB 설정


  • 두 프로토콜 모두 TCP로 설정하십시오.





  • 중요한 프록시 프로토콜 설정은 AWS 콘솔에서 사용할 수 없습니다.



    AWS CLI 설치



    Mac
    $ brew install awscli
    

    Linux (Python 2.6.5 이상 필요)
    $ pip install awscli
    

    Windows

    설치자가 있기 때문에

    AWS CLI 설정


  • IAM 사용자 추가 Access Key IDSecret Access Key 설정
  • $ aws configure
    AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
    AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    Default region name [None]: ap-northeast-1
    Default output format [None]: ENTER
    

    ELB - ProxyProtocol 설정


    $ aws elb create-load-balancer-policy \
      --load-balancer-name {ELB Name}
      --policy-name EnableProxyProtocol \
      --policy-type-name ProxyProtocolPolicyType \
      --policy-attributes \
        AttributeName=ProxyProtocol,AttributeValue=true
    $ aws elb set-load-balancer-policies-for-backend-server \
      --load-balancer-name {ELB Name} \
      --instance-port 80 \
      --policy-names EnableProxyProtocol
    

    ELB - 프록시 프로토콜 설정 확인


    $ aws elb describe-load-balancers \
      --load-balancer-name {ELB Name}
    
    "BackendServerDescriptions": [
        {
            "InstancePort": 80, 
            "PolicyNames": [
                "EnableProxyProtocol"
            ]
        }
    ], 
    

    Nginx 설정 (1)


    server {
      listen 80 proxy_protocol;
      real_ip_header proxy_protocol;
    
      location / {
        proxy_http_version "1.1";
        proxy_pass http://localhost:3000/;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_protocol_addr;
        proxy_set_header X-Forwarded-Host $http_host;
      }
    }
    

    Nginx 설정 (2)


  • Upgrade 헤더가 비어 있는 경우는 Connection 헤더를 close 로 한다
  • http {
      ...
      map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
      }
      ...
    }
    

    요약


  • ELB는 TCP로드 밸런서로 사용됩니다
  • 소스 IP 주소를 얻으려면 프록시 프로토콜이 필요합니다
  • Proxy Protocol을 처리하기 위해 Nginx 또는 HAProxy가 필요합니다.


    결국 무엇이 기쁘다?


  • 관리형로드 밸런서는 관리가 쉽고 EC2 인스턴스를 설정하는 것보다 저렴합니다.
  • SSL 설정은 AWS 콘솔에서 수행 할 수 있으며 최근에는 AWS Certificate Manager 인증서를 무료로 사용할 수 있습니다


  • 참고


  • 로드 밸런서에 대한 프록시 프로토콜 지원 설정 - Elastic Load Balancing
  • How to Configure NGINX to Accept the Proxy Protocol | NGINX
  • PROXY 프로토콜 - HAProxy
  • 좋은 웹페이지 즐겨찾기