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