分享一下我们用代码来管理多个 AWS 账号的实践

2021-06-14 11:15:26 +08:00
 xiaket
这个解决方案是我们这一年来鼓捣出来的东西, 主要思路是不使用跨账号的 IAM Role, 使用 Eventbridge 来传递消息. 把所有的 AWS 账号全部定义到一个配置文件里, 通过 cicd 流程来控制新账号的生成和初始化, 同时也有一些额外的好处.

https://blog.xiaket.org/2021/aws-account-management-using-eventbridge-cn.html

如果有兴趣, 可以对照英文来看:

https://blog.xiaket.org/2021/aws-account-management-using-eventbridge.html
3656 次点击
所在节点    Amazon Web Services
25 条回复
xiaket
2021-06-14 11:17:17 +08:00
wandehul
2021-06-14 12:04:40 +08:00
算了, 我还是老老实实的看 terrraform 吧
joesonw
2021-06-14 12:21:28 +08:00
netflix 的 ConsoleMe 可以看一看. 他们全部基础设施都在 aws 上, 对 aws 的管理还是很有一套.
gtx990
2021-06-14 14:04:50 +08:00
我们一般用 cdk 的
Cabana
2021-06-14 14:16:29 +08:00
好奇这种双语的博客是要写两次么,还是写一份用软件翻译改吧改吧就行?
xiaket
2021-06-14 15:14:51 +08:00
@wandehul @gtx990 这篇要点在于提供了多账号管理且不需要跨账号 assume role 的方式, 和是否使用 cdk/tf 没什么关系.
xiaket
2021-06-14 15:15:55 +08:00
@Cabana 我是先用英文写的, 这两天放假有空全部人肉翻译了一遍再校对润色了一遍.
xiaket
2021-06-14 15:17:51 +08:00
@joesonw 谢谢! 我们的全部基础设施也都在 aws 上. 看过 ConsoleMe, 不太喜欢这种自助式服务, 因为担心配置漂移, 另外我们还没有到那种需要为几百几千个人提供访问权限的程序.
hcsu
2021-06-14 15:27:08 +08:00
膜拜大佬
xupefei
2021-06-14 16:32:46 +08:00
在配置文件外面套一层 jsonnet 的话会更爽。
xiaket
2021-06-14 16:51:59 +08:00
@xupefei 谢谢, 我们自己实现 jsonnet 那层逻辑也不算太大负担, 我现在只是有点后悔没用 toml.
whileFalse
2021-06-14 19:53:40 +08:00
你们是做 SAAS 的么,一个用户一个账号?

不太明白你们的应用场景。我就按一个最常用的场景来说。一些低权限用户可以提起创建账号请求,由高权限管理者批准,然后即可自动化创建。
既然你们要做某种 Infra as Code,那么权限应该在 Code 层面完成,也就是 Merge 代码之后鉴权就完成了,然后由一个 Infra 账号的管理 Role 去创建子账号,并在每个子账号内部创建一个 Admin Role,专为 Infra 账号 assume 用以便日后管理。

我不太理解为什么你们在完成 Infra as Code 的 Merge 之后还要在账户层面做权限管控,然后用一大堆流程来传输这种 Infra 代码并分布式(在每个账户中分别)执行。建议你们着重解释下这一点。
imstand
2021-06-14 20:33:10 +08:00
这种使用方法有些新奇
akira
2021-06-15 01:35:34 +08:00
不是很明白这么做的好处。。
vindurriel
2021-06-15 07:52:07 +08:00
想问问为啥用 toml ?
eventbridge 跨账号传数据确实比 iam 风险高 需要额外的验证步骤
xderam
2021-06-15 10:36:33 +08:00
用户账号即代码?话说这个思路没问题,但是。。如果这个账号不用了如何搞?临时禁止了如果搞?代码一般是个无状态的东西,个人感觉 xxx 即代码比较难搞的就是这个状态。举个例子 terraform 在创建之后就会在本地或者远程保存一个状态文件。这样就不至于多人协同的时候搞乱了。
xiaket
2021-06-15 10:38:06 +08:00
@whileFalse @akira 感谢两位的兴趣, 请允许我解释一下(看来我文章里面没有说清楚, 这一段回头也得加进去).

我们做这样设定的初衷是为了安全, 首先, 我们觉得 IAM User 不够安全, 所以我们设立了一个登录账号, 专门用来对接我们的 sso 服务. 用户 assume 了一个登录账号里的一个 IAM Role, 然后再 assume 另外一个 role, 去到他 /她真正要使用的账户.

然后, 我们做这些设定是认为总有一天我们的某一个账号会因为误用而导致被人拿到 Administrator 级的权限, 那么为了减少相关的影响, 我们不应该把所有的服务全部放到一个账号里面, 甚至也不应该把所有生产环境下的服务放到一个账号里去. 因为如果一个服务被人拿到权限, 那么所有的服务都会受影响, 因此, 多账号对于我们而言是必要的. 我上面写的这篇文章就是针对多个 AWS 账号的管理的一个方案, 这种方案各个公司多少都有, AWS 甚至还有 Control Tower 服务可以供使用, 但是我们觉得用 Eventbridge 来管理更适合我们.

如果你使用了多个 AWS 账号, 在费用上不会增加特别多, 真正增加的是你的管理成本, 尤其是几年之后你是否还能有效地管理这样的多账号环境, 每个账号里是否有配置漂移的情况, 我们觉得使用一个 DSL 并使用 CICD 来强制收敛是一个更好的选择.

@whileFalse 单独回答一下你的疑问. 我们不是做 SAAS, 在 AWS 层面, 也不是一个用户一个账号. 作为程序员, 张三和李四都可以通过两次 assume role 进入到要用的同一个账户里面去, 第二次 assume role 时使用的 Role 也是一样的. 方便讨论, 我们来一个假设的场景吧. 一个游戏公司里有多个工作室, 每个工作室有三个账号, 一个开发, 一个外部测试, 一个生产. 现在我们新开了一个工作室, 要加新 AWS 账号. 那么我们会要求主程去一个 repo 提一个 PR, 在一个 yml 文件里面添加新账号的定义. Infra 批了 PR 后进入自动化流程. 回头来看你的评论, 我不太确认你说的权限应该在 Code 层面完成是什么意思. 不过我认可你说的 merge 之后这个操作是被 Infra 同学认可了. 但是, 我们目前这个自动化流程是跑在专门的 cicd 账号里的, 不是 master, 所以没有办法直接创建 AWS 账号. 我们通过文章里提到的办法通过发消息来让 cicd 账号控制 master 账号, 创建新 AWS 账号. 至于这个账号里面的 Admin Role, 都是允许从那个特殊的`identity`账号来 assume role, 具体谁有权限是在那个账号管理的. 或者之前一篇文章里的一个图能够帮助你的理解: https://blog.xiaket.org/media/2020/okta-identity-destination.png

谢谢你们的提问, 让我意识到文章里面还有缺失的地方, 解释工作做得不够好, 我晚上改改.
marffin
2021-06-15 11:13:31 +08:00
棒棒哒,现在越来越多的公司碰到了 aws governance 的问题了
xiaket
2021-06-15 11:15:26 +08:00
@vindurriel 因为 toml 是有可能进 stdlib 的, 而 PyYAML, 我看过源码, 有点一言难尽...

为什么你认为 eventbridge 跨账号传数据风险比 IAM 更高? 就我的理解, 一个账号是一个容器, 或者可以理解为一台服务器. 如果给了跨账号 assume-role, 类似于给用户提供了远程登录的接口, 而提供 eventbridge 的入口更像是通过 API 提供了服务. eventbridge 跨账号传数据应该是在 aws 的 control plane 层面传, 不走公网, 而且我们做了 resource policy, 不接受来自无关账号的消息.
xiaket
2021-06-15 11:17:59 +08:00
@xderam 账号不用了就删掉呗, 这个月我已经干掉了 10 个账号了, 删完账号后配置文件里面再删掉就好, 目前来看, 不算太麻烦. 而且我们懒, 一般是该删的账号积了一堆后一次干掉多个, 节省时间和精力. 至于你说的那个状态, 我们是用 cicd 流程来保证配置和实际强一致收敛.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/783289

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX