背景
下发文件是运维实例过程中最常见的动作之一,在一项对自动化运维工具的使用场景调研中,文件下发按照频繁程度排在前三位。
当前向ECS下发文件主要有以下几种方式:
- 上传至OSS,再下载到实例中;
- 通过远程文件拷贝命令scp向实例拷贝文件;
- 通过第三方软件下发文件。
OSS方式是常见的下发文件方式,但操作稍显繁琐,需要用户开通OSS,产生额外的费用;
scp方式只能在通公网的机器上使用,需要登录,还可能需要跳板机,局限性较大,且难以进行文件的批量下发,自动化程度低;
通过第三方软件下发需要用户自行进行安装和管理,上手难度较高,且第三方软件的安全性不能得到保证。
对于小文件下发的场景,如配置文件、脚本等,云助手提供了一种新的方式。在控制台上,从ECS实例详情页通过下发远程文件功能下发。通过SendFile OpenAPI,可以批量向实例下发文件,更可以通过OOS进行编排,提高运维的自动化程度。当前通过云助手下发的文件大小不能超过32K,对于一般的脚本、配置文件,32K基本满足要求。而对于大文件的下发,仍需借助OSS。
功能介绍
通过远程连接操作ECS实例时,您是否苦于无法方便的传输文件?
在对一批实例进行运维时,您是否还在一台台的拷贝文件?
通过云助手的下发文件功能,这些场景都可以更加便捷!
基于云助手SendFile、DescribeSendFileResults API的组合,可以通过ECS控制台或OpenAPI向实例中指定路径批量下发文件,文件大小在Base64编码后不能超过32KB。如果指定的路径不存在,会自动创建路径。对于Linux实例,可以指定文件的Owner,Group,Mode等参数。
控制台使用
通过ECS管理控制台有两种方式下发文件,一种是在实例详情页向指定实例发送文件,另一种是从云助手控制台批量的发送文件。
从实例详情页发送文件
- 进入ECS实例详情页面,进入左侧本实例远程命令。
- 将待下发的文件通过点击或拖拽的方式上传,或选择粘贴文档内容,下发文本文件。
- 点击下发按钮开始下发文件。
从云助手控制台下发文件
在云助手控制台发送文件窗口,将待下发的文件通过点击或拖拽的方式上传,或选择粘贴文档内容,进行配置并点击执行进行文件下发。云助手控制台可以批量的向实例下发文件。
相关API
- 通过云助手向一台或多台ECS实例下发远程文件:SendFile
- 查询云助手下发文件列表及状态:DescribeSendFileResults
应用举例
通过OpenAPI从本地读取并下发文件到实例
通过SendFile API可以将文件从本地批量发送至实例的目标路径下,实例代码如下:
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
SendFileRequest request = new SendFileRequest();
request.setRegionId("cn-hangzhou");
request.setName("test.sh");
request.setTargetDir("/root");
List<String> instanceIdList = new ArrayList<String>();
instanceIdList.add("i-xxxxxx");
request.setInstanceIds(instanceIdList);
//filePath为本地文件路径,以Base64方式读入
byte[] bytes = Files.readAllBytes(Paths.get(filePath));
request.setContent(Base64.getEncoder().encodeToString(bytes));
request.setContentType("Base64");
try {
SendFileResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
根据SendFile返回的InvokeId字段,可以通过DescribeSendFileResults查看下发文件任务的状态和结果:
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
DescribeSendFileResultsRequest request = new DescribeSendFileResultsRequest();
request.setRegionId("cn-hangzhou");
request.setInvokeId("t-xxxxxx");
try {
DescribeSendFileResultsResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
通过阿里云CLI下发文件
还可以通过阿里云CLI向目标实例下发文件。
$ aliyun ecs SendFile --Content your_content --InstanceId.1 i-xxxxxxx --Name test.sh --TargetDir /root
{
"InvokeId": "f-hz0x8xxxxx",
"RequestId": "BBEC9000-B0A8-47D9-B105-XXXXX"
}
再通过DescribeSendFileResults轮询文件下发结果。
aliyun ecs DescribeSendFileResults --InvokeId f-hz0x8xxxxx --waiter expr='Invocations.Invocation[0].InvocationStatus' to=Success
展望
由于文件大小有32KB的限制,该功能当前有一定的局限性。SendFile API在未来会借助OSS的能力,完善大文件的下发场景。
发送文件是运维场景中非常基础的能力,通过结合运维编排OOS的编排能力,可以实现非常丰富的功能,提高运维自动化和智能化。