前言
初次入坑函數計算的小夥伴,遇見的第一大攔路虎非RAM授權相關莫屬。開始玩玩hello world
這種無關授權訪問其他阿里雲資源的時候,感覺 serverless 大法各種好,之後發現線上排查問題日誌的時候,第一次給service配置role的時候,雖然控制檯能成功配置,但是估計也是一臉懵逼。本文旨在用最淺顯的例子說明ram的基本概念,以及和函數計算之間的關係。
RAM
RAM 中的 2 個基本概念:
-
用戶
- 主賬戶(或稱root用戶)
- 子用戶
- 角色
先用一個通俗的例子來說明這兩個基本概念:
- 您在阿里雲開通了賬號,購買阿里雲上的資源; 這個就類似於您創建了一個國家,國家有大有小(等價於你的阿里雲上資源多少), 主賬號就是國王您, 爲了讓您的國家機器健康有效運轉,您開始放權,從任命三省六部大員直到九品芝麻官,這個時候,官員就對應子賬號, 官員(子用戶)的權利有大有小,就對應國王(主賬號)授予的官職大小。 此時無論國王(主賬戶)還是官員(子賬戶),都是物理意義上的人(真正的實體), 表現爲有具體的身份證(Acesskey Id 和 Acesskey Secret),身份證與人綁定。
- 角色不是實體,接着上面的例子,國家和國家之間需要交流合作, 假設您的國家是 A 國,如果 B 國想和 A 國合作, B 國派遣外交使節
甲
(B國的一個官員,對應B國子用戶)訪問 A 國, 這個時候,A 國需要給甲
頒發一個簽證,不然過不了海關,甲
就可以憑藉這個簽證,獲得一個臨時的 A 國國民身份進入A國,進行一些工作事項。 在這裏 簽證 可以理解爲一個角色, 不是真正物理意義上的實體。 真正的實體甲
通過簽證中授予的權限,臨時扮演 A 國國民身份在 A 國幹一些事情。簽證的權限有大有小並且有一定的時效性,甲
拿着不同的簽證,有可能是元首級別的交流待遇,也有可能只是去窮遊7天之內必須滾來回的DS。
具體詳情請參考 RAM 官方文檔
函數計算中的RAM
函數中直接使用用戶
def handler(event, context):
# 直接明文使用AK 訪問其他阿里雲資源,比如oss
...
return "OK"
這種用法簡單粗暴,使用ak, 在上面說了,有ak的都是真正的實體用戶, 直接明文AK在代碼中裸奔,怎麼看都不安全,於是演變成如下的代碼片段:
def handler(event, context):
ak_id = os.environ["AK_ID"]
ak_secret = os.environ["AK_SECRET"]
# 使用環境變量中ak訪問其他阿里雲資源
# 環境變量有加密處理,
# https://help.aliyun.com/document_detail/69777.html
...
return "OK"
這樣似乎看起來很安全了,但是如果一旦出現爲了安全,定期更換AK情況,就不得不到處去手動函數中設置的環境變量...
函數中使用role
回到上面角色中的那個例子,您的阿里雲資源是 A 國, 函數計算的服務是 B 國, B 國和 A 國進行合作,A 國頒給 B 國大使 甲
簽證(對應函數計算service配置的role), 這個時候 甲
臨時扮演成 A 國國民對 A 國的資源進行一些訪問, 此時可以用如下注釋理解:
# -*- coding: utf-8 -*-
def handler(event, context):
# context中的 creds 就是 `甲` 臨時扮演成的 A 國國民
creds = context.credentials
# creds 可以操作 A 國(也就是您自己的阿里雲)的資源
# 這樣的話,您通過使用creds 就可以訪問您自己的阿里雲資源了
# 不需要 ak 在代碼中裸奔了
...
return 'OK'
所以:
- 如果您需要將您函數的日誌打印到您的 logstore 中進行調試,需要至少授予 service 訪問您 logstore 的權限,不然函數計算沒法把您函數執行的日誌 put 到您的lostore
- 如果您沒有給 service 配置 role, context.credentials爲空
- 如果您想訪問其他阿里雲資源,只需要給service中配置的role增加相應的權限就行
- 強烈推薦儘量在函數計算中使用 role 來替換 ak 的使用方法
總結
本文以一個簡單淺顯的例子說明函數計算和role之間的關係,以及解釋了函數計算中 service 中設置的 role 的意義,希望本文能給您撥開雲霧,如果還有不太理解的地方,歡迎大家留言反饋。