1、OpenAPI Explorer

  记录一下使用阿里云 Open API 自动化/脚本化 “ECS 公网 IP 转化弹性公网 IP”的实现 全过程。原博客地址:https://www.markeditor.com/file/get/e156893757a36a62d761e2d79950d0da?t=1564731800

   开始编码之前,我们要有一个良好的调试环境,来验证程序是否运行良好。阿里云提供了 OpenAPI Explorer,提供了运行 demo,UI 运行器,Cloud Shell(一个带完整运行环境的 shell)等功能,帮助我们调试。并且使用 OpenAPI Explorer 会自动获取当前用户的身份,从而生成临时 secret 用于调用鉴权,更加方便安全。事实上整个调试运行过程(包括最终一键转换 150+ 实例),都是使用 OpenAPI Explorer 的 UI 运行器和 Cloud Shell 来做的。打开地址:https://api.aliyun.com/?spm=a2c4g.11186623.2.9.ad1712fduNHxC3#/?product=Cms 

  阿里云 Open API 的 sdk 支持非常丰富的语言类型,这里使用了 golang。

  产品选择云服务器,DescribeInstances,选择必填项 RegionId,其余过滤条件暂时不选,然后发起调用。使用 Cloud Shell 方式进行同样的操作。Cloud Shell 与 UI 运行器不同,是个完整的 shell 环境,依赖 SDK 来执行,两种方式最终执行结果都是一样。

  第一种结果是json 格式,获取到了当前所有的实例,以及完整的实例信息

  第二种使用使用 Cloud Shell 方式进行同样的操作,发现获取的结果一致。

2、完整源码

  想了解更详细,请参考 https://www.markeditor.com/file/get/e156893757a36a62d761e2d79950d0da?t=1564731800

  这里直接贴出最终源码:

package main

import (
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
"os"
"time"
)
// 第一步:获取所有需要转换的实例,详见 describeAllInstances getInstancesNum函数
// 第二步:转化公网IP为按量付费,详见 reduceNetwork 函数
// 第三步:将按量公网IP转化为弹性IP,详见 convertToEIP 函数
// 第四步:主函数调用,详见 main 函数 // 选取运行状态为Running 的实例
var STATUS = "Running"
// 设置实例列表接口分页查询每页 50 个
var PAGE_SIZE = ""
// 灰度处理,仅对指定数量的实例进行转化
var TOTAL_SIZE = // 网络付费类型为按量付费
var NETWORK_CHARGE_TYPE = "PayByTraffic" func main() {
// 生成 ecs 的操作工具,临时 access token 会在 Cloud Shell 中自动生成,可通过环境变量获取
client, err := ecs.NewClientWithAccessKey("cn-beijing", os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
if err != nil {
fmt.Print(err.Error())
}
var instances []MyInstance
// 取出所有需要转化的实例
instances = describeAllInstances(client)
// 手动设置一个实例进行转换
//instances = append(instances, MyInstance{"iZ2ze9j5p0uyrr0iz3aq2nZ", 1})
fmt.Printf("Number of instances processed : %d\n", len(instances))
cutInstances := instances
// 灰度处理,仅对指定数量的实例进行转化
if TOTAL_SIZE > && TOTAL_SIZE < len(instances){
cutInstances = instances[:TOTAL_SIZE]
}
fmt.Printf("Number of instances actually processed : %d\n", len(cutInstances))
reduceNetwork(client, cutInstances)
time.Sleep(time.Duration()*time.Second)
convertToEIP(client, cutInstances)
} // 接受实例列表,将指定实例的公网IP转为弹性 IP
func convertToEIP(client *ecs.Client, instances []MyInstance) {
for _, instance := range instances {
request := ecs.CreateConvertNatPublicIpToEipRequest()
request.Scheme = "https"
request.InstanceId = instance.id
response, err := client.ConvertNatPublicIpToEip(request)
if err != nil {
// 失败重试
response, err = client.ConvertNatPublicIpToEip(request)
if err != nil {
fmt.Println(err.Error())
// 再重试
time.Sleep(time.Duration()*time.Second)
response, err = client.ConvertNatPublicIpToEip(request)
}
}
fmt.Printf("The result status of converting to eip is %v, the instance's id is [%s]\n", response.IsSuccess(), instance.id)
}
}
// 接受实例列表,将实例转为指定网络付费类型,与指定带宽值(对于按量,是带宽峰值)
func reduceNetwork(client *ecs.Client, instances []MyInstance) {
for _, instance := range instances {
request := ecs.CreateModifyInstanceNetworkSpecRequest()
request.Scheme = "https"
// 设置公网出口带宽
request.InternetMaxBandwidthOut = requests.NewInteger(instance.bandWidth)
// 设置要修改的实例id,每次只能修改一个
request.InstanceId = instance.id
// 设置公网付费类型
request.NetworkChargeType = NETWORK_CHARGE_TYPE
// 发起请求
response, err := client.ModifyInstanceNetworkSpec(request)
if err != nil {
// 失败重试
response, err = client.ModifyInstanceNetworkSpec(request)
if err != nil {
fmt.Print(err.Error())
time.Sleep(time.Duration()*time.Second)
// 再重试
response, err = client.ModifyInstanceNetworkSpec(request)
}
}
fmt.Printf("The result status of reducing instance's bandwidth is %v, the instance's id is [%s]\n", response.IsSuccess(), instance.id)
}
} // 根据固定好的条件查询所有相应实例,返回其实例 id 与公网带宽出口值
func describeAllInstances(client *ecs.Client) []MyInstance{
num := getInstancesNum(client)
fmt.Printf("total instance count: %d\n", num)
// 存放所需的所有实例的id与带宽信息
var shouldConvertInstance []MyInstance
// 用于记录分页查询到了第几页
var pageCount int
// 分页查询所有实例
for true {
pageCount++ request := ecs.CreateDescribeInstancesRequest()
// 设置过滤条件
request.Status = STATUS
// 设置分页查询信息
request.PageNumber = requests.NewInteger(pageCount)
request.PageSize = requests.Integer(PAGE_SIZE)
request.Scheme = "https"
// 执行查询
response, err := client.DescribeInstances(request)
if err != nil {
fmt.Print(err.Error())
}
// 取出实例列表
instances := response.Instances.Instance if len(instances) == {
break
}
// 从本分页过滤并取出所需实例信息
for _, instance := range instances {
if len(instance.PublicIpAddress.IpAddress) == {
continue
}
shouldConvertInstance = append(shouldConvertInstance, MyInstance{instance.InstanceId, instance.InternetMaxBandwidthOut})
}
time.Sleep(time.Duration()*time.Second)
}
return shouldConvertInstance
}
// 获取实例正在运行的总数量
func getInstancesNum(client *ecs.Client) int {
request := ecs.CreateDescribeInstancesRequest()
request.Status = STATUS
request.PageNumber = ""
request.PageSize = ""
request.Scheme = "https"
response, err := client.DescribeInstances(request)
if err != nil {
fmt.Print(err.Error())
}
time.Sleep(time.Duration()*time.Second)
return response.TotalCount
} type MyInstance struct{
id string
bandWidth int
}

  将整个运行脚本复制到 Cloud Shell 中,比如叫demo.go,然后运行go run demo.go

  好了,此时我们已经完成所有实例的 EIP 转化。转换完成后,再重试一次,确定已经没有实例需要处理了。

 

  执行完成之后,所有的ecs实例都自动将外网ip转换成EIP了,接下来就可以将EIP加入到共享带宽了。为什么将公网ip转换成EIP请参考:https://www.markeditor.com/file/get/e156893757a36a62d761e2d79950d0da?t=1564731800 感谢这位技术大牛提供的源码,为运维解决了烦恼,接下来就是去学习阿里的open api和oos运维编排服务了。

阿里云Open API自动化脚本—ECS公网IP转化弹性公网IP的更多相关文章

  1. nodejs版 阿里云开放api签名算法

    阿里云 API 签名 github:https://github.com/liuyinglong/aliyun; npm :https://www.npmjs.com/package/aliyun-a ...

  2. C#调用阿里云CDN API刷新缓存

    使用CDN必须要解决CDN缓存的问题,要么在每次更新文件时生成不同的URL,要么在每次更新文件时刷新CDN缓存.我们在一个实际应用场景中用到了后者,所以需要调用阿里云CDN的API进行缓存刷新的操作. ...

  3. 阿里云DNS api接口 shell 更改DNS解析

    可定时任务检查域名解析,调用alidns.sh更新DNS解析 #!/bin/bash # alidns.sh #https://www.cnblogs.com/elvi/p/11663910.html ...

  4. 阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性公网IP是独立的公网IP资源,可以绑定到阿里云专有网络VPC类型的ECS、NAT网关、私网负载均衡SLB上,并可以动态解绑,实现公网IP和ECS、NAT网关、SLB的解耦,满足灵活管理的要求。阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性络VPC类型的E

    阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性公网IP是独立的公网关.私网负载均衡SLB上,并可以动态解绑,实现公网IP和ECS.NAT网关.SLB的解耦,满足灵活管理的要求.

  5. 阿里云发布CloudOps白皮书,ECS自动化运维套件新升级

    12月10 日,2021云上架构与运维峰会上,阿里云发布业界首部<云上自动化运维白皮书>(简称CloudOps白皮书),并在其中提出了CloudOps成熟度模型.同时,阿里云还宣布了ECS ...

  6. 基于阿里云 DNS API 实现的 DDNS 工具

    0.简要介绍 0.1 思路说明 AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具,借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能.工具核心就是调用了阿 ...

  7. springmvc学习笔记--支持文件上传和阿里云OSS API简介

    前言: Web开发中图片上传的功能很常见, 本篇博客来讲述下springmvc如何实现图片上传的功能. 主要讲述依赖包引入, 配置项, 本地存储和云存储方案(阿里云的OSS服务). 铺垫: 文件上传是 ...

  8. 阿里云zabbix的python脚本

    由于阿里云只能用465端口.所以这个zabbix的脚本修改成了465端口的python脚本. 修改于https://www.jianshu.com/p/9d6941dabb47 #!/usr/bin/ ...

  9. 阿里云上安装启动nginx 以及在个人电脑上通过公网ip访问遇到的问题

    1.安装依赖包 //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.下载并解压安装包 ...

随机推荐

  1. React之this.refs, 实现数据双向绑定

    1.实现数据双向绑定 将input组件与this.state属性绑定,要么是readonly, 要么使用onChange事件: 获取input元素的value值,有两种方式: 1) e.target. ...

  2. CodeForces–830A--二分,贪心

    Office Keys time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  3. Primes and Multiplication

    C - Primes and Multiplication 思路:找到x的所有质数因子,用一个vector储存起来,然后对于每一个质因子来说,我们要找到它对最后的答案的贡献的大小,即要找到它在最后的乘 ...

  4. fanout(Publish/Subscribe)发布/订阅

    引言 它是一种通过广播方式发送消息的路由器,所有和exchange建立的绑定关系的队列都会接收到消息 不处理路由键,只需要简单的将队列绑定到交换机上 fanout交换机转发消息是最快的,它不需要做路由 ...

  5. 前端 Jenkins 自动化部署

    这两天折腾了一下 Jenkins 持续集成,由于公司使用自己搭建的 svn 服务器来进行代码管理,因此这里 Jenkins 是针对 svn 服务器来进行的配置,Git 配置基本一致,后面也介绍了下针对 ...

  6. JETSON TK1 ~ 安装Cuda和OpenCV3

    一:安装Cuda6.5 1:下载安装包 Cuda6.5 2.在TK1上安装软件包: cd ~/Downloads sudo dpkg -i cuda-repo-l4t-r21.3-6-5-prod_6 ...

  7. 8.2 HTML表单提交

    一.form表单 <form>用于向服务器提交数据,比如账号密码 使用method="get" 提交数据 是常用的提交数据的方式 如果form元素没有提供method属 ...

  8. 连接数据库出现The server time zone value '�й���׼ʱ��' is unrecogni等问题的解决方案

    使用JDBC连接数据库出现The server time zone value '�й���׼ʱ��' is解决方案 ** 将jdbc.properties中url后加入?serverTimezone ...

  9. (转载)深入理解Java:内省(Introspector)

    本文转载自:https://www.cnblogs.com/peida/archive/2013/06/03/3090842.html 一些概念: 内省(Introspector) 是Java 语言对 ...

  10. 备忘录:“#ifdef __cplusplus extern "C" { #endif”的定义

    看一些程序的时候老是有“#ifdef __cplusplusextern "C" {#endif”的定义,搞搞清楚是怎么回事: Microsoft-Specific Predefi ...