AWS Management Solution V1

两种账户

1. 客户账户(多个)

2. 开发账户(一个)

用途分类

1. 客户账户仅用于部署各项目的Staging和Production版本;

2. 开发账户用于开发、测试、实验;

权限管理

1. 客户账户仅由 AWS 管理员进行管理;

2. 开发账户仅创建一个用于开发的 IAM User (名为 dev),附加整个团队需要用到的 AWS 服务权限,启用 AccessKey ;

使用规范

1. 任何一个新的 AWS 账户,首先开启 CloudTrail 服务;

2. 客户账户的环境上,EC2 上应用程序通过 IAM 角色和策略配置接入各种 AWS 服务;

3. 开发账户的环境上,通过 AccessKey 接入各种 AWS 服务;

4. 开发账户,评估整个团队对于每个 AWS 服务的单日使用量,比如每天 Email 发送数量不会超过1000,则通过 CloudWatch 设定服务熔断条件;

5. 开发账户,AWS 管理员每月第一个周一上午刷新 AccessKey,群发给各项目负责人;

风险分析

1. 客户账户从根本上杜绝了 AccessKey 泄露的风险;

2. 开发账户同一时间只存在一个有效的 AccessKey ,权限最小化,每月刷新;

3. 开发账户的 AccessKey 即使泄露,CloudWatch 也会将损失控制在很小范围;

成本分析

1. 金钱成本,所有项目开发过程的 AWS 费用都由 InceptionPad 承担,由于 EC2 有免费版本,节省了大部分开销,整个团队每年用在开发上的 AWS 费用可以控制在小几千元人民币,完全可以承受;

2. 管理成本,客户账户不存在 AccessKey 的管理成本,开发账户仅管理一个 AccessKey ;

3. 技术成本,应用程序内调用 AWS 服务的代码,对于使用 AccessKey 和不使用 AccessKey 两种情况略有不同。
    // 参数中存在credentials时,通过 AccessKey 鉴权。
    $s3 = new S3Client([
        'region' => 'us-east-1',
        'version' => 'latest',
        'credentials' => [
            'key'    => 'FAKE07I7OFTU2ETTMBOJ',
            'secret' => 'FAKE0/N4hTRx44dSXReZJSUzjnBJf2GpE6GC0kES',
        ]
    ]);

    // 参数中不存在credentials时,通过 IAM Role 鉴权。
    $s3 = new S3Client([
        'region' => 'us-east-1',
        'version' => 'latest',
    ]);

    // 所以,开发程序的时候需要做类似的环境判断
    if ($env == 'development') {
        $s3 = new S3Client([
            'region' => 'us-east-1',
            'version' => 'latest',
            'credentials' => [
                'key'    => 'FAKE07I7OFTU2ETTMBOJ',
                'secret' => 'FAKE0/N4hTRx44dSXReZJSUzjnBJf2GpE6GC0kES',
            ]
        ]);
    } else {
        $s3 = new S3Client([
            'region' => 'us-east-1',
            'version' => 'latest',
        ]);
    }

    // 另外,实验中发现,在环境满足 IAM Role 鉴权要求的情况下,本不需要传递credentials参数,但是如果依然传了这个参数,那么是否能够通过鉴权完全取决于这个参数。

方案缺点

1. 增加了开发阶段的 AWS 费用。
2. 开发停止后,用于开发的如 EC2, S3 等服务仍是持续计费的。如果关闭(删除)服务,不在产生费用,但是一旦重新启动开发,需要恢复环境。

本地接入 AWS 服务的其他方案

1. 在开发账户中指定本地开发者的主机IP白名单(该方案尚未实验);

2. 本地不接入真正的 AWS 服务,而是提供一组可以使流程畅通的调试代码,比如发送邮件时将邮件上下文写入本地文件中。

results matching ""

    No results matching ""