文档

授予函数计算访问其他云服务的权限

更新时间:

在使用函数计算提供的日志、VPC、异步调用目标服务等功能时,函数计算需要访问其他的云服务。例如配置函数日志时,用户需要授权函数计算对指定日志的Logstore的写入权限,才能够将函数日志写入Logstore。函数计算支持服务关联角色,用户授权后,创建的函数默认将使用服务关联角色,函数不需要配置角色即可使用日志、VPC、异步调用目标服务等功能。而用户代码逻辑如果需要访问其他云服务,或需要更细粒度的授权,可以选择使用函数角色来授权。

功能原理

函数计算根据函数配置的角色,通过AssumeRole获取一个临时密钥(STS Token)。然后通过上下文中的参数Credentialscredentials将临时密钥传递给您的函数。此临时密钥包含了您所配置的权限的所有资源,您可以在函数代码中使用其访问其他阿里云服务。

临时密钥的有效期为36小时,且不支持修改。函数的最大执行时间为24小时,因此,执行函数过程中,临时密钥不会过期。

不同的运行时,参数Credentialscredentials的位置不同,您可以点击以下链接访问对应的文档。需要强调的是,当您使用Custom Runtime或Custom Container的时候,临时密钥会被注入HTTP请求的Header中。

示例:授予函数计算访问OSS的权限

本文以授予函数计算访问对象存储OSS管理权限为例进行介绍。如果需要指定函数具有管理对象存储服务的权限,可以为该函数绑定一个角色,然后为此角色授予管理对象存储的权限。

前提条件

创建函数

操作步骤

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  2. 在顶部菜单栏,选择地域,然后在函数页面,单击目标函数操作列的配置

  3. 在函数详情页面,选择配置页签,然后在左侧导航栏选择权限,单击编辑,在编辑权限面板,单击创建角色跳转至RAM控制台,根据界面提示创建角色并为角色授予所需权限。

    您也可以使用已有的角色,如果权限不足,单击编辑策略根据需要添加权限策略。具体操作,请参见为RAM角色授权

    image

    1. RAM控制台角色页面,单击创建角色

    2. 选择类型页签,选择可信实体类型为阿里云服务,然后单击下一步

      image.png

    3. 配置角色页签,选择普通服务角色,设置角色名称(本文示例为mytestrole),选择受信服务函数计算,然后单击完成

      image.png

    4. 创建完成页签,单击为角色授权,然后单击目标角色右侧操作列的新增授权

    5. 在授权页面,选择授权范围授权主体默认为选择的目标角色,选择所需系统策略或自定义策略,单击添加到右侧已选择列表,然后单击确定。更多信息,请参见权限策略及示例

      • 整个云账号:权限在当前阿里云账号内生效。

      • 指定资源组:权限在指定的资源组内生效。指定资源组授权生效的前提是该云服务已支持资源组。更多信息,请参见支持资源组的云服务

      本文示例为管理对象存储OSS,因此,您需要为新建角色增加系统策略AliyunOSSFullAccess

      image

  4. 为目标函数绑定上一步创建的新角色mytestrole

    image

  5. 测试已绑定角色mytestrole的函数是否有管理OSS的权限。

    1. 在函数列表,单击目标函数,然后选择代码页签,单击测试函数右侧的下拉列表,选择配置测试参数配置,测试参数示例如下。

      {
         "endpoint": "http://oss-cn-hangzhou.aliyuncs.com",
         "bucket": "web****",
         "objectName": "myObj",
         "message": "your-message"
      }

      上述示例中,bucket需替换为与函数相同的地域下您已创建的bucket名称。

    2. 代码页签的代码编辑器中,编写代码,然后单击部署代码

      以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'
    3. 单击测试函数,执行成功后,登录对象存储OSS控制台,找到目标Bucket,您可以看到目标对象内容已替换为测试参数中message的内容。

    相关文档

    • 函数计算3.0支持使用服务关联角色最小化授权,关于服务关联角色的权限策略内容,请参见AliyunServiceRoleForFC

    • 关于如何为目标函数配置角色,请参见创建函数