在函数运行的过程中,函数计算需要访问其他云资源,例如将函数日志写入到您指定的日志服务内、拉取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
的内容。