阿里云OpenAPI实现DDNS及CDN回源地址定时更新

主流云服务提供商、互联网技术公司都拥有自建的开放API平台。通过这些API平台,开发者可以以编程的形式对该公司提供的各项服务进行操作。

家庭网络对外网网络服务搭建指南 中,我们提到如果加进行PPPoE重拨时对外的公网IP将会发生变化,而我们在进行DNS直接解析到家庭公网IP或者利用CDN消除端口并加速网站中都需要对IP进行设置。对于DDNS解析来说,中高端路由器或开源路由器操作系统中应存在以插件形式提供对应DNS解析服务商的DDNS服务插件。但对于CDN来说,一般情况下都没有对CDN服务记录进行修改的插件。因此,最通用的办法还是通过对应服务供应商开放平台中提供的API进行操作。本文则以阿里云为例,通过阿里云OpenAPI实现以上两种不同操作。

一、编程前准备

在阿里云平台,如果你想远程调用OpenAPI你需要通过该账户主账户或某一拥有该权限的RAM账户授权获得AccessKey及对应Secret,而后通过AccessKey作为参数对API进行操作。本节将获取AccessKey的流程展示出来。

预期目标:定时启动脚本=>脚本执行DDNS及CDN回源地址更新操作=>发送结果邮件至邮箱

以上操作需要:

  • 预先查询对应API
  • 自己的公网IP
  • 提供邮箱SMTP服务授权码

(一)、创建RAM账户

为保证主账户安全,一般仅在RAM账户(即仅拥有某一产品、资源组管理、查询权限的子账户)获取AccessKey,因此第一步为创建RAM账户

1、RAM控制台

(1)、登录并进入阿里云控制台

阿里云控制台概览

(2)、进入用户菜单访问控制页

用户菜单栏

(3)、进入用户菜单页

RAM访问控制用户页

2、创建用户

创建用户页拥有大量选项,根据自己使用需求开放对应控制权

(1)、创建基础账户

本文因需要使用AccessKey,因此勾选 编程访问,如有需要则勾选控制台访问。在这一步将需要对阿里云绑定的号码进行短信验证。

基础信息填写步骤

这一步创建好的账户没有任何权限,需要下一步添加权限。同时需要保存好AccessKeyAccessKey Secret,该页面关闭后如需再次查询需要进行短信验证。推荐保存到本地。

基础RAM用户创建成功

3、添加权限

(1)、权限选择及查询

阿里云RAM访问控制可以通过系统策略及自定义策略对RAM账户进行细粒度的权限授权及管控,需要通过使用拥有一套完整体系的 权限策略语法 对不同层级、功能、资源进行自定义策略创建。而本文为简单方便仅使用阿里云预定义的 系统策略

通过权限策略语法创建重启ECS实例权限策略

可以直接在创建用户页面下方 添加权限 按钮打开选中账户添加权限抽屉页,或者将该用户移动到某一具有权限分配的用户组中,此处直接使用前者方法。

添加权限按钮

添加权限页面中主要包含三个部分,授权应用范围(一般个人用户不会划分资源组,选择整个云账户即可),被授权主体,权限选择栏。我们此处需要选择 AliyunDNSFullAccess AliyunCDNFullAccess 两种权限。如需自定义策略添加权限,请阅读 阿里云访问控制文档 权限策略语法及结构

添加权限页
授权结果页

此时,你已经创建并授权RAM账户,下一步即可开始查询API编程啦。

(二)、查询API

阿里云原本的OpenAPI Explorer已更新为 OpenAPI 开发者门户,在该页面可以对阿里云所有云服务产品提供的OpenAPI进行查询。

OpenAPI开发者门户

1、查询CDN及DNS 记录修改API

在搜索栏中填入需要查询的产品类型就会出现简单易懂的搜索提示,选择对应产品进入即可。

CDN API

经过搜索,我们最终确定需要的API有 ModifyCdnDomain、UpdateDomainRecord 两个API。它们分别Required参数为 DomainName、RecordId,记录下来后,我们就可以在API 调试 Tab里查看具体实例了。

ModifyCdnDomain API
UpdateDomainRecord API

2、通过OpenAPI 开发者门户调试API

请注意SDK版本选择,推荐使用升级版SDK,同时下方代码框内有多种语言可供选择。在左侧表单中填写对应参数即可点击 发起调用 查看结果。注意:该调用将会对账户上对应产品调用生效,请小心使用。

DescribeDomainRecords API 调试实例

(三)、邮箱SMTP授权码获取

SMTP协议是一种可靠有效的电子邮件传输协议,主流邮箱在设置后均支持SMTP服务。下面将以QQ邮箱为例获取SMTP授权码(推荐新建一个账户专门用于自动化系统发邮件)。

1、获取SMTP授权码流程

(1)、进入邮箱设置页面

QQ邮箱首页

(2)、进入账户Tab选项卡

QQ邮箱设置页面

(3)、开启SMTP服务并获取授权码

我因为图方便除了CardDAV和CalDAV(群辉可以做CardDAV、CalDAV服务器)就直接都开了。

开启SMTP服务

进行密保手机验证

验证密保模态框

授权码可以同时在多个地方使用,在忘记授权码时可以在此处重新生成授权码,旧授权码仍然有效。保存授权码到本地。

授权码

此时你就可以开始编程了。

二、API调用脚本编写

编程阶段实际上是最快的阶段,因为只需要将对应的API调用并返回结果就行。但这样对结果的查询有些麻烦,因此我们加入了将刷新结果通过SMTP服务发送给目标邮箱的过程。本文使用Nodejs+Gulp+TypeScript+VSCode进行代码编写。

(一)、搭建项目

由于项目搭建过程需要花费较多精力进行tsconfig等配置,因此此处省略,以后将会对如何搭建上述项目template开文描述。(我的项目模板上传在Oyxf’sGitlab上,关于jest和commitzen还有点bug。gitlab暂时只public了几个项目,有兴趣的可以看一看)

项目结构概览结果:

项目目录结构

需要安装的npm包(推荐换国内源或自建NexusRepository)有用于网络请求的Axios、阿里云OpenAPI SDK for TypeScript、emailjs(用于邮件发送)。

npm install @alicloud/alidns20150109 @alicloud/cdn20180510 @alicloud/openapi-client @types/axios emailjs --save

(二)、获取公网IP模块

通过互联网开放API我们可以快速的获取自己的公网IP,ipify 提供的api使用Axios获取公网IP:

API调用结果

(三)、调用阿里云API模块

然后可以先把阿里云代码实例抄过来(为了方便我们就不把模块独立成文件了):

ModifyCdnDomainRequest API

然后可以填下参数测试一下:

调用结果

如果你输出的结果仅包含一个RequestId在Body里面,说明调用成功,此时你可以前往阿里云控制台查看修改记录结果。如果出现调用错误如下,则请查找对应API错误代码:

调用报错
错误码查询

如果你是使用CDN方法解析域名,那么你到这一步就完成了对OpenAPI所需要的编写的代码,可以跳过下一小节关于DNS解析记录修改的叙述到

,后面的操作就很简单了,同样的调用查询,但DNS记录修改中有一个RecordId需要通过获取DNS列表获取

DNS解析

利用 DescribeDomainRecords API 查询DNS RecordId信息。该API需要DomainName(域名名称比如baidu.com)及RRKeyword(域名前缀比如 www)两个参数即可。

利用 DescribeDomainRecords 查询DNS RecordId

然后就可以使用recordId进行DNS记录更新了,简单把以上三个步骤和更新DNS解析改写串联成Promise:为了(由于WordPress暂时没有装比较好的CodeHighlighter就暂时用图片代替)

Promise间信息承载体
Main函数
公网IP Fetcher
CdnClient类,简单封装
DnsClient类,简单封装
DnsClient类,简单封装

调用结果

(四)、使用SMTP协议发送结果

使用emailjs的SMTPClient发送邮件

EmailSender类
刷新结果Console输出

由于我的DNS记录已经是当前公网IP了,因此刷新失败,其实可以将dns_refresh_result填写为该ErrorMessage。在发送的邮件中显示更加清晰。

邮件展示

总体来说,代码是比较简单的,只是进行几个API的调用和Promise的衔接。但这个流程拥有巨大的扩展性。而后定时刷新则需要使用一些定时任务库比如(node-schedule)或者使用系统定时任务,定时执行一次ts-node命令。而我是在群辉在使用Cronjob执行。

Cronjob Editor

(五)、代码展示

以上代码仅仅是最基础的代码,应该将错误处理完善,同时记录日志,在发送内部错误是将日志持久化存储或发送到log server中。我写这篇博客之前就已经完成了该代码相对完善的编写,可以作为一个小Promise事件框架使用。下面简单截下图

main函数
全局变量类
事件处理器(组件)
执行器类

三、总结

总的来说,各大服务商开放平台可以给我开发学习提供巨大便利。同时他们的API格式和SDK设计都可以为我们开发提供参考。

(一)、各大开放平台

下面罗列一下部分开放平台(随机顺序,想到哪写到哪)

版本记录:

  • v0.1w 2021/3/21 21:00
  • 0.3ep 2021/3/22 11:20
  • v1.0aep 2021/3/22 19:30 基本内容完成

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注