为什么 AWS Lambda 需要将 ecsTaskExecutionRole 传递给 ECS 任务

use*_*042 6 amazon-iam amazon-lambda aws-fargate

我正在编写一个 AWS Lambda 函数来触发 ECS Fargate 任务。我正在遵循使用 AWS Fargate 和 Lambda 运行任务中提供的示例。虽然我的设置有效,但我不了解涉及 IAM 角色的部分之一。

其中一个步骤是创建一个 ECS 任务。我创建了该任务,其“任务执行 IAM 角色”保留在ecsTaskExecutionRole. 根据ECS任务设置页面的信息,“任务执行IAM角色”是

授权 Amazon ECS 为您的任务拉取私有映像和发布日志的角色。这在运行任务时代替 EC2 实例角色。

接下来,我创建 Lambda 函数。Lambda 函数设置的一部分是创建另一个 IAM 角色,因为根据“使用 AWS Fargate 和 Lambda 运行任务”页面,

Lambda 需要具有 2 个策略的 IAM 角色 - 一个用于运行任务,第二个用于将 ecsTaskExecutionRole 传递给任务。

角色看起来像这样(我压缩了空白以节省空间):

{   "Version": "2012-10-17",
    "Statement": [
        {   "Sid": "Stmt1512361420000",
            "Effect": "Allow",
            "Action": [
                "ecs:RunTask"
                 ],
            "Resource": [ "*" ]
        },
        {   "Sid": "Stmt1512361593000",
            "Effect": "Allow",
            "Action": [ "iam:PassRole" ],
            "Resource": [ "arn:aws:iam::************:role/ecsTaskExecutionRole" ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么 Lambda 函数必须具有此iam:PassRole权限。为什么 Lambda 函数必须“将 ecsTaskExecutionRole 传递给任务”?由于我将“任务执行 IAM 角色”设置为 ,ECS 任务在运行时是否会自动分配该角色ecsTaskExecutionRole?如果不是,那么“任务执行 IAM 角色”设置的意义何在?

wim*_*nat 1

引用AWS文档(https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html):

要配置许多 AWS 服务,您必须将 IAM 角色传递给服务。这允许服务稍后承担该角色并代表您执行操作。您只需在设置过程中将角色传递给服务一次,而不是每次服务代入该角色时。例如,假设您有一个在 Amazon EC2 实例上运行的应用程序。该应用程序需要临时凭证进行身份验证,并需要授权应用程序在 AWS 中执行操作的权限。设置应用程序时,您必须将角色传递给 EC2 以与提供这些凭证的实例一起使用。您可以通过将 IAM 策略附加到角色来定义在实例上运行的应用程序的权限。应用程序每次需要执行该角色允许的操作时都会承担该角色。

ecsTaskExecutionRole参数定义您想要授予 Fargate 任务的 IAM 权限。在大多数情况下,用户将仅使用 AWS 托管角色“role/ecsTaskExecutionRole”,该角色允许从 ECR 下载任何映像。

但想象一下您有一个不同的策略,只允许下载特定图像。

您的管理员只希望您能够使用该策略,因此他在您的 Lambda 中使用 iam:PassRole 权限来表示您只能传递该角色。现在,他已阻止您使用任何其他 IAM 角色,这些角色可以让您访问更多 ECR 映像。

总之,如果没有 PassRole 权限,您就可以将您想要的任何内容指定为 ecsTaskExecutionRole,这样您的访问权限可能会超出管理员的权限。