簡單來講就是你能夠把配置項放在 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 塊優惠券,哪位大哥知道能買啥嗎?