본문 바로가기

Compute/EC2

AWS EC2 EIP 사용 시 HA 구성

외부 서비스와 API 통신 시에 외부 업체에서 보안을 이유상으로 고정 IP 몇 개 허용해 줄 때가 있다. 기존 IDC에서는 VIP를 통해 HA 구성을 했지만, Cloud에서 외부 API 서비스를 이용하기 위해 NAT 구성은 위험성이 있다. (NAT의 비용 및 네트워크 문제) 

 

그 경우 보통 AWS 클라우드에서는 Elastic IP를 이용해서 사용하는데, 그 경우 해당 EC2는 SOPF(Single Of Point Failure) 상태가 된다. 

 

그래서 나노 사이즈의 작은 EC2 Instance를 사용하여 2대의 EC2 Instance에 Health Check를 배치잡을 이용하여 Master 서버에 문제가 발생할 경우 Slave 서버로 EIP를 교체할 수 있다. 아래 간단한 샘플코드를 첨부한다.

var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-2'
var ec2 = new AWS.EC2();
var tcpp = require('tcp-ping');
var waterfall = require('async-waterfall');
var cronJob = require('cron').CronJob;

function check(){
waterfall(
        [
                function(callback){
                        var params = {
                        };
                        ec2.describeAddresses(params, function(err, data) {
                                if (err) console.log(err, err.stack); // an error occurred
                                else{                // successful response
                                        for(var i = 0; i < data.Addresses.length; i++){
                                                if(data.Addresses[i].PublicIp == '13.124.48.32'){
                                                callback(null, data.Addresses[i].AssociationId, data.Addresses[i].AllocationId, data.Addresses[i].InstanceId);
                                                }
                                        }
                        }});
                },
                function(assId, allId, ec2Id, callback){
                        var result = '';
                        var assId = assId;
                        var allId = allId;
                        console.log('test');
                        tcpp.probe('13.124.48.32', 8080, function(err, result){   //tcp probe ip, port
                                callback(null, assId, allId, ec2Id, result);
                        });
                },
                function(assId, allId, ec2Id, result, callback){
                        var ec2Array = ['i-0b62a7e8103cb34c7', 'i-00b0653dc7170f85f'];  //instance ID
                        if(result == false){
                                if(ec2Id == ec2Array[0]){
                                        var params = {
                                                AllocationId: allId,
                                                InstanceId: ec2Array[1]
                                                };
                                        ec2.associateAddress(params, function(err, data) {
                                                if (err) console.log(err, err.stack); // an error occurred
                                                else     console.log(data);           // successful response
                                        });
                                }else{
                                        var params = {
                                                AllocationId: allId,
                                                InstanceId: ec2Array[0]
                                                };
                                        ec2.associateAddress(params, function(err, data) {
                                                if (err) console.log(err, err.stack); // an error occurred
                                                else     console.log(data);           // successful response
                                        });
                                }
                        }else{
                                callback(null, 'done');
                        }
                }
        ], function (err, result){
                if(err) console.log(err);
                else console.log('done');
        }
);
}
var job = new cronJob({
  cronTime: '00 */5 * * * *',
  onTick: function() {
    // Runs every weekday (Monday through Friday)
    // at 04:30:00 AM. It does not run on Saturday
    // or Sunday.
    check();
  },
  start: true,
  timeZone: 'Asia/Seoul'
});
job.start();

 

CloudWatch Event와 Lambda를 통해서도 구현이 가능하며, 위 코드를 참고해서 수정하고 Lambda 사용을 권장한다.

 

Lambda를 통한 VIP 서버 HA 구성 아래 참고.. Lambda로 하자

 

'Compute/Lambda' 카테고리의 글 목록

IT 및 클라우드 기술 관련 블로그 2015.06.25

blog.leedoing.com