阿里雲 ACM/RAM 踩坑

免責聲明:

  1. 不要問我爲何用阿里雲,我剛買的時候只有阿里雲的國內備案服務作得比較靠譜
  2. 摸着良心講,國內的其它雲更不靠譜

什麼是 ACM

應用配置管理 ACM(Application Configuration Management)前身爲淘寶內部配置中心 Diamond,可簡化微服務、DevOps 等場景下的配置管理,並幫助您確保配置安全合規。javascript

簡單來講就是你能夠把配置項放在 ACM 裏,好比密碼、密鑰等,形如:html

mysql.address.alice=192.168.0.123:3306
mysql.username.alice=alice
mysql.password.alice=h0s7nt5720g # 不是真的

應用配置管理 ACM > 用戶指南 > 建立配置java

建立後怎麼找到這個配置呢,你須要找到形如這樣的幾個參數:mysql

dataId: alice
group: DEFULAT_GROUP # 沒看出來不用默認組的意義
tenent: efa47c66-a01b-454e-9032-1561c493c441 # 不是真的

注意,這個 tenant 實際上在其它各類文檔裏也有可能被叫作 namespacegit

應用怎麼拿到配在 ACM 裏的值

首先固然是有各類 官方 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,我再來教你們。

更新 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 塊優惠券,哪位大哥知道能買啥嗎?

相關文章
相關標籤/搜索