Короче говоря, я не хочу жестко кодировать номера версий определений задач ECS для задач в моих лямбда-кодах.По сути, каждый раз, когда у меня есть обновленное определение задачи, мне приходится обновлять мой исходный код.В документации boto3 для ECS run_task()
четко указано
taskDefinition (строка) - [ОБЯЗАТЕЛЬНО]
Семейство и версия (семейство:редакция) или полный ARN определения задачи для запуска. Если версия не указана, используется последняя версия ACTIVE .
Однако я обнаружил, что если я определю параметр taskDefinition
в client.run_task()
без указанияномер редакции, я получаю сообщение об ошибке разрешения:
Произошла ошибка (AccessDeniedException) при вызове операции RunTask: пользователь: arn: aws: sts :: MY_ACCOUNT_ID: предполагаемая роль / моя-лямбда-роль/ trigger-ecs-task не авторизован для выполнения: ecs: RunTask на ресурсе: arn: aws: ecs: MY_REGION: MY_ACCOUNT_ID: определение задачи / важная задача
Если я переключу свойопределение an-important-task:LATEST
или an-important-task:*
, я получаю еще одну ошибку:
... не авторизован для выполнения: ecs: RunTask на ресурсе: *
Этостранно, потому что это выглядит вопреки тому, что указано в документации - когда я включаю номер ревизии, например an-important-task:5
, лямбда срабатывает отлично.В моей лямбда-функции я просто вызываю задачу ECS:
def lambda_handler(event, context):
client = boto3.client('ecs')
print("Running task.")
response = client.run_task(
cluster='my-cluster',
launchType='FARGATE',
taskDefinition='an-important-task', # <-- notice no revision number
count=1,
platformVersion='LATEST',
networkConfiguration={
'awsvpcConfiguration': {
'subnets': [
'subnet-1',
'subnet-2'
],
'assignPublicIp': 'DISABLED'
}
})
print("Finished invoking task.")
В своем определении Terraform я прикрепил необходимые политики к своей роли:
resource "aws_lambda_function" "trigger-ecs-task" {
function_name = "trigger-ecs-task"
handler = "my-lambda-function.lambda_handler"
role = "${aws_iam_role.lambda.arn}"
runtime = "python3.6"
# other stuff related to how I store my source code for the lambda
}
Определение моей роли,и прикрепляя разрешения на запуск задач ECS:
resource "aws_iam_role" "lambda" {
name = "my-lambda-ecs-role"
assume_role_policy = "${data.aws_iam_policy_document.lambda-assume-role.json}"
}
data "aws_iam_policy_document" "lambda-assume-role" {
statement {
actions = [
"sts:AssumeRole"]
principals {
type = "Service"
identifiers = [
"lambda.amazonaws.com"]
}
}
}
resource "aws_iam_policy" "run-ecs-policy" {
name = "run-ecs-task-policy"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "ecs:RunTask",
"Resource": "arn:aws:ecs:MY_REGION:MY_ACCOUNT_ID:task-definition/an-important-task:*"
},
{
"Sid": "Stmt1512361993201",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::************:role/${data.aws_iam_role.ecs-task-execution-role.name}"
]
}
]
}
EOF
}
Я прилагаю политику ниже:
resource "aws_iam_role_policy_attachment" "service-role-attach" {
role = "${aws_iam_role.lambda.name}"
policy_arn = "${aws_iam_policy.run-ecs-policy.arn}"
}
Почему AWS отказывается запускать мою задачу, если я не указываю конкретную ревизию?В своем определении политики я четко даю разрешение runTask
на все ревизии ресурса:
arn:aws:ecs:MY_REGION:MY_ACCOUNT_ID:task-definition/an-important-task:*