在正文开始前先介绍下相关概念
RAM:RAM是阿里云的一款权限管理产品,也可以叫做访问控制。是独立于函数计算的平行产品,函数计算的权限控制也是使用的RAM,关于RAM更多信息
RAM子账号:在使用注册阿里云产品时会有一个主账号,既root账号。该账号可以操作所有阿里云产品,权限较大,这个时候就可以创建一个子账号,既RAM子账号,可以给该子账号指定相关权限,保证使用安全。
函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档
相信大家在使用函数计算的过程中或多或少的都遇到过权限的问题,有些出现的问题比较难以理解和解决,所以准备以下几个方面来说明下权限问题
主账号权限问题
主账号就是注册阿里云的账号,属于root账号,阿里云所有产品都可以操作。这个时候一般来说主账号没有什么权限问题。但是在阿里云权限体系中有一个角色(role)的概念,而函数计算里面也会用到这么一个角色的概念。所以当使用主账号出现权限问题时一般都是服务配置里的角色权限不够。
示例问题
当我们使用主账号进行创建镜像函数的时候,有些时候会出现如图所示的报错提示,问题原因就是服务角色没有相应的权限。
在创建镜像函数的界面我们可以看到,有一个提示是“需要为该服务的role配置xxxx权限”,这个role就是角色,意思就是我们要给这个服务角色添加xxx权限。怎么操作呢?我们接着往下看。
新建函数
配置函数
更换类型
事件函数
函数类型
所在服务
CRService
函数名称
请填写您的函数名称
CustomContainer
运行环境
custom-container需要为该服务的le配置AlyuncontainerRegistyReadonlycces权限
选择容器镜像
容器镜像
镜像只能位于阿里云容器镜像服务
可以登陆函数计算控制台,选择需要的服务,点击服务配置->修改配置,往下拉就可以看到这个服务角色配置了。可以选择某个已有的角色,或者新建角色。
权限配置
选择角色
aliyunfcgeneratedrole-cn-hangzhou-CRService
创建新角色
策略详情
AliyunLogFullAccess
AliyUnRDSFUlAccess
AliyunOSSFulAccess
AliyunFcGeneratedLogPolicy-cn-hangzhou-CService
AliyunECSNetworklnterfaceManagementAccess
+添加新策略
asss
然后可以点击添加新策略添加需要的权限。添加之后就没有报错了。从这个问题我们可以看到虽然是用的主账号,但是当我们的服务角色不配置这个权限的时候依然会报错。报错的意思就是服务角色不能为空(就是没有权限)。所以这个时候我们给角色添加上相应的权限就没有问题了。
除此之外,如果是使用函数计算的临时密钥,那么临时密钥里所属的权限就是服务角色里的权限。如果不配置服务角色,那临时密钥是为空的,也就没有权限了。(这里是比较重要的,很多场景都是要用到临时密钥)
总结
我们总结下,主账号本身权限没什么大问题,一般就是服务角色权限不够。所以在主账号遇到权限问题时一定检查下服务角色是否有相关权限。
子账号权限问题
子账号权限配置比较多样复杂,我们说一些常见的子账号权限权限问题
函数计算子账号权限配置模版
我们先看看子账号配置的模版,一般情况下给子账号配置这些权限就够了。
- AliyunFCFullAccess
说明:管理操作函数计算的权限
- AliyunLogReadOnlyAccess
日志只读权限,如果允许开发者自己创建日志库的话, 这里可以是 AliyunLogFullAccess
- AliyunECSNetworkInterfaceManagementAccess
管理ECS弹性网卡的权限
- AliyunContainerRegistryReadOnlyAccess
只读访问容器镜像服务(ContainerRegistry)的权限
- AliyunCloudMonitorReadOnlyAccess
只读访问云监控(CloudMonitor)的权限
- AliyunRAMReadOnlyAccess
只读访问访问控制(RAM)的权限,即查看用户、组以及授权信息的权限
- AliyunNASFullAccess
nas权限,如果需要使用到Nas 功能的话
至于触发器相关的, 可以直接配置对应的云服务的 readonly 权限或者 full 权限, 比如对于 oss 触发器, 可以直接添加AliyunOSSReadOnlyAccess 或者 AliyunOSSFullAccess, 当然您可以定义的更具体和细致, 比如具体到某个 bucket,触发器我们后面在详细说
配置、更新触发器权限问题
我们先看oss触发器,我这里有一个子账号,当我只给了这些权限的时候,去更新触发器是没有权限更新的,会报错。
添加权限
备注
权限应用范围
权限策略类型
权限策略名称
管理对象存储服务(0SS)权限
系统策略
全局
AliyunOSsFullAccess
只读访问访问控制(RAM)的权限,即查看用户,组以及授权信
系统策略
AliyunRAMReadOnlyAccess
全局
息的权限
管理表格存储服务(OTS)的权限
全局
系统策略
AliyunOTSFullAccess
管理函数计算(FC)服务的权限
全局
系统策略
AliyunFCFullAccess
事件源
事仕源
acs:oss:cn-shanghai?
ac
oss:ObjectCreat
错误
oss:ObjectCreat
没有更新触发器的权限.
oss:Objectcreat
oss:ObjectCreat
确认
srouse
前缀
ZIP
后终
哎,不对啊,这不是已经给了ossFull的权限了嘛,为什么不行。别急,我们在给添加一个ramFull的权限就可以更新了。
ram
权限策略名称
备注
AliyunRAMFullAccess
管理访问控制(RAM)的权限,即管理用户以及授权的权限
到这里一般就没问题了。但是也不对啊,一个子账号我要给ramFull这么大的权限吗,这也不安全啊。对,这确实不太安全,所以我们可以自定义一个 policy内容如下,然后在把这个自定义的policy添加给子账号,这样我们添加上这个ram:PassRole权限后也是可以更新触发器了。
{ "Statement": [ { "Action": [ "ram:PassRole" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
列举服务的权限
某些时候不想给子账号添加FCFull的权限,只想让子账号操作某一个服务函数,这个是可以的,配置自定义权限就行,问题不是这个。问题是当不给FCFull或者FCReadonly权限的时候打开函数计算控制台点击服务/函数会出现‘没有列举服务的权限’提升,如图。
这个时候会说我不是给了某个服务函数的操作权限嘛,为什么会这样呢?
原因就是虽然给了某个服务函数的操作权限,但是也只能操作你授权的那个服务函数,而控制台选择点击服务/函数的时候会去获取地域下的所有服务函数,那给的权限不包含其他的服务函数,所以就会提示没有列举服务的权限。
这个时候我们只要给子账号添加一个AliyunFCReadOnlyAccess 只读的权限就可以了
自定义权限
向上面说的那样,有些时候权限不能放开只能限制到某一个函数服务,这个时候就可以使用自定义权限,限制操作,详细请看https://help.aliyun.com/document_detail/52885.html?spm=a2c4g.11186623.6.639.7e096ec9q8SMJ7
同时还可以使用标签对服务分组授权,分组管理。通过标签功能,可以将各团队进行分组,然后给不同分组的团队授予不同的权限。详情请看:https://help.aliyun.com/document_detail/137462.html?spm=a2c4g.11186623.6.660.1ab01330d3Hr8a
其他
子账号除了本身的账号权限以外还有服务角色的权限,和主账号同理。某些时候当子账号已经有了权限,但是提示没有权限的时候一般都是服务角色没有权限,建议检查服务角色权限。
总结
子账号的权限问题一般比主账号要多的,遇到子账号问题可以根据提示先检查账号本身的权限,然后可以在检查服务角色的权限,一般检查下来就能知道是缺什么了。
工具权限
函数计算常用的工具就是fun 工具,是使用fun config进行账号配置,配置的时候accuntid 一定是主账号的,然后ak,aks信息可以是子账号的,那相应的权限就是子账号的。部署报错权限问题,可以根据提示缺什么就加什么。