158 lines
5.2 KiB
C#
158 lines
5.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace ServerCore;
|
|
|
|
|
|
// HANDOVER: AWS SDK 연동하는 주요 함수를 호출해주는 Wrapper 클래스 이다.
|
|
|
|
public static class AwsHelper
|
|
{
|
|
// EC2에서 실행중인 상태 종류
|
|
public enum Ec2RunningState
|
|
{
|
|
None = 0,
|
|
|
|
False = 1, //EC2에서 실행하고 있지 않다 !!!
|
|
True = 2 //EC2에서 실행중이다 !!!
|
|
};
|
|
|
|
private static readonly string MetaDataTokenUrl = "http://169.254.169.254/latest/api/token";
|
|
private static readonly string MetaDataInstanceIdUrl = "http://169.254.169.254/latest/meta-data/instance-id";
|
|
private static readonly string MetaDataIpV4Url = "http://169.254.169.254/latest/meta-data/public-ipv4";
|
|
|
|
private static Ec2RunningState RunningState = Ec2RunningState.None;
|
|
|
|
public static async Task<string> getAwsInstanceId()
|
|
{
|
|
var aws_meta_token = string.Empty;
|
|
|
|
try
|
|
{
|
|
aws_meta_token = await getAwsMetaDataToken();
|
|
|
|
using (var client = new HttpClient())
|
|
{
|
|
var request = new HttpRequestMessage(HttpMethod.Get, MetaDataInstanceIdUrl);
|
|
request.Headers.Add("X-aws-ec2-metadata-token", aws_meta_token);
|
|
request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
|
|
|
|
var response = await client.SendAsync(request);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
return await response.Content.ReadAsStringAsync();
|
|
}
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
var err_msg = $"Exception !!!, Failed to function in getAwsInstanceId() !!! : exception:{e}, awsMetaToken:{aws_meta_token}";
|
|
Log.getLogger().fatal(err_msg);
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
public static string getAwsPublicIPv4OrEthernetIPv4()
|
|
{
|
|
if (true == AwsHelper.isRunningOnEC2().GetAwaiter().GetResult())
|
|
{
|
|
return AwsHelper.getPublicIPv4().GetAwaiter().GetResult();
|
|
}
|
|
|
|
return NetworkHelper.getEthernetLocalIPv4();
|
|
}
|
|
|
|
private static async Task<bool> isRunningOnEC2()
|
|
{
|
|
if (Ec2RunningState.None != RunningState)
|
|
{
|
|
if(Ec2RunningState.True == RunningState) { return true; }
|
|
else if(Ec2RunningState.False == RunningState) { return false; }
|
|
}
|
|
|
|
var aws_meta_token = string.Empty;
|
|
|
|
try
|
|
{
|
|
aws_meta_token = await getAwsMetaDataToken();
|
|
|
|
if(false == aws_meta_token.isNullOrWhiteSpace())
|
|
{
|
|
RunningState = Ec2RunningState.True;
|
|
return true;
|
|
}
|
|
}
|
|
catch (HttpRequestException httpEx)
|
|
{
|
|
var err_msg = $"HttpRequestException !!!, Failed to function in isRunningOnEC2() : exception:{httpEx}, awsMetaToken:{aws_meta_token}";
|
|
Log.getLogger().debug(err_msg);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
var err_msg = $"Exception !!!, Failed to function in isRunningOnEC2() : exception:{e}, awsMetaToken:{aws_meta_token}";
|
|
Log.getLogger().error(err_msg);
|
|
}
|
|
|
|
// EC2 환경이 아닌 경우
|
|
RunningState = Ec2RunningState.False;
|
|
return false;
|
|
}
|
|
|
|
private static async Task<string> getPublicIPv4()
|
|
{
|
|
var aws_meta_token = string.Empty;
|
|
|
|
try
|
|
{
|
|
aws_meta_token = await getAwsMetaDataToken();
|
|
|
|
using (HttpClient client = new HttpClient())
|
|
{
|
|
var request = new HttpRequestMessage(HttpMethod.Get, MetaDataIpV4Url);
|
|
request.Headers.Add("X-aws-ec2-metadata-token", aws_meta_token);
|
|
request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
|
|
|
|
var response = await client.SendAsync(request);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
return await response.Content.ReadAsStringAsync();
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
var err_msg = $"Exception !!!, Failed to perform in getPublicIPv4() !!! : exception:{e}, awsMetaToken:{aws_meta_token}";
|
|
Log.getLogger().error(err_msg);
|
|
return await Task.FromResult(string.Empty);
|
|
}
|
|
}
|
|
|
|
private static async Task<string> getAwsMetaDataToken()
|
|
{
|
|
try
|
|
{
|
|
using (var client = new HttpClient())
|
|
{
|
|
var request = new HttpRequestMessage(HttpMethod.Put, MetaDataTokenUrl);
|
|
request.Headers.Add("X-aws-ec2-metadata-token-ttl-seconds", "21600");
|
|
request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
|
|
|
|
var response = await client.SendAsync(request);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
return await response.Content.ReadAsStringAsync();
|
|
}
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
var err_msg = $"Exception !!!, Failed to function in getAwsMetaDataToken() !!! : Exception:{e}";
|
|
Log.getLogger().debug(err_msg);
|
|
|
|
throw;
|
|
}
|
|
}
|
|
}
|