금일은 TCP 통신을 위해서 ELB에 Proxy Protocol 정책을 추가해보도록 한다.
1. 개요
기본적으로 ELB는 http 및 https 통신에 한해서 Sticky Session 지원과 Client IP를 포워딩한다.
기존 http 헤더에서 x-forwarded-for/port/protocol 의 항목이 추가 됐다.
아래는 ELB를 통해 들어온 http 통신 header 값이다.
{
host: 'test-2139921278.ap-northeast-1.elb.amazonaws.com:8080',
accept: '*/*',
'accept-encoding': 'gzip, deflate, sdch',
'accept-language': 'ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4',
referer: 'http://test-XXXXXXX278.ap-northeast-1.elb.amazonaws.com:8080/',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/45.0.2454.101 Safari/537.36',
'x-forwarded-for': '2XX.XXX.XX.XXX',
'x-forwarded-port': '8080',
'x-forwarded-proto': 'http',
connection: 'keep-alive'
}
만약 ELB에서 TCP를 사용하면 당연히 HTTP x-forwarded 헤더를 지원하지 않는다.
기본적으로 TCP 통신에서 ELB의 Back-end 서버들은 Client IP와 Port를 확인할 수 없다. 그러나 ELB Proxy 모드를 활성화 시키면 Client IP와 Port 정보를 확인할 수 있다.
AWS 블로그 참고
AWS ELB Proxy Mode 관련 Document
위 Document를 따라 ELB를 Proxy 모듈로 실행한다.
그럼 node proxy 모듈을 통해 Client IP를 확인할 수 있다.
var http = require('http')
, proxiedHttp = require('proxywrap').proxy(http)
, express = require('express')
, app = express()
, srv = proxiedHttp.createServer(app); // instead of http.createServer(app)
app.get('/', function(req, res) {
res.send('IP = ' + req.connection.remoteAddress + ':' + req.connection.remotePort);
console.log('IP = ' + req.connection.remoteAddress + ':' + req.connection.remotePort);
});
srv.listen(80);
ELB를 Proxy 모드를 설정하여 Client IP 및 Port를 확인할 수 있다.
추가로 ELB는 Roud Robin이 아닌 Least connection 방식을 통해 백앤드 서버와 통신한다.
(가장 레이턴시가 짧은 백앤드와 통신)
'Compute > ELB' 카테고리의 다른 글
AWS Network Load Balancer(NLB) 동작 방식과 주의사항 (0) | 2022.09.01 |
---|---|
AWS ELB WebSocket 사용 시 헬스체크 방안 (0) | 2021.07.06 |
AWS ELB Backend Connection Errors (1) | 2018.05.17 |
AWS ELB 사용 시 Apache 408/503 error log (0) | 2016.12.12 |
AWS ELB Pre-warm 신청 양식 (0) | 2016.01.25 |