.NET에서 Docker를 사용한 로컬 개발 시에도 AWS Profile을 사용하여 비밀을 안전하게 전달
소개
로컬 개발 시 .NET 프로그램에서 AWS 서비스를 이용하려면 자격 증명으로 AWS 프로필 정보를 사용하거나 액세스 키와 비밀 키를 설정해야 합니다. 프로그램의 설정 파일 등에 액세스 키나 비밀 키를 기재하면 실수로 소스 제어 리포지토리에 노출될 위험이 있으므로 가능하면 AWS 프로파일을 이용하여 AWS에 연결하는 것이 좋습니다.
이 기사에서는 Docker를 이용한 로컬 개발 시 AWS Profile을 이용하여 시크릿을 안전하게 취급하는 방법에 대해 설명합니다.
프로필을 사용하여 .NET Core에서 AWS 서비스 사용
.NET Core에서 AWS 서비스를 사용하는 경우 아래 문서에 설명된 대로 구성 파일( appsettings.json
)에 사용할 AWS 프로필 정보를 정의하고 Startup 시 AddDefaultAWSOptions
확장 메서드에서 앞서 설명합니다. 설정 내용을 활성화하는 것이 좋습니다.
htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / sdk - 흠 - t / v3 / ゔ ぇ ぺ ぺ ぐ ぐ で / 네 td g - 곤후 ぃ g - t 이것. HTML
구체적으로는 다음과 같습니다.
appsettings.json{
"AWS": {
"Profile": "DevProfile",
"Region": "ap-northeast-1"
}
}
Startup.cs(AWS 서비스의 DI 설정)public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDefaultAWSOptions(Configuration.GetAWSOptions());
services.AddAWSService<IAmazonSecretsManager>();
/// ... 略 ...
}
/// ... 略 ...
}
서비스 이용public class HomeController : ControllerBase
{
private readonly IAmazonSecretsManager _amazonSecretsManager;
public HomeController (IAmazonSecretsManager amazonSecretsManager)
{
_amazonSecretsManager = amazonSecretsManager;
}
public async Task<string> Get()
{
var secret = await _amazonSecretsManager.GetSecretValueAsync(new GetSecretValueRequest
{
SecretId = "MySecret"
});
return secret.SecretString;
}
}
Visual Studio에서 IIS에 호스팅하거나 dotnet run
에서 웹 사이트를 자체 호스팅하는 경우에는 문제가 없지만 Docker에 호스팅하는 경우 Docker에 구성 파일 (appsettings.json에 지정된) AWS 프로필이 있습니다. 하지 않기 때문에, 아래와 같은 예외가 발생합니다.
AWS 프로필에서 AWS 연결 정보를 검색할 수 없기 때문에 발생하는 예외Amazon.Runtime.AmazonServiceException: Unable to get IAM security credentials from EC2 Instance Metadata Service.
at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.FetchCredentials()
at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentials()
at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentialsAsync()
at Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.MetricsHandler.InvokeAsync[T](IExecutionContext executionContext)
Docker 사용 AWS 프로필 사용
액세스 키와 비밀 키를 설정해도 됩니다만, 모처럼 기밀 정보를 기재하지 않아도 좋은 구조가 있으므로 프로파일을 이용하고 싶네요. AWS 프로파일은 각 사용자의 홈 디렉토리 바로 아래에 있는 .aws 디렉토리에 저장됩니다. 이 디렉토리 부하의 설정 정보는 어느 OS라도 공통이 되고 있으므로, 이 폴더를 볼륨 마운트 해 주면 좋을 것 같습니다.
Visual Studio를 사용하는 경우 컨테이너 오케스트레이터 지원에서
Docker Compose를 추가하고,
docker-compose.override.yml에 홈 디렉토리/.aws 디렉토리를 각 컨테이너의 홈 디렉토리에 마운트하는 설정을 추가해 봅시다. AWS 프로필 이름은 각 개발자마다 다를 수 있으므로 AWS 프로필 이름도 여기에 쓰면 좋을 것입니다.
docker-compose.override.ymlversion: '3.4'
services:
app:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
- AWS__Profile=DevProfile # 追加
ports:
- "80"
- "443"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
- ${USERPROFILE}/.aws:/root/.aws/:ro # 追加
프로필에서 액세스 키와 비밀 키를 얻을 수 있습니다.
요약
.NET Core에서 AWS 서비스를 사용하는 경우 아래 문서에 설명된 대로 구성 파일(
appsettings.json
)에 사용할 AWS 프로필 정보를 정의하고 Startup 시 AddDefaultAWSOptions
확장 메서드에서 앞서 설명합니다. 설정 내용을 활성화하는 것이 좋습니다.htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / sdk - 흠 - t / v3 / ゔ ぇ ぺ ぺ ぐ ぐ で / 네 td g - 곤후 ぃ g - t 이것. HTML
구체적으로는 다음과 같습니다.
appsettings.json
{
"AWS": {
"Profile": "DevProfile",
"Region": "ap-northeast-1"
}
}
Startup.cs(AWS 서비스의 DI 설정)
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDefaultAWSOptions(Configuration.GetAWSOptions());
services.AddAWSService<IAmazonSecretsManager>();
/// ... 略 ...
}
/// ... 略 ...
}
서비스 이용
public class HomeController : ControllerBase
{
private readonly IAmazonSecretsManager _amazonSecretsManager;
public HomeController (IAmazonSecretsManager amazonSecretsManager)
{
_amazonSecretsManager = amazonSecretsManager;
}
public async Task<string> Get()
{
var secret = await _amazonSecretsManager.GetSecretValueAsync(new GetSecretValueRequest
{
SecretId = "MySecret"
});
return secret.SecretString;
}
}
Visual Studio에서 IIS에 호스팅하거나
dotnet run
에서 웹 사이트를 자체 호스팅하는 경우에는 문제가 없지만 Docker에 호스팅하는 경우 Docker에 구성 파일 (appsettings.json에 지정된) AWS 프로필이 있습니다. 하지 않기 때문에, 아래와 같은 예외가 발생합니다.AWS 프로필에서 AWS 연결 정보를 검색할 수 없기 때문에 발생하는 예외
Amazon.Runtime.AmazonServiceException: Unable to get IAM security credentials from EC2 Instance Metadata Service.
at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.FetchCredentials()
at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentials()
at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentialsAsync()
at Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.MetricsHandler.InvokeAsync[T](IExecutionContext executionContext)
Docker 사용 AWS 프로필 사용
액세스 키와 비밀 키를 설정해도 됩니다만, 모처럼 기밀 정보를 기재하지 않아도 좋은 구조가 있으므로 프로파일을 이용하고 싶네요. AWS 프로파일은 각 사용자의 홈 디렉토리 바로 아래에 있는 .aws 디렉토리에 저장됩니다. 이 디렉토리 부하의 설정 정보는 어느 OS라도 공통이 되고 있으므로, 이 폴더를 볼륨 마운트 해 주면 좋을 것 같습니다.
Visual Studio를 사용하는 경우 컨테이너 오케스트레이터 지원에서
Docker Compose를 추가하고,
docker-compose.override.yml에 홈 디렉토리/.aws 디렉토리를 각 컨테이너의 홈 디렉토리에 마운트하는 설정을 추가해 봅시다. AWS 프로필 이름은 각 개발자마다 다를 수 있으므로 AWS 프로필 이름도 여기에 쓰면 좋을 것입니다.
docker-compose.override.ymlversion: '3.4'
services:
app:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
- AWS__Profile=DevProfile # 追加
ports:
- "80"
- "443"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
- ${USERPROFILE}/.aws:/root/.aws/:ro # 追加
프로필에서 액세스 키와 비밀 키를 얻을 수 있습니다.
요약
version: '3.4'
services:
app:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
- AWS__Profile=DevProfile # 追加
ports:
- "80"
- "443"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
- ${USERPROFILE}/.aws:/root/.aws/:ro # 追加
Reference
이 문제에 관하여(.NET에서 Docker를 사용한 로컬 개발 시에도 AWS Profile을 사용하여 비밀을 안전하게 전달), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/karuakun/items/0461c29587e8c83f5473텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)