使用 Azure Function 定时启动云 VM

点击上方蓝字关注“汪宇杰博客”

导语

微软 Azure 平台的 VM 可以做到定时自动关机,然而只有 DevTest Lab 服务中的 VM 能够定时开机,普通用途的 VM 还没有上线这个功能。但是没关系,我们可以曲线救国,通过最新版的 Azure Function V3 及 PowerShell Core,分分钟让 VM 定时开机。

思路

6年前,我曾经在博客里分享过如何使用 PowerShell 定时开关机 VM,方法是额外新建一台 VM,在上面用计划任务定时跑开关机的脚本去操作目标 VM。这个方法虽然可行,但需要耗费额外的 VM 资源,并且很 996。

https://edi.wang/post/2014/8/25/start-stop-azure-vm-on-schedule

而如今,Azure 已经发生了翻天覆地的变化,Serverless 的 Azure Function 是如今最地道的玩法。Azure Function 可以通过多种 Trigger 触发自定义的代码逻辑,其中有一种就是 Timer,于是通过骚操作,Azure Function 也能够做到定时开关机 VM。

创建 Function App

点击 Create a resource,选择 Function App。起一个好听的名字,比如 start996

Runtime stack 的意思是该 Function 想用哪种语言编写。Azure Function 提供了主流语言或平台的支持。其中 .NET 据说工资低所以不考虑,Java 又容易脱发,也不考虑,Node.js 和 Python 由于年过 30 学不动了,于是我只能选择 Powershell Core,听说它是跨平台的,现在我们只能选到 6,实际上最新版已经是 7.1 了,不知为何微软还不给自家平台部署最新版。

接下来我们得创建或选择一个存储账户(Storage Account),这是最新版 Azure Function V3 强制规定的,不许拒绝。

Plan type 选择 Consumption (Serverless),这个 Plan 可以根据你的使用量情况动态计费,从而在用量小的时候帮助省钱。

然而我惊喜地发现,说好跨平台的 PowerShell Core,怎么只能选 Windows 呢?还好我是个 Windows 粉,用就用吧。

Application Insights 可以用来监控 Function 的运行健康状况,也能在编写 Function 的时候用作控制台输出的捕获,开不开都行,不开省钱,开了省头发。

创建完成后,我们需要给这个 Function App 配置访问 VM 的权限。

Identity 菜单下,打开 System assigned 开关。这种授权方式可以点点鼠标就让 Azure 资源之间互相授权,而不用自己写代码对接各种 Key 什么的导致996。

然后转到需要被操作的 VM 页面,在 Access control (IAM) 中选择 Add a role assignment

在 Assign access to 选项中选择 Function App,然后找到刚才创建的 Function App,添加为 Owner。但需要注意的是,Owner 由于权限最大,并不是最佳实践,真正企业场景里请根据公司安全规范选择合适的权限,以免被人改Function 代码删 VM 跑路。

编写 Function 逻辑

在 Function App 创建完成后,点击进入 Functions,然后点击 Add,创建一个 Function,用于执行定时开机的逻辑。

选择 Timer Trigger

输入 Function 的名字,比如 FubaoTrigger,然后在 Schedule 中输入定时逻辑的表达式。

这个表达式使用 CRON 格式,拿 996 为例,周一到周六,每天早上9点的 CRON 为:0 0 9 * * 1-6

但要注意,这个时间为 UTC 时间。如果你需要更改时区,需要在 Function App 的 Configuration 中添加一个 WEBSITE_TIME_ZONE 的值,如中国大陆时区可配置为 China Standard Time,具体做法请查考文末微软文档链接。

创建完成后,进入 Code + Test,把里面的代码删掉跑路,替换为:

# Input bindings are passed in via param block.

param($Timer)

$subscriptionId = "你的订阅ID"

$tenantId = "你AAD的租户ID"

$rsgName = "目标VM的资源组名称"

$vmName = "目标VM的名称"

Select-AzSubscription -SubscriptionID $subscriptionId -TenantID $tenantId

Start-AzVM -ResourceGroupName $rsgName -Name $vmName

其中 tenantId 可到 Azure Active Directoy 里找到。

脚本中的 param($Timer) 虽然代码逻辑里用不到,但不能删除,这是 Timer Trigger 必须的参数,一删就爆。

Select-AzSubscriptionStart-AzVM 并不是 PowerShell 自带的模块,而是 Azure PowerShell 的模块,由于 Function 的 Host 上已经安装了 Azure PowerShell,所以此处才能直接使用。

保存代码后,点击 Test / Run,测试一下 Function 是否正常工作。

如果不出问题,我们就能看到目标 VM 从关机状态自动启动。

至此,这个 Azure Function 就可以在周一到周六,每天早上 9 点,准时启动 VM 了!至于定时关机,由于太简单不多介绍了,直接在 VM 的管理菜单里能找到。

参考:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer?tabs=csharp 

汪宇杰博客

.NET | Azure | 微软MVP

长按二维码获取我的最新技术分享

喜欢本篇内容请点个在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文章目录 | .NET Core on K8s学习之旅 (更新至20200618)

.NET Core on K8s学习之旅更新记录:-- 20200511 增加Ingress & Nginx Ingress介绍-- 20200515 增加Ocelot API网关集成示例介绍-- 20200525 增加Ingress实现灰度发布示例介绍1关于这个系列文章自从2018年底离开工作了3年的M公司加入X公司之后,开始了…

【Blog.Core重要升级】:封装服务扩展层

昨天有群里小伙伴咨询了一个问题:关于如何在Blog.Core项目中,实现多资源终端的问题,比如这样:一个AdminMvc的管理后台(MVC项目),一个WebApi项目,一个ConsoleApp的控制台项目&#xf…

如何激发团队潜能?

每个技术人员最终可能都会走上管理岗位,从最初的开发 Leader、到部门负责人、甚至到 CTO,这每一个角色的转变,都需要付出巨大的努力去进行思维的转变。最近读的《授权》这本书可以让我们更好地胜任管理这个岗位。本书的作者马凯特是一名海军军官&#xf…

快速打造属于你的接口自动化测试框架

1 接口测试接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。接口自动化相对于UI自动化来说,属于更底层的测试,这样带来的好处就是测试收益更大,…

Java Number Math 类方法

Java Math 类 Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。 Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。 public class Test { public static void main (String []args…

研发协同平台数据库死锁处理及改进

源宝导读:数据库死锁是高并发复杂系统都要面临课题,处理死锁问题没有一招制敌的标准方法,需要具体问题具体分析。本文将基于研发协同平台遇到的死锁案例,介绍从监控、分析到处理的完整过程和经验总结。一、背景研发协同平台使用的…

Java substring() 方法

substring() 方法返回字符串的子字符串。 语法 public String substring(int beginIndex)或public String substring(int beginIndex, int endIndex)参数 beginIndex – 起始索引(包括), 索引从 0 开始。 endIndex – 结束索引(不包括&…

简单说说async/await

小明用async/await写了几年的异步方法,但总没有完全理解里面的机制,他决定去请教邻居小花。小花听了小明的描述后说:首先你要明白异步的根本是什么?大白话解释异步就是:拉一个人(线程)帮着做一些…

Newtonsoft 六个超简单又实用的特性,值得一试 【下篇】

一:讲故事上一篇介绍的 6 个特性从园子里的反馈来看效果不错,那这一篇就再带来 6 个特性同大家一起欣赏。二:特性分析1. 像弱类型语言一样解析 json大家都知道弱类型的语言有很多,如: nodejs,python,php&am…

C++实现双栈结构(一个顺序表中使用两个栈)

因为平常栈中push的数据不会太多&#xff0c;为了节约空间&#xff0c;所以可以在一个顺序表中使用两个栈 结构图: 在这里我会留一个空间用来判断栈是否满&#xff01; #include <iostream> using namespace std; typedef int ElemType;class DoubleStack { private:El…

Redis凭啥这么快?只能做缓存?架构师道出了真相(颠覆你的认知)

Redis到底有多快Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库&#xff0c;由C语言编写&#xff0c;官方提供的数据是可以达到100000的QPS&#xff08;每秒内查询次数&#xff09;。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差&…

Java面向对象编程(基础部分)

面向对象编程(基础部分) 类与对象 01&#xff1a; public class ObjectWorkDemo {public static void main(String[] args){Cat cat1 new Cat();cat1.name "Tom";cat1.age 3;cat1.color "white";Cat cat2 new Cat();cat2.name "xiaohua"…

Blazor带我重玩前端(一)

写在前面曾经我和前端朋友聊天的时候&#xff0c;我说我希望有一天可以用C#写前端&#xff0c;不过当时更多的是美好的想象&#xff0c;这一切正变得真实……什么是Blazor我们知道浏览器可以正确解释并执行JavaScript代码&#xff0c;那么浏览器是如何执行C#代码的呢&#xff1…

Java面向对象编程(中级)

面向对象编程(中级) 包 访问修饰符 封装 01: public class Encapsulation01 {public static void main(String[] args){Person person new Person();person.name "Tom";person.setAge(30);person.setSalary(30000);} }class Person {public String name;private…

[Mvp.Blazor] 动态路由与钩子函数

&#xff08;Blazor组件的生命周期函数&#xff09;一直在学习也没有停下脚步&#xff0c;用着脑子还是挺好的&#xff0c;感觉可以更脚踏实地一下。最近偶尔也继续看了看Blazor&#xff0c;毕竟我也开源了一个项目嘛&#xff0c;基本我正式开源的项目都会负责到底&#xff0c;…

Java面向对象编程(高级)

面向对象编程(高级) 类变量和类方法 01: package ChildDemo;public class Child {private String name;public static int cnt 0;public Child(String name){this.name name;}public void join(){System.out.println(name "join the game");} }//package ChildDe…

.NET Core + Kubernetes:Volume

和 Docker 类似&#xff0c;Kubernetes 中也提供了 Volume 来实现数据卷挂载&#xff0c;但 Kubernetes 中 Volume 是基于 Pod&#xff0c;而不是容器&#xff0c;它可被 Pod 中多个容器共享&#xff0c;另外 Kubernetes 中提供比较丰富的 Volume 类型[1]&#xff0c;如&#…