简单来讲就是你能够把配置项放在 ACM
里,好比密码、密钥等,形如:html
mysql.address.alice=192.168.0.123:3306 mysql.username.alice=alice mysql.password.alice=h0s7nt5720g # 不是真的
建立后怎么找到这个配置呢,你须要找到形如这样的几个参数:mysql
dataId: alice group: DEFULAT_GROUP # 没看出来不用默认组的意义 tenent: efa47c66-a01b-454e-9032-1561c493c441 # 不是真的
注意,这个 tenant
实际上在其它各类文档里也有可能被叫作 namespace
git
首先固然是有各类 官方 SDK,然而本文须要讨论的是 SDK
背后的实际工做原理。github
首先你须要阅读官方文档 应用配置管理 ACM > API 参考 > 调用方式,固然基本上是读不懂的,因而就须要一个阅读理解了。sql
第一步:找到提供 API
服务的 IP
,而后后续的操做都应该使用 IP
而不是域名json
$ curl http://${地址服务器域名}:8080/diamond-server/diamond
若是你是杭州,那么就是api
$ curl http://addr-hz-internal.edas.aliyun.com:8080/diamond-server/diamond 100.100.17.7 100.100.19.18 100.100.45.175 100.100.45.174
第二步:拿到 AK
安全
ACM_KEY=div8rspt6fmk0kv174kpopfju9sc2k88 # 不是真的 ACM_SECRET=M/r9o5MSBvCU1KT9745as92DQ7jNGIda5F= # 不是真的
官方的文档上写着不推荐使用,立刻就要废弃
,然而以他们 RAM
文档的难用程度以及客服工程师都不懂我在说什么的现状来看,估计废弃不了。
第三步:签名,如下都是伪代码,由于官方给的真代码太难看懂了;因此你须要找到的是伪代码在你用的语言里的实际实现,不要问这个库或者那个方法为何没有,你要去找呀
const dataId = 'alice'; // 还记得这 3 个值哪里来的吗,往上翻 const group= 'DEFULAT_GROUP'; const tenent = 'efa47c66-a01b-454e-9032-1561c493c441'; const diamond = 'http://100.100.17.7:8080/diamond-server/config.co' + '?dataId=' + dataId + '&group=' + group + '&tenant=' + tenant; const timestamp = Date.now() + ''; // 形如 '1535275961000' const message = tenant + '+' + group + '+' + timestamp; // 注意到这两个加号了吗,困在官方文档里的你是否是心里崩溃的 const key = 'div8rspt6fmk0kv174kpopfju9sc2k88'; const secret = 'M/r9o5MSBvCU1KT9745as92DQ7jNGIda5F='; const digest = hmac('sha1', secret, message); // 注意这里是 hmac-sha1,不是 sha1 const signature = base64.encode(digest); // digest 是个 byte[],具体可能取决于你使用的的加解密库 const props = curl.get(api, { headers: { 'Spas-AccessKey': key, 'timeStamp': timestamp, 'Spas-Signature': signature, }});
获得的 props
是一个文本。固然,这好像取决于你在 ACM
后台的配置,不过我以为正常来讲这里都应该配置成文本,应用本身若是要用 json
或者 xml
之类的,让它们本身去转。
所以获得的 props
形如:
mysql.address.alice=192.168.0.123:3306 mysql.username.alice=alice mysql.password.alice=h0s7nt5720g
至此结束,等阿里的客服工程师学会了怎么用 RAM
,我再来教你们。
给阿里云提了一个工单,展转了 4 个客服,历时两天,估计是终于找到写代码的那位小哥哥了,他说:
我以为这个工单值一张代金券。
经过 ECS 实例 RAM 角色访问 ACM,借助于实例 RAM 角色访问其余云产品
RAM
的原理就是开发不接触敏感信息,运维也不接触敏感信息,因为云内网机器之间的某种物理信任,机器和机器之间经过一些临时的受权以及加解密关系传递敏感信息。
如下仍是伪代码,同时因为是在作一个和传统铭文配置文件兼容的功能你全部没有开加解密了,原则上你应该使用 SDK
。
const meta = 'http://100.100.100.200/latest/meta-data/ram/security-credentials/acm'; // 这个 acm 是你本身起的角色名字,具体见文档 const credentials = request.get(meta); const { SecurityToken, AccessKeyId, AccessKeySecret } = credentials; // 签名方法和上面同样,略 const props = curl.get(api, { SecurityToken: { 'Spas-SecurityToken': token, // 注意!!!这就是文档上原本没写,后来加上,但仍然标着非必填参数,值一张优惠券的坑 'Spas-AccessKey': AccessKeyId, 'timeStamp': timestamp, 'Spas-Signature': signature, }});
好,此次真的所有结束了,一个在 出于架构的设计,这个项目被我设为私有了仓库了,有须要的投条私聊。openresty
上实现的完整的实战代码参考 https://github.com/liz-ai/prop。
欢迎打赏:
也欢迎关注个人知乎专栏:一地鸡毛总冠军,过几天可能有惊喜哦。
最后一次更新,客服给了我一张除了云市场的 100 块优惠券,哪位大哥知道能买啥吗?