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분
박중석 님 좋은 정보 감사드립니다. ^^
정성태

... 151  152  153  154  155  156  157  [158]  159  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1099정성태8/15/201128220오류 유형: 132. 어느 순간 갑자기 접속이 안 되는 TFS 서버
1098정성태8/15/201150255웹: 24. 네이버는 어떻게 로그인 처리를 할까요? [2]
1097정성태8/15/201121565.NET Framework: 235. 메서드의 메타 데이터 토큰 값으로 클래스를 찾아내는 방법
1096정성태8/15/201125690디버깅 기술: 42. Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석 - (2)
1095정성태8/14/201126137디버깅 기술: 41. Windbg - 비정상 종료된 닷넷 프로그램의 StackTrace에서 보이는 offset 값 의미
1094정성태8/14/201130526오류 유형: 131. Fiddler가 강제 종료된 경우, 웹 사이트 방문이 안되는 현상
1093정성태7/27/201124134오류 유형: 130. Unable to connect to the Microsoft Visual Studio Remote Debugging Monitor ... Access is denied.
1092정성태7/22/201126550Team Foundation Server: 46. 코드 이외의 파일에 대해 소스 제어에서 제외시키는 방법
1091정성태7/21/201125542개발 환경 구성: 128. WP7 Emulator 실행 시 audiodg.exe의 CPU 소모율 증가 [2]
1089정성태7/18/201131117.NET Framework: 234. 왜? Button 컨트롤에는 MouseDown/MouseUp 이벤트가 발생하지 않을까요?파일 다운로드1
1088정성태7/16/201124228.NET Framework: 233. Entity Framework 4.1 - 윈도우 폰 7에서의 CodeFirst 순환 참조 문제파일 다운로드1
1087정성태7/15/201126884.NET Framework: 232. Entity Framework 4.1 - CodeFirst 개체의 직렬화 시 순환 참조 해결하는 방법 - 두 번째 이야기파일 다운로드1
1086정성태7/14/201128323.NET Framework: 231. Entity Framework 4.1 - CodeFirst 개체의 직렬화 시 순환 참조 해결하는 방법 [1]파일 다운로드1
1085정성태7/14/201128804.NET Framework: 230. Entity Framework 4.1 - Code First + WCF 서비스 시 EndpointNotFoundException 오류 - 두 번째 이야기파일 다운로드1
1084정성태7/11/201134096.NET Framework: 229. SQL 서버 - DB 테이블의 데이터 변경에 대한 알림 처리 [4]파일 다운로드1
1083정성태7/11/201128138.NET Framework: 228. Entity Framework 4.1 - Code First + WCF 서비스 시 EndpointNotFoundException 오류
1082정성태7/10/201127690.NET Framework: 227. basicHttpBinding + 사용자 정의 인증 구현 [2]파일 다운로드1
1081정성태7/9/201127009VC++: 53. Windows 7에서 gcc.exe 실행 시 Access denied 오류 [2]
1080정성태7/8/201125509웹: 23. Sysnet 웹 사이트의 HTML5 변환 기록 - 두 번째 이야기파일 다운로드1
1079정성태7/6/201129950오류 유형: 129. Hyper-V + Realtek 랜카드가 설치된 시스템의 BSOD 현상 [2]
1078정성태7/5/201137453VC++: 52. Chromium 컴파일하는 방법 [2]
1077정성태6/24/201135081.NET Framework: 226. HttpWebRequest 타입의 HaveResponse 속성 이야기파일 다운로드1
1076정성태6/23/201129235오류 유형: 128. SQL Express - User Instance 옵션을 사용한 경우 발생하는 오류 메시지 유형 2가지
1075정성태6/21/201124840VS.NET IDE: 69. 윈폰 프로젝트에서 WCF 서비스 참조할 때 Reference.cs 파일이 비어있는 경우
1074정성태6/20/201124920.NET Framework: 225. 닷넷 네트워크 라이브러리의 트레이스 기능파일 다운로드1
1073정성태6/20/201127154오류 유형: 127. Visual Studio에서 WCF 서비스의 이름 변경 시 발생할 수 있는 오류
... 151  152  153  154  155  156  157  [158]  159  160  161  162  163  164  165  ...