AWS Management Solution V2
权限管理
1. 每个客户提供 AWS 账户,由 InceptionPad 的 AWS 管理员负责管理;
2. 账户中仅创建一个用于开发的 IAM User (名为 dev),附加项目需要用到的 AWS 服务权限,启用 AccessKey ;
3. AWS 管理员为每个账户管理一份 AWS MgmtProfile 。
操作规范
1. 任何一个新的 AWS 账户,首先开启 CloudTrail 服务;
2. EC2 上应用程序通过 IAM 角色和策略配置接入各种 AWS 服务;
3. 开发者的本地环境,通过 AccessKey 接入各种 AWS 服务;
4. 评估整个项目对于每个 AWS 服务的单日使用量,比如每天 Email 发送数量不会超过10000,则通过 CloudWatch 设定服务熔断条件;
5. 正在开发的项目, AWS 管理员每月第一个周一上午刷新对应的 AccessKey,发送给开发者;
6. 结束开发的项目, AWS 管理员要将 AccessKey 置为 Inactive 状态。
风险分析
1. 客户 AWS 账户中只有一个 AccessKey ,权限最小化,每月刷新或者置为 Inactive 状态;
2. CloudWatch 也会将损失控制在很小范围;
成本分析
1. 金钱成本,InceptionPad 不需要承担开发期间的 AWS 服务费用;
2. 管理成本,为每个客户管理一份 MgmtProfile ,每月刷新 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 == 'local') {
$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参数,但是如果依然传了这个参数,那么是否能够通过鉴权完全取决于这个参数。
本地接入 AWS 服务的其他方案
1. 在开发账户中指定本地开发者的主机IP白名单(该方案尚未实验);
2. 本地不接入真正的 AWS 服务,而是提供一组可以使流程畅通的调试代码,比如发送邮件时将邮件上下文写入本地文件中。
AWS MgmtProfile 模板
1. AWS Console - https://385054677422.signin.aws.amazon.com/console
account and password
2. AccessKey
包含的权限 SES, S3
刷新记录
+ 2019-12-01
+ 2020-01-01
3. 服务使用情况
IAM
+ User - dev
+ Role - AppInEC2
+ Policy - SES, S3
EC2
+ 52.201.74.23 (prod)
+ 34.224.209.16 (dev)
SES
S3
4. 安全防护
CloudTrail
CloudWatch
+ Alarms
Billing
EmailSendCount
+ Events
EC2 Instance State-change Notification
5. System Health