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

... 76  77  78  79  80  81  82  83  84  85  86  87  88  [89]  90  ...
NoWriterDateCnt.TitleFile(s)
11771정성태11/5/201821471사물인터넷: 56. Audio Jack 커넥터의 IR 적외선 송신기 - 두 번째 이야기 [1]
11770정성태11/5/201831148Graphics: 27. .NET으로 구현하는 OpenGL (1) - OpenGL.Net 라이브러리 [3]파일 다운로드1
11769정성태11/5/201821027오류 유형: 501. 프로젝트 msbuild Publish 후 connectionStrings의 문자열이 $(ReplacableToken_...)로 바뀌는 문제
11768정성태11/2/201822511.NET Framework: 801. SOIL(Simple OpenGL Image Library) - Native DLL 및 .NET DLL 제공
11767정성태11/1/201822486사물인터넷: 55. New NodeMcu v3(ESP8266)의 IR LED (적외선 송신) 제어파일 다운로드1
11766정성태10/31/201825661사물인터넷: 54. 아두이노 환경에서의 JSON 파서(ArduinoJson) 사용법
11765정성태10/26/201821172개발 환경 구성: 420. Visual Studio Code - Arduino Board Manager를 이용한 사용자 정의 보드 선택
11764정성태10/26/201827126개발 환경 구성: 419. MIT 라이선스로 무료 공개된 Detours API 후킹 라이브러리 [2]
11763정성태10/25/201822834사물인터넷: 53. New NodeMcu v3(ESP8266)의 https 통신
11762정성태10/25/201823145사물인터넷: 52. New NodeMCU v3(ESP8266)의 http 통신파일 다운로드1
11761정성태10/25/201823083Graphics: 26. 임의 축을 기반으로 3D 벡터 회전파일 다운로드1
11760정성태10/24/201818636개발 환경 구성: 418. Azure - Runbook 내에서 또 다른 Runbook 스크립트를 실행
11759정성태10/24/201821078개발 환경 구성: 417. Azure - Runbook에서 사용할 수 있는 다양한 메서드를 위한 부가 Module 추가
11758정성태10/23/201824045.NET Framework: 800. C# - Azure REST API 사용을 위한 인증 획득 [3]파일 다운로드1
11757정성태10/19/201819655개발 환경 구성: 416. Visual Studio 2017을 이용한 아두이노 프로그램 개발(및 디버깅)
11756정성태10/19/201823480오류 유형: 500. Visual Studio Code의 아두이노 프로그램 개발 시 인텔리센스가 안 된다면?
11755정성태10/19/201824557오류 유형: 499. Visual Studio Code extension for Arduino - #include errors detected. [1]
11754정성태10/19/201821363개발 환경 구성: 415. Visual Studio Code를 이용한 아두이노 프로그램 개발 - 새 프로젝트
11753정성태10/19/201827429개발 환경 구성: 414. Visual Studio Code를 이용한 아두이노 프로그램 개발
11752정성태10/18/201820532오류 유형: 498. SQL 서버 - Database source is not a supported version of SQL Server
11751정성태10/18/201821299오류 유형: 497. Visual Studio 실행 시 그래픽이 투명해진다거나, 깨진다면?
11750정성태10/18/201819571오류 유형: 496. 비주얼 스튜디오 - One or more projects in the solution were not loaded correctly.
11749정성태10/18/201822226개발 환경 구성: 413. 비주얼 스튜디오에서 작성한 프로그램을 빌드하는 가장 쉬운 방법
11748정성태10/18/201821117개발 환경 구성: 412. Arduino IDE를 Store App으로 설치한 경우 컴파일만 되고 배포가 안 되는 문제
11747정성태10/17/201823175.NET Framework: 799. C# - DLL에도 EXE처럼 Main 메서드를 넣어 실행할 수 있도록 만드는 방법파일 다운로드1
11746정성태10/15/201822439개발 환경 구성: 411. Bitvise SSH Client의 인증서 모드에서 자동 로그인 방법파일 다운로드1
... 76  77  78  79  80  81  82  83  84  85  86  87  88  [89]  90  ...