下边回到我们的原始需求,来看下邮件开关机应该如何解决安全问题

 

分析这个需求,其实可以通过Microsoft Flow + Azure Automation的方式实现,首先O365邮箱接收邮件,然后通过Flow触发Azure Automation的runbook,在runbook里定义好我们需要执行的的任务,这样就可以实现我们需要的功能了

 

而身份验证实际上这里用的是我们之前讲的第二种,也就是service principal的方式,automation本身实际就是使用的service principal的方式,在Azure AD中实际上是可以看到automation注册的application的

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第1张图片



而Flow触发runbook,其实可以通过Flow来触发webhook,而automation其实是可以直接创建webhook的,这样其实就可以直接通过Flow触发Azure automation的webhook,我们的需求就可以实现了

 

关于Microsoft Flow,如果说有人了解的不是很多的话,可以这里先做一个简单的介绍

Microsoft Flow实际上是一个在线的workflow的service,可以在多个app之间执行一些自动化的任务,Flow对接的系统非常的多,比如Facebook,Twitter,Dynamic CRM,O365

 

目前来说,可以通过Flow对接超过200个服务,以下是其中的一部分



Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第2张图片



通过Flow,我们可以制定一些自动化的流程,举例来说,想实现在Yammer中有负面消息的时候就通知某个人呢,这种需求就可以通过Flow结合其他服务实现

 

首先通过Flow连接到Yammer->调用认知服务文本分析 API 检查情绪是否是负面的->如果是负面的,还可以调用Microsoft Translator将此文本翻译为别的语言->最后调用邮件发送消息通知


这就是一个标准的Flow了

 

对应到我们的需求,则比上边讲的还要简单一些

首先通过调用邮件,识别关键字,如果识别到关键字->触发webhook,在Automation中执行对应的runbook即可,想要复杂一点还可以加一些判断的逻辑,不同的关键字可以调用不同的webhook,实现不同的功能


我们这里准备实现一个简单的逻辑,在email的主题中注明是开机还是关机,然后根据关键字判断调用不同的webhook,想要调用webhook,当然首先这个webhook得存在才行,这里先在Azure automation中把webhook创建好


登陆Azure Portal后,找到automation,创建一个新的开机runbook

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第3张图片

Runbook 的类型选择普通的PowerShell即可

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第4张图片


之后再依此创建一个关机的runbook,当然创建一个单一的runbook,然后根据参数控制开关机也是可以的

 

创建好之后,点击编辑

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第5张图片


编写好对应的代码,点击publish

$connectionName = "AzureRunAsConnection"
$servicePrincipalConnection = Get-AutomationConnection -Name $connectionName

$logonAttempt = 0
$logonResult = $False

write-output "Login to Azure"
while(!($connectionResult) -And ($logonAttempt -le 10))
{
$LogonAttempt++
# Logging in to Azure...
$connectionResult = Connect-AzureRmAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint

Start-Sleep -Seconds 1
}

write-output "Start auto VM"
import-module Azurerm
Start-AzureRmVM -ResourceGroupName mxyjpwest -Name automationvm


Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第6张图片


之后,给这个runbook添加一个webhook

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第7张图片



注意,这里一定要保存好webhook的URL,因为这个URL创建好之后就不可见了,保存好之后创建webhook

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第8张图片



在webhook里已经可以看到了

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第9张图片


之后按照这个方法,创建好关机的webhook,到此Azure方面的准备工作就完成了

 

之后开始准备Flow,Flow其实在Global Office 365的订阅里是包含的,所以直接登录到Global O365,然后选择Flow

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第10张图片



选择从空白模板创建

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第11张图片



这里选择收到新电子邮件时

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第12张图片


选择好收件人,之后添加新步骤

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第13张图片



然后选择控制项->条件

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第14张图片


按照以下条件设置

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第15张图片


之后对如果是添加操作

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第16张图片

搜索webhook

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第17张图片



输入之前保存下来的webhook URL,注意一点要保证URL的安全,因为这个URL是包含token的,相当于直接就有执行操作的权限

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第18张图片


之后设置一个并行的条件,判断邮件主题是否包含stop,然后添加对应stop的webhook

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第19张图片


完成后整体是这样的

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第20张图片



之后发送一个邮件来进行一波测试

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第21张图片


稍等片刻后,可以看到Flow已经被触发了!

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第22张图片



在automation中可以看到,runbook也在running了!

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第23张图片



片刻后,VM已经是stopped状态

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第24张图片


在log里可以很清晰地看到有一条由automation账户触发的shutdown操作

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第25张图片



同理,再发一封start的邮件

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第26张图片


之后可以看到VM已经自动start了,测试完成!

Azure实践之如何通过邮件实现Azure VM的开关机(二)—— Flow实战演练_第27张图片


当然,这个应用场景是非常简单得了,但是抛砖引玉,Flow和automation真的能创造出很多的场景!希望以后能有时间多研究研究