授予函數(shù)計(jì)算訪問其他云服務(wù)的權(quán)限
在使用函數(shù)計(jì)算提供的日志、VPC、異步調(diào)用目標(biāo)服務(wù)等功能時(shí),函數(shù)計(jì)算需要訪問其他的云服務(wù)。例如配置函數(shù)日志時(shí),用戶需要授權(quán)函數(shù)計(jì)算對指定日志的Logstore的寫入權(quán)限,才能夠?qū)⒑瘮?shù)日志寫入Logstore。函數(shù)計(jì)算支持服務(wù)關(guān)聯(lián)角色,用戶授權(quán)后,創(chuàng)建的函數(shù)默認(rèn)將使用服務(wù)關(guān)聯(lián)角色,函數(shù)不需要配置角色即可使用日志、VPC、異步調(diào)用目標(biāo)服務(wù)等功能。而用戶代碼邏輯如果需要訪問其他云服務(wù),或需要更細(xì)粒度的授權(quán),可以選擇使用函數(shù)角色來授權(quán)。
功能原理
函數(shù)計(jì)算根據(jù)函數(shù)配置的角色,通過AssumeRole獲取一個(gè)臨時(shí)密鑰(STS Token)。然后通過上下文中的參數(shù)Credentials或credentials將臨時(shí)密鑰傳遞給您的函數(shù)。此臨時(shí)密鑰包含了您所配置的權(quán)限的所有資源,您可以在函數(shù)代碼中使用其訪問其他阿里云服務(wù)。
臨時(shí)密鑰的有效期為36小時(shí),且不支持修改。函數(shù)的最大執(zhí)行時(shí)間為24小時(shí),因此,執(zhí)行函數(shù)過程中,臨時(shí)密鑰不會(huì)過期。
不同的運(yùn)行時(shí),參數(shù)Credentials或credentials的位置不同,您可以點(diǎn)擊以下鏈接訪問對應(yīng)的文檔。需要強(qiáng)調(diào)的是,當(dāng)您使用自定義運(yùn)行時(shí)或自定義鏡像運(yùn)行環(huán)境的時(shí)候,臨時(shí)密鑰會(huì)被注入HTTP請求的Header中。
示例:授予函數(shù)計(jì)算訪問OSS的權(quán)限
本文以授予函數(shù)計(jì)算訪問對象存儲(chǔ)OSS管理權(quán)限為例進(jìn)行介紹。如果需要指定函數(shù)具有管理對象存儲(chǔ)服務(wù)的權(quán)限,可以為該函數(shù)綁定一個(gè)角色,然后為此角色授予管理對象存儲(chǔ)的權(quán)限。
前提條件
操作步驟
登錄函數(shù)計(jì)算控制臺(tái),在左側(cè)導(dǎo)航欄,單擊函數(shù)。
在頂部菜單欄,選擇地域,然后在函數(shù)頁面,單擊目標(biāo)函數(shù)操作列的配置。
在函數(shù)詳情頁面,選擇配置頁簽,然后在左側(cè)導(dǎo)航欄選擇權(quán)限,單擊編輯,在編輯權(quán)限面板,單擊創(chuàng)建角色跳轉(zhuǎn)至RAM控制臺(tái),根據(jù)界面提示創(chuàng)建角色并為角色授予所需權(quán)限。
您也可以使用已有的角色,如果權(quán)限不足,單擊編輯策略根據(jù)需要添加權(quán)限策略。具體操作,請參見為RAM角色授權(quán)。
在RAM控制臺(tái)的角色頁面,單擊創(chuàng)建角色。
在選擇類型頁簽,選擇可信實(shí)體類型為阿里云服務(wù),然后單擊下一步。
在配置角色頁簽,選擇普通服務(wù)角色,設(shè)置角色名稱(本文示例為
mytestrole
),選擇受信服務(wù)為函數(shù)計(jì)算,然后單擊完成。在創(chuàng)建完成頁簽,單擊為角色授權(quán),然后單擊目標(biāo)角色右側(cè)操作列的新增授權(quán)。
在授權(quán)頁面,選擇資源范圍,授權(quán)主體默認(rèn)為選擇的目標(biāo)角色,選擇所需系統(tǒng)策略或自定義策略,單擊添加到右側(cè)已選擇列表,然后單擊確定。更多信息,請參見權(quán)限策略及示例。
賬號級別:權(quán)限在當(dāng)前阿里云賬號內(nèi)生效。
資源組級別:權(quán)限在指定的資源組內(nèi)生效。指定資源組授權(quán)生效的前提是該云服務(wù)已支持資源組。更多信息,請參見支持資源組的云服務(wù)。
本文示例為管理對象存儲(chǔ)OSS,因此,您需要為新建角色增加系統(tǒng)策略AliyunOSSFullAccess。
為目標(biāo)函數(shù)綁定上一步創(chuàng)建的新角色
mytestrole
。測試已綁定角色
mytestrole
的函數(shù)是否有管理OSS的權(quán)限。在函數(shù)列表,單擊目標(biāo)函數(shù),然后選擇代碼頁簽,單擊測試函數(shù)右側(cè)的下拉列表,選擇配置測試參數(shù)配置,測試參數(shù)示例如下。
{ "endpoint": "http://oss-cn-hangzhou.aliyuncs.com", "bucket": "web****", "objectName": "myObj", "message": "your-message" }
上述示例中,
bucket
需替換為與函數(shù)相同的地域下您已創(chuàng)建的bucket名稱。在代碼頁簽的代碼編輯器中,編寫代碼,然后單擊部署代碼。
以Python內(nèi)置運(yùn)行時(shí)為例,您可以使用函數(shù)計(jì)算為您提供的臨時(shí)密鑰訪問對象存儲(chǔ)OSS。
import json import oss2 def handler(event, context): evt = json.loads(event) creds = context.credentials # 輸入用戶臨時(shí)密鑰,包括臨時(shí)Token。 # 阿里云賬號AccessKey擁有所有API的訪問權(quán)限,建議您使用RAM用戶進(jìn)行API訪問或日常運(yùn)維。 # 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致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'
單擊測試函數(shù),執(zhí)行成功后,登錄對象存儲(chǔ)OSS控制臺(tái),找到目標(biāo)Bucket,您可以看到目標(biāo)對象內(nèi)容已替換為測試參數(shù)中
message
的內(nèi)容。
相關(guān)文檔
函數(shù)計(jì)算3.0支持使用服務(wù)關(guān)聯(lián)角色最小化授權(quán),關(guān)于服務(wù)關(guān)聯(lián)角色的權(quán)限策略內(nèi)容,請參見AliyunServiceRoleForFC。
關(guān)于如何為目標(biāo)函數(shù)配置角色,請參見創(chuàng)建函數(shù)。