V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaket
V2EX  ›  Amazon Web Services

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

  •  
  •   xiaket ·
    xiaket · 2021-06-14 11:15:26 +08:00 · 3641 次点击
    这是一个创建于 1037 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个解决方案是我们这一年来鼓捣出来的东西, 主要思路是不使用跨账号的 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
    25 条回复    2021-12-07 12:00:09 +08:00
    xiaket
        1
    xiaket  
    OP
       2021-06-14 11:17:17 +08:00
    wandehul
        2
    wandehul  
       2021-06-14 12:04:40 +08:00
    算了, 我还是老老实实的看 terrraform 吧
    joesonw
        3
    joesonw  
       2021-06-14 12:21:28 +08:00
    netflix 的 ConsoleMe 可以看一看. 他们全部基础设施都在 aws 上, 对 aws 的管理还是很有一套.
    gtx990
        4
    gtx990  
       2021-06-14 14:04:50 +08:00 via Android
    我们一般用 cdk 的
    Cabana
        5
    Cabana  
       2021-06-14 14:16:29 +08:00
    好奇这种双语的博客是要写两次么,还是写一份用软件翻译改吧改吧就行?
    xiaket
        6
    xiaket  
    OP
       2021-06-14 15:14:51 +08:00
    @wandehul @gtx990 这篇要点在于提供了多账号管理且不需要跨账号 assume role 的方式, 和是否使用 cdk/tf 没什么关系.
    xiaket
        7
    xiaket  
    OP
       2021-06-14 15:15:55 +08:00
    @Cabana 我是先用英文写的, 这两天放假有空全部人肉翻译了一遍再校对润色了一遍.
    xiaket
        8
    xiaket  
    OP
       2021-06-14 15:17:51 +08:00
    @joesonw 谢谢! 我们的全部基础设施也都在 aws 上. 看过 ConsoleMe, 不太喜欢这种自助式服务, 因为担心配置漂移, 另外我们还没有到那种需要为几百几千个人提供访问权限的程序.
    hcsu
        9
    hcsu  
       2021-06-14 15:27:08 +08:00
    膜拜大佬
    xupefei
        10
    xupefei  
       2021-06-14 16:32:46 +08:00 via iPhone
    在配置文件外面套一层 jsonnet 的话会更爽。
    xiaket
        11
    xiaket  
    OP
       2021-06-14 16:51:59 +08:00
    @xupefei 谢谢, 我们自己实现 jsonnet 那层逻辑也不算太大负担, 我现在只是有点后悔没用 toml.
    whileFalse
        12
    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
        13
    imstand  
       2021-06-14 20:33:10 +08:00
    这种使用方法有些新奇
    akira
        14
    akira  
       2021-06-15 01:35:34 +08:00
    不是很明白这么做的好处。。
    vindurriel
        15
    vindurriel  
       2021-06-15 07:52:07 +08:00 via iPhone
    想问问为啥用 toml ?
    eventbridge 跨账号传数据确实比 iam 风险高 需要额外的验证步骤
    xderam
        16
    xderam  
       2021-06-15 10:36:33 +08:00
    用户账号即代码?话说这个思路没问题,但是。。如果这个账号不用了如何搞?临时禁止了如果搞?代码一般是个无状态的东西,个人感觉 xxx 即代码比较难搞的就是这个状态。举个例子 terraform 在创建之后就会在本地或者远程保存一个状态文件。这样就不至于多人协同的时候搞乱了。
    xiaket
        17
    xiaket  
    OP
       2021-06-15 10:38:06 +08:00   ❤️ 1
    @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
        18
    marffin  
       2021-06-15 11:13:31 +08:00
    棒棒哒,现在越来越多的公司碰到了 aws governance 的问题了
    xiaket
        19
    xiaket  
    OP
       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
        20
    xiaket  
    OP
       2021-06-15 11:17:59 +08:00
    @xderam 账号不用了就删掉呗, 这个月我已经干掉了 10 个账号了, 删完账号后配置文件里面再删掉就好, 目前来看, 不算太麻烦. 而且我们懒, 一般是该删的账号积了一堆后一次干掉多个, 节省时间和精力. 至于你说的那个状态, 我们是用 cicd 流程来保证配置和实际强一致收敛.
    xderam
        21
    xderam  
       2021-06-15 16:03:19 +08:00
    @xiaket 那就是还要手工删除账号?似乎也不是不可以。状态的那个解决方案似乎也没啥毛病。不过这么做的好处和弊端如果能再说说分享下就更好了。
    vindurriel
        22
    vindurriel  
       2021-06-15 16:33:18 +08:00 via iPhone
    @xiaket 原来是 pyyaml 那确实
    assumeRole 这套是现成的 RBAC 上下游可以分别控制权限 用 eventbridge 不但得自己搞 发送账号还不好限制接收账号的权限(只能定义谁能看 不能定义看了能做啥)
    xiaket
        23
    xiaket  
    OP
       2021-06-15 17:16:05 +08:00
    @xderam 谢谢, 我们可以自动删账号的, 只不过目前我们觉得相对比较危险, 所以没这样做. 即, 技术上没有问题, 只不过我们没有去这样处理.

    好处在于后面如果添加了什么新特性, 可以很方便地加到这个 DSL 里面, 可玩性可扩展性都比较好. 坏处嘛毕竟是自己写的, 有个后续维护的开销.
    xiaket
        24
    xiaket  
    OP
       2021-06-15 17:20:06 +08:00
    @vindurriel 谢谢, 大家对 pyyaml 看来是怨恨都很多. lol

    我对 assume-role 的不满仍可以参见我上面的比方, assume-role 给了一台服务器的 shell 权限, 虽然是受限的; 而 eb 给了一个 api, 没有直接暴露 shell, 所以我们觉得放心一点. 不过对于 eventbridge 方案你提到的坏处我有点不太理解. 我为啥要限制接收账号的权限? 我定义好了消息的格式后就把命令丢出去, 这类似一个客户端请求, 受服务端处理的摆布在我理解算是正常的?
    lyhiving
        25
    lyhiving  
       2021-12-07 12:00:09 +08:00
    用法高端,如果是 PHP 的话我觉得已经传疯了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1020 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:25 · PVG 03:25 · LAX 12:25 · JFK 15:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.