-
AWS Secrets Manager에 대하여프로그래밍 2024. 10. 21. 17:26
우리는 개발 중 많은 설정 변수 또는 상수를 선언하여 작업하게 된다.
흔히. NET에서 사용하는 방법은 appsettings.json 또는 appsettings.development.json 이겠다.
여기서는 AWS Secrets Manager를 사용하여 환경 변수를 선언하고 Application 상에서 동작하는 방법을 확인해 보자.
먼저 AWS 에서 Secrets Manager를 등록하여야 한다.
해당 방법은 검색을 통해 쉽게 알 수 있으니 검색하여 확인해 보자.
이제 예제 코드를 보자.
public class SecretManagerLoader : ISecretManagerLoader { private readonly string _keyId; private readonly string _accessKey; private readonly string _region; private readonly string _versionStage; public SecretManagerLoader(string keyId, string accessKey, string region = "ap-northeast-2", string versionStage = "AWSCURRENT") { _keyId = keyId; _accessKey = accessKey; _region = region; _versionStage = versionStage; } public void Initialize() { string secretName = "demo/test"; var client = new AmazonSecretsManagerClient(_keyId, _accessKey, RegionEndpoint.GetBySystemName(_region)); var request = new GetSecretValueRequest() { SecretId = secretName, VersionStage = _versionStage, // VersionStage defaults to AWSCURRENT if unspecified. }; GetSecretValueResponse response; try { response = client.GetSecretValueAsync(request).ConfigureAwait(false).GetAwaiter().GetResult(); var map = response.SecretString.ToDeserialize<Dictionary<string, object>>(); foreach (var keyValuePair in map) { Environment.SetEnvironmentVariable(keyValuePair.Key, keyValuePair.Value.ToString()); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
생성자에서 ACCESS를 위한 설정 값을 확인하고 Initialize에서 실제 request 수행 후 secretstring을 dictionary에 담고 이후에 환경변수를 설정하고 있다. 해당 환경 변수는 프로세스가 수행되는 시간 동안에만 유지된다.
이후에 각종 설정은 Environment.GetEnvironmentVariable("") 이용하여 설정하면 된다.
위 클래스는 ISecretManagerLoader를 상속받고 있는데, 실제로 호출되는 부분은 아래와 같다.
public interface ISecretManagerLoader { void Initialize(); }
public static class SecretManagerLoaderExtensions { public static void AddSecretManager(this IServiceCollection services, ISecretManagerLoader loader) { loader.Initialize(); } }
위와 같이 확장 클래스화 하여 사용할 경우 Application 초기화 패턴에 맞추어 초기화할 수 있다.
Program.cs 상에서 호출은 아래와 같다.
var sloader = new SecretManagerLoader(Environment.GetEnvironmentVariable("AWS_KEYID"), Environment.GetEnvironmentVariable("AWS_ACCESSKEY"), Environment.GetEnvironmentVariable("AWS_REGION")); builder.Services.AddSecretManager(sloader);
위는 composite 패턴을 사용하였고 실제 동작은 Loader 인터페이스를 상속 받은 구현 클래스를 주입하여 처리한다.
AZURE를 사용한다면 아래의 구현을 참고 하자.
public class KeyVaultLoader : ISecretManagerLoader { private readonly string _url; private readonly string _secretName; public KeyVaultLoader(string url, string secretName) { _url = url; _secretName = secretName; } public void Initialize() { try { // Azure Credential (로컬 개발에서는 Visual Studio, CLI 인증 또는 Managed Identity 사용 가능) var credential = new DefaultAzureCredential(); // Key Vault 클라이언트 생성 var client = new SecretClient(new Uri(_url), credential); // 비밀 가져오기 KeyVaultSecret retrievedSecret = client.GetSecret(_secretName); var map = retrievedSecret.Value.ToDeserialize<Dictionary<string, object>>(); foreach (var keyValuePair in map) { Environment.SetEnvironmentVariable(keyValuePair.Key, keyValuePair.Value.ToString()); } } catch (Exception e) { Console.WriteLine(e.Message); } } }
위와 같이 설정하면 되겠다.
aws secrets manager와 azure key-vault를 사용한 환경 변수 예제를 확인해 보았다.
다만, 심각하게 보안에 신경 써야 한다면 Application에서 설정하지 말아야 한다.
docker를 사용한다면 docker-compose에서 awscli를 통해 처리할 수 있다.
따라서 배포 이미지에 환경 변수를 선언하는 것도 좋은 방법이겠다.
도움이 되길 바라며...
'프로그래밍' 카테고리의 다른 글
확장 메서드란? (0) 2024.10.21 ASP.NET CORE 8에서의 Exception 처리 (0) 2024.10.21 ASP.NET CORE Serilog 설정 및 사용 (0) 2024.10.17 ASP.NET CORE에서의 JWT 처리 (0) 2024.10.16 SignalR Redis Backplane (0) 2024.10.16