Files
caliverse_server/ServerCore/AWS/AwsHelper.cs
2025-11-28 16:54:56 +09:00

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;
}
}
}