使用多账号+Organization区分不同部门的费用

一、前言

前文提到过,实现费用分割的方法之一是加tag,即Billing Dashboard里边的Cost Allocation Tag功能。配置说明参考上篇文章。在运行一段时间之后,看效果如下。

使用Tag区分费用的一个主要挑战就是,部分资源不支持标记tag,无法按照tag进行费用拆分。不支持的主要内容包括:Route53/WAF等。在使用比较重且较贵的Aurora RDS服务中,RDS实例消耗的CPU、内存是根据实例规格计费的,是可以使用tag区分费用的。但是,RDS生成的磁盘IO是不支持加tag的。如果有多个Aurora,不能区分哪一个数据库发生的IOPS,这是一点很大的局限。

如下截图,首先筛选出来不带tag的费用类型,然后按照费用类型分类。可以从下图看到WAF的ACL和RDS的IO是不支持tag的。

以上会造成一部分费用无法区分tag,无法在多个用户间分割。除了费用分割需求,还有一个角度就是多账号管理。在IAM中设置多账号,并按照tag去控制资源可见还是相对复杂的。例如,需求是A用户完全不可见B用户创建的实例,A和B独立甚至可视为两个租户等场景。在这种情况下,最佳实践就是引入多账号,通过Organization进行管理。

Organization的前身就是 Consolidate Billing,可对多账号进行合并付款。目前已经演进到Organization功能。官网文档在这里

为了进一步方便管控和提升安全性,推荐在每个子账户下,再建立新的IAM管理员负责日常操作。这里的用户体系模型如下图。

在这个模型中,各部门使用的子账号,他们的12位数字ID是完全不同的,因此其实他们是系统上的独立账号。IAM管理员是隶属于某一个子账号的,多个子账号之间是互相隔离的。换句话说,部门1和部门2的IAM管理员都可以叫user01,因为互相完全隔离,所以可以是重名的。在登录时候不需要担心因为是重名而无法区分登录,因为登录时候还需要输入12位数字ID的。

在账号分配上,主账号和各子账号的所有权可以由公司统一控制管理,每次上新项目或者新的团队时候,统一创建好IAM管理员账号,并下发给项目团队。

注:本文基于AWS海外环境编写。

二、创建新账号账号并初始化密码

根据上图的账户体系结构,首先创建分配给一个部门或者团队使用的AWS子账号。

1、新建子账号

首先使用当前主帐号登录到console,然后从下拉框里边点击Organization,如下截图。

如果当前语言是中文,要切换语言,需要将页面滚动到最下方,从页面最下方黑色banner中点击语言切换。如下截图红色框部分。

进入organization主界面。点击左侧的Add Account按钮创建新的账号。如下截图。

进入Add Acount界面后,有两个方式,可以分别通过邮件邀请,或者是直接创建账号。邮件邀请顾名思义是需要填写一个正确的邮箱去接受邀请URL才可以继续,而直接创建账号,其实依然是需要一个有效的URL用于重置密码的,所以这两种方式,都要求一个有效的真实的可以正常收发邮件的邮箱。

这里选择右侧的直接创建账号。填写一个有效的email邮箱地址。下方的IAM角色是可选的,可以不填写。填写好了后点击Create创建。

创建完成。界面自动返回到用户清单界面。在界面上可以看到,刚创建的名为 Li Si 的账号,颜色是灰色的,email和account id也是灰色的N/A。虽然刚才是输入了邮箱,但是因为还没有激活这个账号,所以暂时是灰色的。如下截图。

2、通过“忘记密码”的方式设置密码

接下来去用户注册邮箱,可以看到里边有了一封AWS发来的欢迎信。这封邮件是不包含登录信息的,一会还需要用这个邮件来设置密码。在这封邮件的下半部分,可以找到名为“My Account”的链接。如下红色的截图。

点击后跳转到登录界面。输入刚才填写的邮箱 lisi@bitipcman.com ,并点击登录。如下截图。

需要注意的是,由于刚才开通的全过程都没有输入密码,因此这里是需要重置密码。点击重置密码,如下截图。

点击重置密码后,要求输入图形验证码,并点击提交继续。如下截图。

重置密码的请求已经发送。

接下来切换到邮箱。可以看到重置密码的邮件。点击邮件中的链接继续。或者也可以复制下来,copy到浏览器地址栏,然后继续。

点击链接后,来到AWS的登录控制台,输入本账号的新的密码。

点击提交后,设置密码完成。

这个时候邮箱会收到一份提示邮件,提示密码重置完成。

3、第一次登录

再次来到登录窗口,输入邮箱名称。

输入刚才重置之后的新密码,完成登录。

登录成功。右上角可以看到用户名字,点击下拉框,可以看到“我的组织”。如下截图。

点击我的组织后,可以看到本账户的状态是属于组织统一管理。

至此账号就OK了。

以上设置的这个子账户,也是一个具有完整体系的AWS账户,可以开通资源,可以进IAM设置用户和权限。刚创建好的这个账户登录时候使用的是lisi@bitipcman.com,这种用邮箱方式登录的叫做root账号,后续再次登录root账号的入口就是AWS Console的入口。

即:https://console.aws.amazon.com/

为了安全起见和管理方便,后续不建议继续用这个root账户做日常操作。最佳实践是,在本账户下,再建立一个日常运维的管理员账户。这个运维账号的形式是用户名而不是root账户的邮箱方式)。由此,把root账号留在公司关键人手中,日常使用管理员账号下提供给运维和研发团队使用。

三、为新账号设置IAM管理员账户

上文提到了,日常操作应该基于IAM用户,而不是root账号。这里就来新建一个IAM管理员用于日常运维。

1、创建新IAM管理员账户

首先从控制台上的入口进入IAM。如下截图。

进入IAM主界面后,页面上方红色的框内是未来要使用的登录地址,建议加入收藏夹保存好。然后从左侧选择用户按钮。如下截图。

在IAM用户界面,点击添加用户按钮。

进入添加用户界面,用户名这里填写为user01,在访问类型里边,取消掉“编程访问”的对话框(即不给API授权),选中“AWS管理控制台访问”,即允许这个账号访问Console。关于密码是自动生成还是手工填写,是否强制用户修改密码,可以根据需要设置。

接下来为此用户绑定权限,点击左边第三个按钮“直接附加现有策略”,然后从下方第一行选中“AdminsitratorAccess”。

下一步是设置此客户对应的标签(tag)。在目前场景下,客户内部多个项目都拆分到了多个子账户,tag就可以暂时不设置了。这一步可以直接点下一步跳过。

下一步是审核界面,不需要操作,点击下一步继续就可以。

创建账户完成的界面如下截图。这里又再次提示了登录入口,密码默认隐藏,显示密码可以点击显示按钮。

至此IAM账户配置完成。如果是新打开浏览器的新窗口并使用登录入口登录的话,刚次这个已经打开的进程就会提示session已经结束。

2、第一次登录

上文最后一个步骤中有提示IAM登录地址,当访问这个地址时候第一个对话框账户(即12位数字)会自动带出来填写上,登录时候输入用户名user01,密码为上一步系统自动生成的密码。如下图。

登录成功,进入首页,接下来可以创建资源了。

接下来继续创建资源,使用一段时间后,将发生费用。

账号创建好的当天,如果去主账号的费用管理器中,查看linked account,请注意当天是不能显示出来的。例如如下截图中红色区域,linked account叫zhang san的是前几天创建的,因此可以看到;而新建的li si账号是当天创建,因此这里暂时看不到。过24小时后即可看到。

3、在子账号内查看资源使用

在子账号就位后,可以开始使用,创建一系列资源。在经过24小时后,从子账号的费用报告中,可以看到子账号的费用了。如下截图所示,在关联账号部分,下拉框是空的,这是因为子账号已经是被纳管关联的账号,自身不会再有下级账号了。日常运维管理元操作的只是IAM User身份,而不是独立子账号。因此这个下拉框是空白的。

由此,可以看到子账号的运作正常。

4、在主账号内查看多个关联的子账号费用

在第一次配置好子账号大约24小时后,主账号的计费中即可看到子账号的费用情况,如下截图,可以从右侧“筛选”和左上方“按某参数分组”两个角度来看到里边的数据。从如下截图中可以看到,橘色的就是昨天新建的子账号Li Si,他的日常管理员账号是IAM账户User01,但是费用都以子账号Li Si来统计,然后统一挂到主账户下。在下边这张截图中,绿色部分可见Zhang San是另一个子账户,也是相同的配置方式获得。

随着日常使用,过几天后陆续各种数据信息就会更加完善。

四、设置组织机构并通过organization下发策略(可选)

如果只是划分账单和费用,上述操作已经OK。如果希望进一步管控各子账号使用的功能,可以继续按如下方法操作。

1、设置部门(OU)

进入主账号的Organization界面,点击左侧的“组织机构”,可以看到下方列出了当前已经创建好的部门。

创建组织机构。输入另一个部门的名称。

创建完成后,可以将子账户移动到对应的组织部门中。选中一个用户后,点击“移动”按钮。

移动账号时候,会提示一个账号只能位于一个组织部门中,因此需要确认选择的部门准确。然后点击移动。

移动完成。

2、设置策略

点击Organization上的策略,点击创建策略。

在新建策略界面,选择是白名单允许方式还是黑名单禁用方式。系统默认是有一个Allow ALL的权限的,这里新建一个禁止权限。

首先点击新建权限。如下截图。

右侧是默认的策略,已经是Deny状态,在左侧的第一步输入RDS。

然后在RDS下选择所有。

接下来第二个步骤选择资源。

弹出的对话框,选择添加资源。如下截图。

添加完成。点击创建按钮。

策略创建完毕。

3、绑定策略到组织机构

接下来要将这个策略attach到组织机构(即OU)上。进入OU界面。找到刚才新建立的dev-2这个部门。点击左下角的服务策略管理。

在下拉框刷新出来的策略中个,找到刚才创建的策略,点击“Attach”附加按钮。

这里可以看到某个OU都有一个默认的Full AWS Access,这个是系统默认的允许所有服务的访问。这条策略是从root上继承过来的。此外,每个部门最少都必须有一个策略被附加到。

以上配置都是以公司主账户完成的。接下来我们到dev-2部门对应的子账户li si,测试策略效果,测试过程以IAM管理元user01身份登录。

登录后进入EC2等模块,可以看到权限正常。然后切换到RDS模块,RDS模块报告没有权限操作,这正是刚才policy中限制的策略。由此可以看到,策略推送有效。

五、小结

以上介绍了如何通过Organization实现多账户集中费用管理和策略推送。策略推送涉及黑白名单以及继承权限,建议根据需求自身组织机构特点后再部署。