本文介绍函数计算中权限的应用场景、类型以及管理机制。

应用场景

使用函数计算构建应用时,会涉及各种权限。例如:

  • 当您想使用阿里云日志服务(SLS)收集函数运行日志时,您需要授予函数计算将函数运行日志写入您指定的日志库中的权限。
  • 当您想使用阿里云对象存储服务(OSS)触发器时,您需要授予OSS调用函数的权限。
  • 当您需要不同的人员管理的函数需要访问账户中的阿里云资源时,例如OSS中的数据,您可以创建RAM角色并授予函数访问阿里云资源的权限。

权限类型

访问阿里云云产品,需要拥有对该产品的访问权限。函数计算涉及的权限主要有以下几种:

  • 函数计算访问阿里云其他产品,需要授予函数计算访问其他产品的权限。
    该权限是服务级别的,当某服务配置了指定权限,同一服务下的所有函数都继承该权限。您的函数代码中使用context.credentials来访问其他云产品,示例代码如下。
    // 使用context访问OSS。
    var OSSClient = require('ali-oss').Wrapper;
    exports.handler = function (event, context, callback) {
        console.log(event.toString());
    
        var ossClient = new OSSClient({
            accessKeyId: context.credentials.accessKeyId,
            accessKeySecret: context.credentials.accessKeySecret,
            stsToken: context.credentials.securityToken,
            region: 'oss-cn-shanghai',
            bucket: 'my-bucket',
        });
    
        ossClient.put('my-object', new Buffer('hello, fc')).then(function (res) {
            callback(null, 'put object');
        }).catch(function (err) {
            callback(err);
        });
    };

    如何配置服务权限,请参见配置服务权限

  • 事件源触发函数执行,需要授予事件源访问函数计算的权限。

    该权限是触发器级别的权限,每个触发器需要根据实际需要设置相应的权限。

    触发器的权限是在创建触发器过程中配置,具体操作步骤请参见:
  • RAM子账号访问函数计算资源需要授予相应的权限。

    该权限是RAM账号级别的。访问控制(RAM)允许在一个云账号下创建并管理多个身份,并允许给单个身份或一组身份分配不同的权限,从而实现不同权限组拥有不同的云资源访问权限。您可以通过主账号给RAM子账号授权,让子账号有权限操作函数计算相关资源。

    如何为RAM子账号设置权限,请参见为RAM用户授权

    函数计算RAM子账号的操作权限、资源访问权限及系统权限策略如下:
    • 函数计算RAM自定义权限策略
      Resource Action 描述
      acs:fc:<region>:<account-id>:services/<serviceName> fc:GetService 特定服务资源。
      fc:UpdateService
      fc:DeleteService
      acs:fc:<region>:<account-id>:services/* fc:CreateService 所有服务资源。
      fc:ListServices
      acs:fc:<region>:<account-id>:services/<serviceName>.<qualifier> fc:GetService 特定版本的服务资源。
      acs:fc:<region>:<account-id>:services/<serviceName>/functions/<functionName> fc:GetFunction 特定服务下的特定函数资源。
      fc:UpdateFunction
      fc:DeleteFunction
      fc:InvokeFunction
      acs:fc:<region>:<account-id>:services/<serviceName>/functions/* fc:CreateFunction 特定服务下的所有函数资源。
      fc:ListFunctions
      acs:fc:<region>:<account-id>:services/<serviceName>.*/functions/<functionName> fc:GetFunction 特定服务的所有版本下的所有函数资源。
      fc:UpdateFunction
      fc:DeleteFunction
      fc:InvokeFunction
      fc:PutProvisionConfig
      fc:GetProvisionConfig
      fc:PutFunctionOnDemandConfig
      fc:DeleteFunctionOnDemandConfig
      fc:GetFunctionOnDemandConfig
      acs:fc:<region>:<account-id>:services/<serviceName>/functions/<functionName>/triggers/<triggerName> fc:GetTrigger 特定服务下的特定函数下的特定触发器资源。
      fc:UpdateTrigger
      fc:DeleteTrigger
      acs:fc:<region>:<account-id>:services/<serviceName>/functions/<functionName>/triggers/* fc:CreateTrigger 特定服务下的特定函数下的所有触发器资源。
      fc:ListTriggers
      acs:fc:<region>:<account-id>:services/<serviceName>/versions fc:PublishServiceVersion 所有版本。
      fc:ListServiceVersions
      acs:fc:<region>:<account-id>:services/<serviceName>/versions/<versionID> fc:DeleteServiceVersion 指定版本。
      acs:fc:<region>:<account-id>:services/<serviceName>/aliases/* fc:CreateAlias 所有别名。
      fc:ListAliases
      acs:fc:<region>:<account-id>:services/<serviceName>/aliases/<aliasName> fc:GetAlias 指定别名。
      fc:UpdateAlias
      fc:DeleteAlias
      acs:fc:<region>:<account-id>:custom-domains/* fc:CreateCustomDomain 所有自定义域名。
      fc:ListCustomDomains
      acs:fc:<region>:<account-id>:custom-domains/<domainName> fc:GetCustomDomain 指定自定义域名。
      fc:UpdateCustomDomain
      fc:DeleteCustomDomain
      acs:fc:<region>:<account-id>:tag fc:TagResource 单个标签。
      fc:GetResourceTags
      fc:UnTagResource
      acs:fc:<region>:<account-id>:tags/* fc:ListTaggedResources 所有标签。
    • 函数计算系统权限策略

      函数计算默认提供三个系统策略AliyunFCReadOnlyAccess、AliyunFCInvocationAccess和AliyunFCFullAccess。您也可以自定义策略进行更细粒度的权限管理,具体请参见权限策略基本元素

      • AliyunFCReadOnlyAccess系统策略:表示允许对函数计算所有资源进行读操作。
        {
            "Version": "1",
            "Statement": [
                {
                    "Action": [
                        "fc:Get*",
                        "fc:List*"
                    ],
                    "Resource": "*",
                    "Effect": "Allow"
                }
            ]
        }
      • AliyunFCInvocationAccess系统策略:表示允许对所有函数资源进行执行操作。
        {
            "Version": "1",
            "Statement": [
                {
                    "Action": [
                        "fc:InvokeFunction"
                    ],
                    "Resource": "*",
                    "Effect": "Allow"
                }
            ]
        }
      • AliyunFCFullAccess系统策略:表示允许对所有函数计算资源进行所有执行操作。
        {
            "Version": "1",
            "Statement": [
                {
                    "Action": "fc:*",
                    "Resource": "*",
                    "Effect": "Allow"
                }
            ]
        }
      • 自定义策略:表示允许对杭州区域下的foo服务下的bar函数进行执行操作。
        {
            "Version": "1",
            "Statement": [
                {
                    "Action": [
                        "fc:InvokeFunction"
                    ],
                    "Resource": "acs:fc:cn-hangzhou:*:services/foo/functions/bar",
                    "Effect": "Allow"
                }
            ]
        }

权限管理机制

访问控制服务RAM(Resource Access Management)是阿里云提供的资源访问控制服务。函数计算使用RAM基于角色的权限管理机制。

  • 授权基本思路

    策略(policy)表示访问指定服务的能力,当您为指定的角色(role)绑定指定策略后,该角色就具有访问指定服务的能力。当有第三方需要访问这个服务时,只需要扮演具有访问能力的角色即可。关于更多策略(policy)和角色(role)的内容请参见访问控制

  • 授权示例
    • 函数计算访问阿里云其他产品
      以函数计算访问日志服务为例,RAM提供系统授权策略AliyunLogFullAccess。该策略具有对日志服务完全的操作权限。在配置服务权限时,您可以为该服务绑定一个角色(可以新建一个角色也可以使用已有角色)。然后将策略AliyunLogFullAccess绑定到该角色上,这样函数计算就可以访问日志服务了。服务角色
    • 事件源访问函数计算
      以OSS事件源触发函数计算代码执行为例,RAM提供系统授权策略AliyunOSSEventNotificationRole。该策略具有OSS事件源触发函数计算代码执行的权限。在创建触发器时,您可以为触发器绑定一个角色(可以新建角色也可以使用已有角色)。然后将策略AliyunOSSEventNotificationRole绑定到该角色上,这样OSS事件源就可以触发函数计算代码执行了。trigger-authorize
    • RAM子账号访问函数计算

      以授予RAM子账号对函数计算中所有资源读权限为例,函数计算提供系统授权策略AliyunFCReadOnlyAccess。在创建RAM子账号后,您可以为该子账号绑定一个角色(可以新建角色也可以使用已有角色)。然后将策略AliyunFCReadOnlyAccess绑定到该角色上,这样该子账号就可以访问函数计算中的所有资源了。