在函數運行的過程中,函數計算需要訪問其他云資源,例如將函數日志寫入到您指定的日志服務內、拉取ACR鏡像或打通VPC網絡訪問等。此時,需要為函數所在服務授予相應權限,當服務被授予某權限后,該服務下所有函數都將具有此權限。如果是較粗粒度的授權,可以選擇函數計算系統提供的默認服務角色AliyunFCDefaultRole,如果需要更細粒度的授權,則需要為服務授予其他角色及相應的權限策略。
功能原理
函數計算根據函數所在服務配置的角色,通過AssumeRole獲取一個臨時密鑰(STS Token)。然后通過上下文中的參數Credentials或credentials將臨時密鑰傳遞給您的函數。此臨時密鑰包含了您所配置的權限的所有資源,您可以在函數代碼中使用其訪問其他阿里云服務。
臨時密鑰的有效期為36小時,且不支持修改。函數的最大執行時間為24小時,因此,執行函數過程中,臨時密鑰不會過期。
不同的運行時,參數Credentials或credentials的位置不同,您可以點擊以下鏈接訪問對應的文檔。需要強調的是,當您使用Custom Runtime或Custom Container的時候,臨時密鑰會被注入HTTP請求的Header中。
默認服務角色AliyunFCDefaultRole
為了簡化您的授權操作,函數計算為您提供了一個系統默認的服務角色,即AliyunFCDefaultRole。該角色內包含了函數計算需要訪問的部分云資源權限。關于如何創建默認角色AliyunFCDefaultRole和綁定該角色的操作步驟,請參見步驟一:開通函數計算服務。
您可以登錄RAM角色管理控制臺,查看AliyunFCDefaultRole的授權內容。
AliyunFCDefaultRole為函數計算系統默認的、所有服務級別的角色,請勿在該角色上添加其他權限策略。如果在默認角色的基礎上,您還需要添加其他權限策略,請新增一個角色并為該角色添加相關權限。具體操作,請參見創建可信實體為阿里云服務的RAM角色。
示例:授予函數計算訪問OSS的權限
本文以授予函數計算訪問對象存儲OSS管理權限為例進行介紹。如果需要指定函數計算某服務內的所有函數都具有管理對象存儲服務的權限,可以在配置服務權限時,為該服務綁定一個角色,然后將管理對象存儲服務的權限策略綁定到該角色上。成功綁定后,該服務內的所有函數都將具有管理對象存儲服務的權限。
前提條件
操作步驟
- 登錄函數計算控制臺,在左側導航欄,單擊服務及函數。
- 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務操作列的配置。
在編輯服務頁面的角色配置區域,單擊創建角色跳轉至RAM控制臺,根據界面提示創建角色并為角色授予所需權限。
您也可以使用已有的角色,如果權限不足,單擊編輯策略根據需要添加權限策略。具體操作,請參見為RAM角色授權。
在RAM控制臺的角色頁面,單擊創建角色。
在選擇類型頁簽,選擇可信實體類型為阿里云服務,然后單擊下一步。
在配置角色頁簽,選擇普通服務角色,設置角色名稱(本文示例為
mytestrole
),選擇受信服務為函數計算,然后單擊完成。在創建完成頁簽,單擊為角色授權,然后單擊目標角色右側操作列的新增授權。
在授權頁面,選擇資源范圍,授權主體默認為選擇的目標角色,選擇所需系統策略或自定義策略,單擊添加到右側已選擇列表,然后單擊確定。更多信息,請參見權限策略及示例。
賬號級別:權限在當前阿里云賬號內生效。
資源組級別:權限在指定的資源組內生效。指定資源組授權生效的前提是該云服務已支持資源組。更多信息,請參見支持資源組的云服務。
本文示例為管理對象存儲OSS,因此,您需要為新建角色增加系統策略AliyunOSSFullAccess。
為目標服務綁定上一步創建的新角色
mytestrole
。測試已綁定角色
mytestrole
的服務下的函數是否有管理OSS的權限。在服務列表,找到目標服務下的目標函數,在函數代碼頁簽,單擊測試函數右側的下拉列表,選擇配置測試參數配置,測試參數示例如下。
{ "endpoint": "http://oss-cn-hangzhou.aliyuncs.com", "bucket": "web****", "objectName": "myObj", "message": "your-message" }
在函數代碼頁簽的代碼編輯器中,編寫代碼,然后單擊部署代碼。
以Python內置運行時為例,您可以使用函數計算為您提供的臨時密鑰訪問對象存儲OSS。
import json import oss2 def handler(event, context): evt = json.loads(event) creds = context.credentials # 輸入用戶臨時密鑰,包括臨時Token。 # 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。 # 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 # 本示例以從上下文中獲取AccessKey/AccessSecretKey為例。 auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token) bucket = oss2.Bucket(auth, evt['endpoint'], evt['bucket']) bucket.put_object(evt['objectName'], evt['message']) return 'success'
單擊測試函數,執行成功后,登錄對象存儲OSS控制臺,找到目標Bucket,您可以看到目標Object內容已替換為
message
的內容。