ããã«ã¡ã¯ãAWSãã¯ãã«ã«ã°ã«ã¼ãã®å±±ç°ã§ãã
ELBã§æ°ãã«Proxy Protocol ã®ãµãã¼ããå ãããHTTP(S)以å¤ã®æ¥ç¶ã§ãæ¥ç¶å ã®IPãåå¾åºæ¥ãããã«ãªã£ãã®ã§æ©éæ¤è¨¼ãã¦ã¿ã¾ããã
æ§æ
ä»åã¯ãæ°ãã«è¿½å ãããProxyProtocolPolicyãæå¹ã«ããELBã«ãProxyProtocolã¢ã¸ã¥ã¼ã«ãçµã¿è¾¼ãã Node.jsã®Webãµã¼ããã¢ã¿ãããã¦ãæ¥ç¶å IPã»æ¥ç¶å ãã¼ãã»ELBã®IPã表示ãããããªæ§æã«ãã¦ãã¾ãã
確èªæé
ã¾ããELBã®ProxyProtocolãæå¹åããããã«Policyãä½æãã¾ãã
$ elb-create-lb-policy ELBå --policy-name EnableProxyProtocol --policy-type ProxyProtocolPolicyType --attribute "name=ProxyProtocol, value=true"
次ã«ä½æããPolicyãELBã«é©ç¨ãã¾ãã
$ elb-set-lb-policies-for-backend-server ELBå --instance-port 8080 --policy-names EnableProxyProtocol
Policyãé©ç¨ããã¦ãããã©ãã確èªãã¾ãã
$ elb-describe-lb-policies ELBå --headers POLICY NAME TYPE_NAME POLICY EnableProxyProtocol ProxyProtocolPolicyType
ããã§ELBã®æºåã¯å®äºã§ãã
次ã«ELBã®é ä¸ã§å¾ ã¡åãããnode.jsãµã¼ããç¨æãã¾ãã
ã¾ããnode.jsã«å¿ è¦ãªããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ãã¾ãã
$ sudo yum install gcc-c++ make openssl-devel $ sudo yum install git
nvmã®githubã®ãªãã¸ããªãã¯ãã¼ã³ãã¦sourceãã¾ãã
$ git clone git://github.com/creationix/nvm.git .nvm $ . .nvm/nvm.sh
nvmããnode.jsãã¤ã³ã¹ãã¼ã«ãã¾ãã
$ nvm install v0.10.13
proxy protocolç¨ã®ã¢ã¸ã¥ã¼ã«ãnpmã§ã¤ã³ã¹ãã¼ã«ãã¾ãã
$ npm install proxy-protocol
次ã«ãnode.jsã®Webãµã¼ããä½æãã¾ãã
ãã®ãµã¼ãã¯ãELBãã8080çªãã¼ãã¸ã®TCPæ¥ç¶ã«å¯¾ãã¦ãProxy Protocol ãã¼ã¿ã解æããéä¿¡å
IPã¨ãã¼ãã¨ELBã®IPã表示ããã ãã®ãåç´ãªNode.jsã®ãµã¼ãã§ãã
$ vim server.js var net = require('net'); var proxy_protocol = require('node-proxy-protocol'); var response = 'HTTP/1.1 200 OKn Content-Type: text/htmln n <!doctype html>n <html lang="en">n <head>n <meta charset="utf-8" />n <title>New Feautre: Proxy Protocol Support for Elastic Load Balancing</title>n <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />n <script src="http://code.jquery.com/jquery-1.9.1.js"></script>n <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>n <script>n $(function() {n $( "#dialog" ).dialog({ width: 500, top: 200 });n });n </script>n </head>n <body>n <div id="dialog" title="Connection Details" style="width:400px">n <p><b>Source IP:</b> {SOURCE_ADDRESS}</p>n <p><b>Source Port:</b> {SOURCE_PORT}</p>n <p><b>ELB IP:</b> {PROXIED_BY}</p>n </div>n </body>n </html>'; net.createServer(function(socket) { var clientDetails = {}; proxy_protocol.parse(socket, function(error, obj) { if (error) { clientDetails.sourceAddress = socket.remoteAddress; clientDetails.sourcePort = socket.remotePort; clientDetails.proxiedBy = "Not detected"; clientDetails.proxiedPort = ""; } else { console.log(obj); clientDetails.sourceAddress = obj.srca; clientDetails.sourcePort = obj.srcp; clientDetails.proxiedBy = socket.remoteAddress; clientDetails.proxiedPort = socket.remotePort; } socket.end(response.replace("{SOURCE_ADDRESS}", clientDetails.sourceAddress) .replace("{SOURCE_PORT}", clientDetails.sourcePort) .replace("{PROXIED_BY}", clientDetails.proxiedBy)); }); }).listen(8080);
ä¸è¨ã®ã½ã¼ã¹ã³ã¼ãã¯ããã¡ãã®ãã¼ã¸ã«ãã(http://aws.typepad.com/aws/2013/07/elastic-load-balancing-adds-support-for-proxy-protocol.htmlï¼elb-pp-app.zip ã®ä¸ã® server.js ãåèã«ãã¾ããã
Node.jsã®ãµã¼ããèµ·åãã¾ãã
$ node server.js
æå¾ã«ãä½æããNode.jsã®Webãµã¼ããELBã¸ã¢ã¿ãããã¦ãListener Configurationãè¨å®ãã¾ãã
Node.jsã®Webãµã¼ãã¯8080ãã¼ãã§å¾
ã¡åãã¦ããã®ã§ Instance Port 㯠TCP:8080 ã«ãã¾ãã
確èª
ELBã«ã¢ã¯ã»ã¹ããã¨ãNode.jsã®Webãµã¼ã ã ProxyProtocol ã解æãã¦ãéä¿¡å IPã»ãã¼ãã»ELBã®IPãåå¾åºæ¥ã¦ããã®ãåããã¾ãã
æå¾ã«
Proxy Protocol ã¯TCPä¸ã®ä»»æã®ãããã³ã«ã§ä½¿ããã¨ãåºæ¥ãã®ã§ãããããæ§ã
ãªå ´é¢ã§æ´»ç¨ã§ããã¨æãã¾ãã
ELBã®å¯è½æ§ãããã§ã¾ãåºããã¾ãããã