运维编排场景系列----从实例中拷贝文件到OSS

简介: ### 场景简介 我们经常会有这样的运维场景,从某台线上的机器把日志文件拷贝出来或者是进程卡主了 jstack一下输出到某个文件里然后进行分析。我们使用osscmd把数据导到oss里,但是手动配置过程实在是太太太麻烦了。

场景简介

我们经常会有这样的运维场景,从某台线上的机器把日志文件拷贝出来或者是进程卡主了 jstack一下输出到某个文件里然后进行分析。我们使用osscmd把数据导到oss里,但是手动配置过程实在是太太太麻烦了。运维编排可以很easy的解决这类问题。

解决方案

从实例中拷贝文件可以利用云助手的RunCommand去到机器上去调用ossutil做数据拷贝,关键问题是AK怎么传,当然我们可以把AK当参数以命令的方式传入,但是这种太不安全了,相当于AK明文传输。那么有没有别的办法解决AK明文传输的问题呢?此时就想到了InstanceRole的功能,可以通过给instance attach一个ram role,那么在实例内部curl某个固定地址就能拿到以这个role身份产生的sts-token. 详细参见文档https://help.aliyun.com/document_detail/54235.html?spm=a2c4g.11186623.6.856.j7zBaK

curl http://100.100.100.200/latest/meta-data/Ram/security-credentials/{{InstanceAssumeRole}}

以上AK的问题解决了,另外的问题ossutil在实例中访问不了公网的情况怎么下载呢?咨询了oss的支持同事,他们并不提供内网下载的地址。 只能自己搭建了,我们自己创建了个bucket为oos-public的bucket提供全局只读的权限可以方便内网下载。解析json我们需要个方便的工具jq,我们同时把这个文件传到公共bucket上

经过调试最终的脚本为

test -e ossutil64 || wget https://oos-public.oss-{{ACS::RegionId}}-internal.aliyuncs.com/x64/ossutil64 && chmod 755 ossutil64
test -e jq || wget https://oos-public.oss-{{ACS::RegionId}}-internal.aliyuncs.com/x64/jq && chmod 755 jq
stsToken=`curl http://100.100.100.200/latest/meta-data/Ram/security-credentials/{{InstanceAssumeRole}}`
accessKeyId=`echo $stsToken |./jq .AccessKeyId | awk -F'\"' '{print $2}'` 
accessKeySecret=`echo $stsToken | ./jq .AccessKeySecret | awk -F'\"' '{print $2}' 
securityToken=`echo $stsToken | ./jq .SecurityToken | awk -F'\"' '{print $2}' 
endpoint=https://oss-{{ACS::RegionId}}.aliyuncs.com;
./ossutil64 -i $accessKeyId -k $accessKeySecret -t $securityToken -e $endpoint cp {{SrcUrl}} {{DestUrl}}

再转换成OOS模板

{
    "FormatVersion": "OOS-2019-06-01",
    "Description": "Tag ECS Instance by the RunCommand invocation result.",
    "Parameters": {
        "InstanceId": {
            "Type": "String",
            "Description": "the Instance Id to operate in linux.",
            "MinLength": 1,
            "MaxLength": 30
        },
        "SrcUrl": {
            "Type": "String",
            "Description": "command content to run in linux ecs."
        },
        "DestUrl": {
            "Type": "String",
            "Description": "command content to run in linux ecs."
        },
        "InstanceAssumeRole": {
            "Type": "String",
            "Description": ""
        },
        "OOSAssumeRole": {
            "Type": "String",
            "Description": "oos assume this role to execution task.",
            "Default": "OOSServiceRole"
        }
    },
    "RamRole": "{{OOSAssumeRole}}",
    "Tasks": [{
            "Name": "checkInstanceReady",
            "Action": "ACS::CheckFor",
            "Description": "describe instances with specified parameters, refer them here: https://help.aliyun.com/document_detail/63440.html",
            "Properties": {
                "API": "DescribeInstances",
                "Service": "ECS",
                "PropertySelector": "Instances.Instance[].Status",
                "DesiredValues": [
                    "Running"
                ],
                "Parameters": {
                    "InstanceIds": ["{{ InstanceId }}"]
                }
            }
        },
        {
            "Name": "runCommand",
            "Action": "ACS::ECS::RunCommand",
            "Description": "",
            "Properties": {
                "commandContent": {
                  "Fn::Join": [ "\n", [
                        "test -e oos || mkdir oos;",
                        "cd oos;",
                        "test -e ossutil64 || wget https://oos-public.oss-{{ACS::RegionId}}-internal.aliyuncs.com/x64/ossutil64 && chmod 755 ossutil64",
                        "test -e jq || wget https://oos-public.oss-{{ACS::RegionId}}-internal.aliyuncs.com/x64/jq && chmod 755 jq",
                        "stsToken=`curl http://100.100.100.200/latest/meta-data/Ram/security-credentials/{{InstanceAssumeRole}}`",
                        "accessKeyId=`echo $stsToken |./jq .AccessKeyId | awk -F'\"' '{print $2}'` ;",
                        "accessKeySecret=`echo $stsToken | ./jq .AccessKeySecret | awk -F'\"' '{print $2}'` ;",
                        "securityToken=`echo $stsToken | ./jq .SecurityToken | awk -F'\"' '{print $2}'` ;",
                        "endpoint=https://oss-{{ACS::RegionId}}-internal.aliyuncs.com;",
                        "./ossutil64 -i $accessKeyId -k $accessKeySecret -t $securityToken -e $endpoint cp {{SrcUrl}} {{DestUrl}}" 
                    ]
                  ]
                },
               
                "commandType": "RunShellScript",
                "instanceId": "{{InstanceId}}"
            },
            "Outputs": {
                "CommandOutput":{
                    "Type": "String",
                    "ValueSelector": "InvocationResult[].Output"
                }
            }
        }
    ],
    "Outputs": {}
}

传入参数 实例ID,拷贝的文件,拷到哪,传好之后执行。

undefined

执行成功后的结果
undefined

根据Execution的执行日志可以看到执行过程 base64 decode出来后可以看到shell执行的具体信息,从结果上看是成功了,再到oss上看,文件在不在

undefined

总结

以上我们介绍了如果使用运维编排方便的从实例中拷贝文件到OSS上,结合拷贝文件的场景与执行命令的组合,我们可以方便的做出到某台机器jstack输出文件并拷贝出来等相应场景。目前运维编排(OOS)处于内测中,欢迎试用提意见

欢迎使用OOS

OOS管理控制台的链接: https://home.console.aliyun.com/redirect.htm?productId=ecs&path=automation/region/
OOS帮助文档的链接
OOS客户支持钉钉群:23330931

系列文章

主题文章

阿里云重磅发布云上自动化利器——运维编排OOS

最佳实践

玩转运维编排服务的权限:Assume Role+Pass Role

场景系列

运维编排场景系列-----给ECS实例自动打TAG
运维编排场景系列----从实例中拷贝文件到OSS
运维编排场景系列----给实例加到SLS机器组

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
2778 28
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
1424 56
|
弹性计算 JSON 运维
阿里云ECS实例运维属性-如何控制实例的宕机表现
介绍如何通过运维属性指定阿里云ECS的宕机运维表现等
|
存储 运维 Java
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
391 2
|
XML 运维 Java
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
384 1
|
存储 弹性计算 数据管理
【阿里云弹性计算】ECS实例的冷热数据管理:利用阿里云 OSS 与 ECS 的高效协同
【5月更文挑战第28天】阿里云ECS与OSS协同,实现弹性计算服务的高效数据管理。ECS处理热数据,OSS存储冷数据,降低存储成本,提升性能。通过自动化策略实现数据自动迁移,优化实例性能,适用于电商图片、日志存储等场景。注意迁移策略设置和数据安全,为企业带来更大价值和竞争力。
562 1
|
存储 运维 NoSQL
通过OOS实现定时备份Redis实例转储到OSS
基于阿里云 Redis 备份功能,现结合 OOS 推出自动转储至 OSS 的新方案,解决了数据安全风险、运维繁琐、成本增加和效率低下等问题。新方案亮点包括: 1. 数据安全性提高:备份文件自动上传至OSS,利用OSS的数据冗余存储,保证数据在硬件故障时的持久性和可用性。 2. 完全自动化:设置好定时规则后,备份和转储过程无需人工干预。 3. 多实例多地域集中管理:支持一次选择多个实例和跨区域备份,简化管理。 4. 灵活的备份策略和成本控制:自定义备份频率,并通过OSS生命周期管理策略控制成本。 5. 监控和告警:集成OSS和云监控,实时掌握备份状态,及时处理异常。
通过OOS实现定时备份Redis实例转储到OSS
|
运维 前端开发 数据库
快,文本,需求,痛点,添加快捷链接,必不可少--------运维之提升运维速度的方法,一个简单的快捷链接添加页面添加写法+视频播放速度一定要能够设置5px 15px的样式,.exe文件可以提升快捷
快,文本,需求,痛点,添加快捷链接,必不可少--------运维之提升运维速度的方法,一个简单的快捷链接添加页面添加写法+视频播放速度一定要能够设置5px 15px的样式,.exe文件可以提升快捷
|
存储 运维 Serverless
Serverless 使用OOS将http文件转存到对象存储
阿里云OOS提供了一种高效、灵活的解决方案,用于自动化HTTP文件到对象存储的转存。通过OOS,用户可以使用函数计算FC执行Python脚本,直接将文件从HTTP源转移到OSS,无需本地存储或额外ECS实例,降低了成本,提高了效率,并减少了错误。实践步骤包括创建OOS模板并在FC上运行。使用此功能需开通FC服务,创建RAM角色并授权访问OSS。附录中提供了示例模板和Python脚本说明。
|
弹性计算 开发工具 对象存储
ECS实例通过OSS内网地址访问OSS资源
ECS实例通过OSS内网地址访问OSS资源
751 0