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

... 121  [122]  123  124  125  126  127  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10873정성태11/25/201525451.NET Framework: 540. C# - 부동 소수 계산 왜 이렇게 나오죠? (2) [3]파일 다운로드1
10872정성태11/24/201532421.NET Framework: 539. C# - 부동 소수 계산 왜 이렇게 나오죠? (1) [1]
10871정성태11/23/201528041오류 유형: 313. SignTool Error: No certificates were found that met all the given criteria.
10870정성태11/23/201528900오류 유형: 312. 윈도우 10 TH2 (버전 1511) 업데이트가 안되는 경우 [1]
10869정성태11/23/201524667오류 유형: 311. certutil 실행 오류 - 0x80070057 [1]
10868정성태11/20/201524548제니퍼 .NET: 25. 제니퍼 닷넷 적용 사례 (5) - RestSharp 라이브러리의 CPU High 현상파일 다운로드1
10867정성태10/18/201527098.NET Framework: 538. Thread.Abort로 인해 프로세스가 종료되는 현상
10866정성태10/14/201523328.NET Framework: 537. C# - Reflection의 박싱 없이 값 형식을 다루는 방법파일 다운로드1
10865정성태10/13/201523100.NET Framework: 536. Thread.Abort의 스레드 종료 지연파일 다운로드1
10864정성태10/12/201521287.NET Framework: 535. aspnet.config 파일의 설정을 읽는 방법
10863정성태10/9/201526105.NET Framework: 534. ASP.NET 응용 프로그램이 예외로 프로세스가 종료된다면?
10862정성태10/9/201524460오류 유형: 310. 비주얼 스튜디오 - Unspecified error (Exception from HRESULT: 0x80004005 (E_FAIL))
10861정성태10/9/201529106기타: 54. 도서: 시작하세요! C# 6.0 프로그래밍: 기본 문법부터 실전 예제까지 (2)
10860정성태10/5/201526576개발 환경 구성: 277. IIS AppPool의 시작/중단에 대한 이벤트 로그 확인 방법
10859정성태10/5/201527762.NET Framework: 533. C#에서 string 형식이 primitive일까요? [6]
10858정성태10/2/201524259VS.NET IDE: 105. Visual Studio의 단위 테스트 작성 시 Fakes를 이용한 메서드 재정의 방법 [1]파일 다운로드1
10857정성태10/1/201520291VS.NET IDE: 104. Visual C++ 프로젝트의 빌드 이벤트에서 환경 변수 사용하는 방법
10856정성태9/30/201531532.NET Framework: 532. WPF DataGrid의 데이터 바인딩 시 리플렉션의 부하는 어느 정도일까요?파일 다운로드1
10855정성태9/30/201521258.NET Framework: 531. C# - XSLT 내의 javascript에 전달한 XML 노드의 타입은?
10854정성태9/30/201521777오류 유형: 309. C# - 포인터를 쓰는 경우 VerificationException이 발생한다면?
10853정성태9/21/201519410오류 유형: 308. 공백 문자를 포함한 계정명의 권한으로 Visual Studio 확장을 설치할 때 오류 발생
10852정성태9/17/201524477VC++: 92. C++ 생성자를 DLL로부터 동적 로드해 객체를 생성한다면? [2]파일 다운로드1
10851정성태9/15/201524236.NET Framework: 530. C# - 중위식을 후위식으로 변환하는 예제파일 다운로드1
10850정성태9/14/201522929.NET Framework: 529. C# - volatile 키워드로 인한 차이점을 발생시키는 예제 [1]파일 다운로드1
10849정성태9/14/201557009오류 유형: 307. CLR20r3 오류 해결을 위해 mscorlib.dll을 덮어쓸때 주의할 점 [12]
10848정성태9/8/201527384VS.NET IDE: 103. Visual Studio의 Ctrl + F5 실행 동작파일 다운로드1
... 121  [122]  123  124  125  126  127  128  129  130  131  132  133  134  135  ...