感谢@Steffen 指出 CloudFormation,但我认为我找到了更适合我的解决方案。
AWS 提供了一个Security Token Service,简而言之,它允许您担任角色。
这正是我一直在寻找的,因为我想定义一个角色一次(例如一组 AWS 权限),然后让 AWS EC2 实例自动承担这个角色(很容易做到)以及开发人员承担一个特定服务的角色他们正在发展。开发人员部分涉及更多,但我将粘贴一些 Java 代码来说明如何在下面执行此操作。
首先,在定义角色时,您必须说明允许哪些委托人担任该角色。为此,您可以编辑角色的信任关系部分(位于 AWS Web UI 上角色定义页面的底部)
例如,这里有一个信任关系文档,它允许 EC2 实例以及我域中的一些用户担任此角色(替换 your-service-id-number 和 your-user@example.com):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::your-service-id-number:user/your-user@example.com",
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
接下来是在本地开发中运行时承担此角色的 Java 代码:
此代码检查我是否在 EC2 实例上运行,如果是,将承担该实例的角色(否则,DefaultAWSCredentialsProviderChain 定义的任何内容,但就我而言,最佳实践是 - EC2 实例角色)。如果在开发环境中运行,例如在 EC2 之外,它会承担roleName 提供的角色
AWSCredentialsProvider getCredentialsProvider(String roleName) {
if (isRunningOnEc2()) {
return new DefaultAWSCredentialsProviderChain();
}
// If not running on EC2, then assume the role provided
final AWSCredentials longLivedCredentialsProvider = new DefaultAWSCredentialsProviderChain().getCredentials(); // user credentials provided by env variables for ex.
// The String roleArn is defined at the top of the Role page titled "Role ARN" ;-)
final String roleArn = String.format("arn:aws:iam::your-service-id-number:role/%s", roleName);
final String roleSessionName = "session" + Math.random(); // not sure it's really needed but what the heck..
final STSAssumeRoleSessionCredentialsProvider credentialsProvider =
new STSAssumeRoleSessionCredentialsProvider(longLivedCredentialsProvider, roleArn, roleSessionName);
return credentialsProvider;
}
提供了实用程序isRunningOnEc2():
public static boolean isRunningOnEc2() {
try {
final InetAddress byName = InetAddress.getByName("instance-data");
return byName != null;
} catch (final UnknownHostException e) {
return false;
}
}
按照 Steffen 的建议使用 CloudFormation,在一般意义上也可能有用,主要是为了保持我的代码库和实际 AWS 部署的一致性,但这是另一回事。
但有一个令人讨厌的地方:可以将主体定义为实际用户名,但不能定义为用户组,因此您实际上不能说“所有开发人员都可以担任角色 x”,而是必须列出每个开发人员具体来说。这很烦人,但我猜I'm not the only one with this complaint。