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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000 次 1年
简介: ### 场景简介 我们经常会有这样的运维场景,从某台线上的机器把日志文件拷贝出来或者是进程卡主了 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机器组

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
运维 Kubernetes 网络安全
Ansible自动化运维工具之主机管理与自定义配置文件(2)
Ansible自动化运维工具之主机管理与自定义配置文件(2)
183 0
|
4月前
|
弹性计算 人工智能 数据管理
AI场景下的对象存储OSS数据管理实践
本文介绍了ECS和OSS的操作流程,分为两大部分。第一部分详细讲解了ECS的登录、密码重置、安全组设置及OSSUTIL工具的安装与配置,通过实验创建并管理存储桶,上传下载文件,确保资源及时释放。第二部分则聚焦于OSSFS工具的应用,演示如何将对象存储挂载为磁盘,进行大文件加载与模型训练,强调环境搭建(如Conda环境)及依赖安装步骤,确保实验结束后正确清理AccessKey和相关资源。整个过程注重操作细节与安全性,帮助用户高效利用云资源完成实验任务。
700 161
|
2月前
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
222 28
|
3月前
|
存储 人工智能 数据管理
云端问道17期方案教学-AI场景下的对象存储OSS数据管理实践
本文介绍了AI场景下的对象存储OSS数据管理实践,由阿里云技术专家明锦分享。主要内容分为两部分:1) AI场景下对象存储实践方案,包括对象存储的应用、优势及在模型推理中的优化;2) OSS常用工具介绍,如OSSFS、Python SDK、Go SDK等,并详细说明了这些工具的特点和使用场景。文中还探讨了不同模式下的性能优化,以及即将推出的OS Connector for AI/ML工具,旨在提升数据下载速度和IO性能。
|
6月前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
390 56
|
8月前
|
NoSQL Serverless API
Serverless 架构实现弹幕场景问题之API Gateway和OSS域名未绑定成功的问题如何解决
Serverless 架构实现弹幕场景问题之API Gateway和OSS域名未绑定成功的问题如何解决
73 0
|
10月前
|
存储 运维 Java
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
103 2
|
10月前
|
消息中间件 弹性计算 缓存
通过OOS定时升级Redis实例临时带宽
阿里云OOS提供了定时升级Redis实例临时带宽的功能,以应对数据驱动业务中的流量高峰。这个功能允许用户根据预测的业务负载,在特定日期和时间自动增加Redis实例的带宽,确保服务性能和稳定性。在高流量事件结束后,带宽会自动恢复到原设置,节省成本。 此功能适用于电商平台促销、大型游戏更新等场景,确保在流量高峰期间的系统稳定运行。
|
10月前
|
XML 运维 Java
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
107 1
|
10月前
|
弹性计算 UED
通过OOS定时升级EIP实例临时带宽
阿里云推出了一项定时升级EIP(弹性公网IP)带宽的功能,旨在解决企业在特定流量高峰时段的网络带宽需求。此功能允许用户预设特定日期和时间自动升级带宽,如电商大促、直播活动或数据备份期间,以确保服务稳定并降低成本。用户可通过OOS控制台设置自动化任务,包括定时类型(立即、一次或周期性)、EIP实例地域、带宽值、升级持续时间和执行速率控制。在流量高峰过后,带宽会自动恢复到原设定,以节省费用。此功能适用于按固定带宽计费的EIP实例,不支持按流量计费的公网带宽。