Я пишу функцию AWS Lambda для запуска задачи ECS Fargate. Я следую примеру, приведенному на Запускать задачи с помощью AWS Fargate и Lambda . Пока моя установка работает, есть одна из частей, связанных с ролями IAM, которую я не понимаю.
Одним из шагов является создание задачи ECS. Я создаю эту задачу с «ролью выполнения задачи IAM», оставленной на ecsTaskExecutionRole
. Согласно информации на странице настройки задачи ECS, «роль IAM для выполнения задачи» - это
роль, которая разрешает Amazon ECS извлекать частные изображения и публиковать журналы для вашей задачи. Это заменяет роль Экземпляра EC2, когда запущенные задачи.
Затем я создаю лямбда-функцию. Частью настройки этой функции Lambda является создание другой роли IAM, поскольку, согласно странице «Запуск задач с помощью AWS Fargate и Lambda»
, Lambda потребуется роль 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" ]
}
]
}
Я не понимаю, почему лямбда-функция должна иметь это iam: PassRole
разрешение. Почему функция Lambda должна «передавать задачу ecsTaskExecutionRole»? Разве задаче ECS эта роль не назначается автоматически при выполнении из-за того, что я установил для параметра «Роль IAM выполнения задачи» значение ecsTaskExecutionRole
? Если нет, то в чем смысл настройки «Роль IAM для выполнения задачи»?
Процитируем документацию AWS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html):
Чтобы настроить многие сервисы AWS, необходимо передать Роль IAM для службы. Это позволяет службе позже взять на себя роль и выполнять действия от вашего имени. Вам нужно передать роль службе только один раз во время настройки, а не каждый раз, когда служба принимает роль. Например, предположим, что у вас есть приложение, работающее на инстансе Amazon EC2. Этому приложению требуются временные учетные данные для аутентификации и разрешения для авторизации приложения для выполнения действий в AWS. Когда вы настраиваете приложение, вы должны передать роль в EC2 для использования с экземпляром, который предоставляет эти учетные данные. Вы определяете разрешения для приложений, работающих в экземпляре, присоединяя политику IAM к роли. Приложение принимает роль каждый раз, когда ему необходимо выполнить действия, разрешенные этой ролью.
Параметр ecsTaskExecutionRole
определяет разрешения IAM, которые вы хотите предоставить задаче Fargate. В большинстве случаев пользователи будут просто использовать управляемую роль AWS «role/ecsTaskExecutionRole», которая позволяет загружать любой образ из ECR.
Но представьте, что у вас есть другая политика, которая разрешает загрузку только определенного изображения.
Ваш администратор хочет, чтобы вы могли использовать только эту политику, поэтому он использует привилегию iam:PassRole в вашей Lambda, чтобы сказать, что вы можете передавать только эту роль. Теперь он запретил вам использовать любую другую роль IAM, которая могла бы дать вам доступ к большему количеству изображений ECR.
Таким образом, без разрешения PassRole вы сможете указать все, что хотите, в качестве ecsTaskExecutionRole, чтобы, возможно, предоставить вам доступ к большему, чем хочет администратор.