외부 서비스와 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 > EC2' 카테고리의 다른 글
AWS Spot Instance 이해하기 (0) | 2019.12.24 |
---|---|
AWS EC2 User data script sample(node.js) (0) | 2019.07.23 |
Amazon EC2 태그 기준으로 Instance Private IP 확인 CLI (0) | 2016.12.23 |
Amazon EC2 MySQL 5.6 설치 (0) | 2016.10.04 |
AWS EC2 Keypair 없이 사용하기 (0) | 2016.01.12 |