函数计算使用日志、VPC访问、异步调用目标服务等功能时,需要访问其他的云服务的权限。例如配置函数日志时,用户需要授权函数计算对指定Logstore的写入权限,才能够将函数日志写入Logstore。
为了简化授权流程,函数计算支持服务关联角色 ,函数默认使用此服务关联角色,函数不需要额外配置角色即可使用日志、VPC访问、异步调用目标服务等功能。
如果用户代码逻辑需要访问更多其他云服务,或需要更细粒度的授权,则需要通过为函数配置函数角色来授权。为函数配置角色后,调用函数时,函数计算将自动代入该角色。
功能原理
函数计算根据函数配置的角色,通过AssumeRole获取一个临时密钥(STS Token),然后通过上下文中的参数Credentials或credentials将临时密钥传递给您的函数。此临时密钥包含了您所配置的权限的所有资源,您可以在函数代码中使用其访问其他阿里云服务。
临时密钥的有效期为36小时,且不支持修改。函数的最大执行时间为24小时,因此,执行函数过程中,临时密钥不会过期。
不同的运行时,参数Credentials或credentials的位置不同,您可以点击以下链接访问对应的文档。需要强调的是,当您使用自定义运行时或自定义镜像运行环境时,临时密钥会被注入HTTP请求的Header中。
示例:授予函数计算访问OSS的权限
本文以授予函数计算访问对象存储OSS管理权限为例进行介绍。如果需要指定函数具有管理对象存储服务的权限,可以为该函数绑定一个角色,然后为此角色授予管理对象存储的权限。
前提条件
操作步骤
步骤一:创建角色并授权
登录RAM控制台,在左侧导航栏,选择 。
在创建角色页面,选择可信主体类型为云服务,选择信任主体名称为函数计算/FC,然后单击确定。
在弹出的创建角色对话框,设置角色名称,如
mytestrole
,然后单击确定,跳转到角色详情页面。在权限管理页签,单击新增授权,在新增授权面板,按照以下步骤操作为角色授权。
选择资源范围,授权主体默认为选择的目标角色,选择所需系统策略或自定义策略,勾选对应策略左侧的复选框,将自动将其添加到右侧已选择权限策略列表,然后单击确认新增授权。更多信息,请参见权限策略及示例。
账号级别:权限在当前阿里云账号内生效。
资源组级别:权限在指定的资源组内生效。指定资源组授权生效的前提是该云服务已支持资源组。更多信息,请参见支持资源组的云服务。
本文示例为管理对象存储OSS,因此,您需要为新建角色增加系统策略AliyunOSSFullAccess。
步骤二:为目标函数绑定角色
步骤三:测试函数
测试已绑定角色mytestrole
的函数是否有管理OSS的权限。
在函数列表,单击目标函数,然后选择代码页签,单击测试函数右侧的下拉列表,选择配置测试参数,测试参数示例如下。
{ "endpoint": "http://oss-cn-hangzhou.aliyuncs.com", "bucket": "web****", "objectName": "myObj", "message": "your-message" }
上述示例中,
bucket
需替换为与函数相同的地域下您已创建的bucket名称。在代码页签的代码编辑器中,编写代码,然后单击部署代码。
以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,您可以看到目标对象内容已替换为测试参数中
message
的内容。
相关文档
函数计算3.0支持使用服务关联角色最小化授权,关于服务关联角色的权限策略内容,请参见AliyunServiceRoleForFC。
关于如何为目标函数配置角色,请参见创建函数。