白話講解函數計算中的角色授權

前言

初次入坑函數計算的小夥伴,遇見的第一大攔路虎非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'

所以:

  1. 如果您需要將您函數的日誌打印到您的 logstore 中進行調試,需要至少授予 service 訪問您 logstore 的權限,不然函數計算沒法把您函數執行的日誌 put 到您的lostore
  2. 如果您沒有給 service 配置 role, context.credentials爲空
  3. 如果您想訪問其他阿里雲資源,只需要給service中配置的role增加相應的權限就行
  4. 強烈推薦儘量在函數計算中使用 role 來替換 ak 的使用方法

總結

本文以一個簡單淺顯的例子說明函數計算和role之間的關係,以及解釋了函數計算中 service 中設置的 role 的意義,希望本文能給您撥開雲霧,如果還有不太理解的地方,歡迎大家留言反饋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章