Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

Azure PaaS 웹 응용 프로그램 배포 후 SMTP 서버 구성


제 웹 사이트가 Azure에서 호스팅되고 있다는 것은 예전에 말씀드렸지요. ^^

Sysnet, Azure를 만나다.
; https://www.sysnet.pe.kr/2/0/1307

sysnet 웹 사이트는 글이 올라오는 경우 SMTP를 통해서 메일 알림이 가능합니다. 이때 사용되는 SMTP는 윈도우에서 기본 제공되는 서비스를 사용하고 있답니다. ^^

Azure 서비스에서 IaaS 방식의 VM 서비스는 할당받은 VM에 원격으로 접속한 후 환경 구성을 처음부터 끝까지 해줄텐데요. 반면에, Azure의 클라우드 서비스는 PaaS 유형이기 때문에 웹 애플리케이션이 배포된 이후에도 VM을 옮겨 가며 서비스가 될 수 있습니다. 즉, 무작위의 어느 시점부터는 다시 초기화된 서버에서 동작하는 것과 같습니다.

여기서 제 웹 사이트의 알림 기능에 문제가 발생합니다. Azure의 클라우드 서비스용 VM은 최초 환경 구성에서 SMTP가 기본적으로 비활성화되어 있기 때문에 Azure에 배포한 sysnet 웹 사이트는 알림이 동작하지 않는 것입니다.

이런 식의 문제를 해결하는 방법은 크게 3가지가 있습니다. 첫 번째는, SMTP 등의 고정 서비스를 위해 별도로 IaaS 방식의 Azure VM을 하나 할당받는 것입니다. 물론, 이렇게 하면 추가적인 비용이 발생합니다. ^^ 두 번째는, 배포 후에 RDP 접속을 해서 수동으로 서버를 구성해 주는 것입니다. 그런데 이 방식은 가끔씩 VM을 갈아타는 순간에 다시 수작업을 해주어야 하기 때문에 문제가 있습니다. 사실, 이 빈도가 낮긴 한데요... 그렇다고 해도 매번 수동으로 서버를 구성해 주는 것은 분명 번거로울 수밖에 없습니다.

마지막 세 번째 방법이 웹 애플리케이션 배포 후 실행되는 스크립트를 기술하는 것입니다. 사실, 전에 이 스크립트에 대해서 한번 설명한 적이 있는데요.

Azure - 네트워크 포트 여는 방법
; https://www.sysnet.pe.kr/2/0/1319

이번엔 네트워크 포트가 아닌 SMTP 구성요소와 그에 대한 설정을 변경하는 작업으로 바뀐 것뿐입니다. 따라서, ServiceDefinition.csdef의 내용을 바꾸는 것으로 시작하는 과정은 동일합니다. 여기서는 startup_azure.cmd라는 파일을 웹 애플리케이션의 루트 폴더에 함께 배포할 것입니다.

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition ...[생략]... schemaVersion="2012-10.1.8">
  <WebRole name="SysnetWebApp9" vmsize="Small">
    <Startup>
      <Task commandLine="startup_azure.cmd" executionContext="elevated" taskType="simple" />
    </Startup>
    ...[생략]...
</ServiceDefinition>

executionContext에 "elevated"가 지정되었기 때문에 startup_azure.cmd 파일은 "관리자 권한"으로 실행됩니다.

startup_azure.cmd 파일의 내용은 다음과 같습니다.

powershell -command "Set-ExecutionPolicy Unrestricted"
powershell .\InstallSmtp.ps1
cscript ConfigSmtp.vbs

PowerShell을 이용해서 SMTP 구성요소를 윈도우 서버 2008 R2에 설치하도록 명령을 내릴 텐데요. 첫 번째 라인은 권한 문제를 해결하기 위해 넣어둔 것이고, 두 번째가 PowerShell 명령어를 담은 별도의 파일입니다. 이 파일도 startup_azure.cmd 파일과 동일한 폴더에 넣어두고 코드는 다음과 같이 구성해 줍니다.

Import-Module Servermanager
Add-WindowsFeature SMTP-Server

위의 라인까지 실행되면 윈도우 서버에는 SMTP 서비스가 구성되는데요. 그다음 2가지 SMTP 서비스 설정을 추가할 것입니다. 이를 수작업으로 하는 경우, IIS 6.0 관리자에서는 아래의 그림과 같은 설정에 해당합니다.

azure_postprocess_1.png

azure_postprocess_2.png

첫 번째 그림처럼 "Connection control"을 해주는 이유는 보안 때문입니다. 이렇게 해두지 않으면 공짜 SMTP 서비스를 귀신같이 찾아내는 이들에 의해 엄청난 스팸 메일 발송 서비스로 둔갑하는 것은 시간 문제입니다. 물론, Access control로 계정 보안을 하면 되지만 설정이 더 까다롭기 때문에 간단하게 localhost에서만 접근할 수 있도록 제한한 것입니다. 두 번째 그림에서는 반대로 모든 서버로 relay가 가능하게 만들었는데요. 이렇게 하지 않으면 외부 메일 서버로 접속이 안되기 때문입니다.

자, 그럼 이런 설정을 해주는 스크립트를 만들면 되는데요. 다행히 아래의 글에서 ^^ 복사해 올 수 있었습니다.

Technique to change any IIS 6 properties programatically 
; http://obligatorymoniker.wordpress.com/2009/06/03/technique-to-change-any-iis-6-properties-programatically/

따라서, 제 경우에는 startup_azure.cmd 파일의 3번째 라인에 추가한 "cscript ConfigSmtp.vbs" 명령어가 이에 해당하는데, 역시 startup_azure.cmd 파일과 같은 폴더에 ConfigSmtp.vbs 파일을 넣어두고 코드는 다음과 같이 만들어 두면 됩니다.

Option Explicit
Dim smtpServer, relayIpList, connectionList

Set smtpServer = GetObject("IIS://localhost/smtpsvc/1")

Set relayIpList = smtpServer.Get("RelayIpList")
relayIpList.GrantByDefault = true

smtpServer.Put "RelayIpList",relayIpList
smtpServer.SetInfo

Set connectionList = smtpServer.Get("IPSecurity")
connectionList.GrantByDefault = false
connectionList.IPGrant = "127.0.0.1"

smtpServer.Put "IPSecurity",connectionList
smtpServer.SetInfo

결국, Azure 클라우드 서비스가 비록 PaaS 형식이긴 하지만 거의 모든 환경 구성이 자동화 될 수 있습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/26/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2013-05-03 07시19분
[박중석] 위 처럼 설정이 가능하기는 할텐데요, 다량의 메일을 보낼 경우에 막힐 가능성이 있는 것으로 알고 있습니다. 그래서 보통은 외부 메일 서버나 서비스(e.g., sendgrid) 사용하도록 권장하고 있기는 하고요. 혹시나 차후에 문제가 생기시면 참고로...
[guest]
2013-05-03 08시22분
박중석 님 좋은 정보 감사드립니다. ^^
정성태

1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13515정성태1/6/20242620닷넷: 2195. async 메서드 내에서 C# 7의 discard 구문 활용 사례 [1]
13514정성태1/5/20242306개발 환경 구성: 702. IIS - AppPool의 "Disable Overlapped Recycle" 옵션
13513정성태1/5/20242223닷넷: 2194. C# - WebActivatorEx / System.Web의 PreApplicationStartMethod 특성
13512정성태1/4/20242176개발 환경 구성: 701. IIS - w3wp.exe 프로세스의 ASP.NET 런타임을 항상 Warmup 모드로 유지하는 preload Enabled 설정
13511정성태1/4/20242197닷넷: 2193. C# - ASP.NET Web Application + OpenAPI(Swashbuckle) 스펙 제공
13510정성태1/3/20242120닷넷: 2192. C# - 특정 실행 파일이 있는지 확인하는 방법 (Linux)
13509정성태1/3/20242169오류 유형: 887. .NET Core 2 이하의 프로젝트에서 System.Runtime.CompilerServices.Unsafe doesn't support netcoreapp2.0.
13508정성태1/3/20242219오류 유형: 886. ORA-28000: the account is locked
13507정성태1/2/20242865닷넷: 2191. C# - IPGlobalProperties를 이용해 netstat처럼 사용 중인 Socket 목록 구하는 방법파일 다운로드1
13506정성태12/29/20232456닷넷: 2190. C# - 닷넷 코어/5+에서 달라지는 System.Text.Encoding 지원
13505정성태12/27/20232983닷넷: 2189. C# - WebSocket 클라이언트를 닷넷으로 구현하는 예제 (System.Net.WebSockets)파일 다운로드1
13504정성태12/27/20232572닷넷: 2188. C# - ASP.NET Core SignalR로 구현하는 채팅 서비스 예제파일 다운로드1
13503정성태12/27/20232441Linux: 67. WSL 환경 + mlocate(locate) 도구의 /mnt 디렉터리 검색 문제
13502정성태12/26/20232556닷넷: 2187. C# - 다른 프로세스의 환경변수 읽는 예제파일 다운로드1
13501정성태12/25/20232321개발 환경 구성: 700. WSL + uwsgi - IPv6로 바인딩하는 방법
13500정성태12/24/20232414디버깅 기술: 194. Windbg - x64 가상 주소를 물리 주소로 변환
13498정성태12/23/20233100닷넷: 2186. 한국투자증권 KIS Developers OpenAPI의 C# 래퍼 버전 - eFriendOpenAPI NuGet 패키지
13497정성태12/22/20232494오류 유형: 885. Visual Studiio - error : Could not connect to the remote system. Please verify your connection settings, and that your machine is on the network and reachable.
13496정성태12/21/20232485Linux: 66. 리눅스 - 실행 중인 프로세스 내부의 환경변수 설정을 구하는 방법 (gdb)
13495정성태12/20/20232416Linux: 65. clang++로 공유 라이브러리의 -static 옵션 빌드가 가능할까요?
13494정성태12/20/20232584Linux: 64. Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency) - 두 번째 이야기
13493정성태12/19/20232716닷넷: 2185. C# - object를 QueryString으로 직렬화하는 방법
13492정성태12/19/20232388개발 환경 구성: 699. WSL에 nopCommerce 예제 구성
13491정성태12/19/20232267Linux: 63. 리눅스 - 다중 그룹 또는 사용자를 리소스에 권한 부여
13490정성태12/19/20232399개발 환경 구성: 698. Golang - GLIBC 의존을 없애는 정적 빌드 방법
13489정성태12/19/20232178개발 환경 구성: 697. GoLand에서 ldflags 지정 방법
1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...