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)
13336정성태5/4/20234687.NET Framework: 2111. C# - 바이너리 출력 디렉터리와 연관된 csproj 설정
13335정성태4/30/20234725.NET Framework: 2110. C# - FFmpeg.AutoGen 라이브러리를 이용한 기본 프로젝트 구성 - Windows Forms파일 다운로드1
13334정성태4/29/20234404Windows: 250. Win32 C/C++ - Modal 메시지 루프 내에서 SetWindowsHookEx를 이용한 Thread 메시지 처리 방법
13333정성태4/28/20233800Windows: 249. Win32 C/C++ - 대화창 템플릿을 런타임에 코딩해서 사용파일 다운로드1
13332정성태4/27/20233890Windows: 248. Win32 C/C++ - 대화창을 위한 메시지 루프 사용자 정의파일 다운로드1
13331정성태4/27/20233923오류 유형: 856. dockerfile - 구 버전의 .NET Core 이미지 사용 시 apt update 오류
13330정성태4/26/20233580Windows: 247. Win32 C/C++ - CS_GLOBALCLASS 설명
13329정성태4/24/20233775Windows: 246. Win32 C/C++ - 직접 띄운 대화창 템플릿을 위한 Modal 메시지 루프 생성파일 다운로드1
13328정성태4/19/20233455VS.NET IDE: 184. Visual Studio - Fine Code Coverage에서 동작하지 않는 Fake/Shim 테스트
13327정성태4/19/20233862VS.NET IDE: 183. C# - .NET Core/5+ 환경에서 Fakes를 이용한 단위 테스트 방법
13326정성태4/18/20235319.NET Framework: 2109. C# - 닷넷 응용 프로그램에서 SQLite 사용 (System.Data.SQLite) [1]파일 다운로드1
13325정성태4/18/20234604스크립트: 48. 파이썬 - PostgreSQL의 with 문을 사용한 경우 연결 개체 누수
13324정성태4/17/20234436.NET Framework: 2108. C# - Octave의 "save -binary ..."로 생성한 바이너리 파일 분석파일 다운로드1
13323정성태4/16/20234368개발 환경 구성: 677. Octave에서 Excel read/write를 위한 io 패키지 설치
13322정성태4/15/20235169VS.NET IDE: 182. Visual Studio - 32비트로만 빌드된 ActiveX와 작업해야 한다면?
13321정성태4/14/20233978개발 환경 구성: 676. WSL/Linux Octave - Python 스크립트 연동
13320정성태4/13/20233912개발 환경 구성: 675. Windows Octave 8.1.0 - Python 스크립트 연동
13319정성태4/12/20234386개발 환경 구성: 674. WSL 2 환경에서 GNU Octave 설치
13318정성태4/11/20234261개발 환경 구성: 673. JetBrains IDE에서 "Squash Commits..." 메뉴가 비활성화된 경우
13317정성태4/11/20234316오류 유형: 855. WSL 2 Ubuntu 20.04 - error: cannot communicate with server: Post http://localhost/v2/snaps/...
13316정성태4/10/20233593오류 유형: 854. docker-compose 시 "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)" 오류 발생
13315정성태4/10/20233816Windows: 245. Win32 - 시간 만료를 갖는 컨텍스트 메뉴와 윈도우 메시지의 영역별 정의파일 다운로드1
13314정성태4/9/20233975개발 환경 구성: 672. DosBox를 이용한 Turbo C, Windows 3.1 설치
13313정성태4/9/20234019개발 환경 구성: 671. Hyper-V VM에 Turbo C 2.0 설치 [2]
13312정성태4/8/20234049Windows: 244. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (개선된 버전)파일 다운로드1
13311정성태4/7/20234536C/C++: 163. Visual Studio 2022 - DirectShow 예제 컴파일(WAV Dest)
1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...