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 服务,而是提供一组可以使流程畅通的调试代码,比如发送邮件时将邮件上下文写入本地文件中。