目前,我们正在运行4个命令:
以下是jenkins停靠容器中的两个aws cli命令:
sh 'aws cloudformation package ...'
s3Upload()在docker容器中的两个aws cli命令下面:
aws s3 cp source dest
aws cloudformation deploy要在docker容器中运行上述4条命令,aws cli从docker ( EC2 )派生访问权限,使用具有策略权限的角色(用于访问s3和创建/更新云形成堆栈)。
但是问题有这样的解决方案,
我们必须将这个角色(比如xrole)分配给每个在每个测试环境中运行的EC2。有3-4个测试环境。
在内部,aws作为aws::sts::{account Id}::assumerole/xrole/i-112223344创建一个临时用户,并在代表该用户运行的4个以上命令中运行。
更好的解决方案是创建一个用户,并为此分配相同的role(xrole),并运行与此用户相同的4个命令。
但,
1)创建这样的用户的过程是什么?因为它必须假设xrole..。
2)如何与该用户一起运行以上4个命令?
发布于 2019-08-09 12:11:25
最佳实践是在使用EC2实例时使用角色,而不是用户。只有当您需要将权限授予在AWS环境之外的计算机上运行的应用程序时(前提下),用户才是必需的。即便如此,授予此用户权限仅承担授予必要权限的角色仍然是最佳做法。
如果您正在从容器中运行所有命令,并且希望将权限授予容器而不是整个EC2实例,那么您可以做的就是使用ECS服务而不是普通的EC2实例。
在ECS中使用EC2启动类型时,您对EC2实例有相同的控制,但区别在于您可以将角色附加到特定的任务(容器),而不是整个EC2实例。通过这样做,您可以在同一个EC2实例上运行几个不同的任务(容器),而每个任务(容器)都只有其所需的权限。因此,如果您的一个容器需要将数据上载到S3,您可以创建必要的角色,在任务定义中指定角色,并且只有特定的任务才具有这些权限。其他任务和EC2实例本身都无法将对象上载到S3。
此外,如果为任务指定了awsvpc网络模式,那么每个任务都将得到自己的ENI,这意味着您可以为每个任务分别指定安全组,即使它们运行在同一个EC2实例上。
下面是一个使用存储在ECR和角色中的docker映像的任务定义示例,称为AmazonECSTaskS3BucketRole。
{
"containerDefinitions": [
{
"name": "sample-app",
"image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/aws-nodejs-sample:v1",
"memory": 200,
"cpu": 10,
"essential": true
}
],
"family": "example_task_3",
"taskRoleArn": "arn:aws:iam::123456789012:role/AmazonECSTaskS3BucketRole"
} 以下是任务定义的文档
发布于 2019-08-09 13:40:30
运行在同一主机上的应用程序共享通过实例配置文件分配给主机的权限。如果由于安全性要求,希望隔离运行在同一个实例上的不同应用程序,最好在不同实例上启动它们。使用每个应用程序的访问键并不是一种推荐的方法,因为访问键是长期的凭据,当主机被共享时,可以很容易地检索它们。
可以像前面的答案所建议的那样,将IAM角色分配给ECS任务。但是,不阻止在容器实例上运行的容器访问通过实例配置文件提供的凭据。因此,建议将最小权限分配给容器实例角色。
如果以awsvpc网络模式运行任务,则可以配置ECS代理,以防止任务访问实例元数据。您应该只设置代理配置变量ECS_AWSVPC_BLOCK_IMDS=true并重新启动代理。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html
https://stackoverflow.com/questions/57428959
复制相似问题