boto3 лямбда-вызов для запуска задачи ECS требует жесткого кодирования в номере ревизии? - PullRequest
0 голосов
/ 21 января 2019

Короче говоря, я не хочу жестко кодировать номера версий определений задач 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:*

1 Ответ

0 голосов
/ 21 января 2019

Мне удалось воспроизвести ваше поведение, и я решил проблему, указав Resource в политике IAM.

{
    "Sid": "VisualEditor1",
    "Effect": "Allow",
    "Action": "ecs:RunTask",
    "Resource": "arn:aws:ecs:MY_REGION:MY_ACCOUNT_ID:task-definition/an-important-task"
}

Если вы планируете предоставить ревизию, то ресурс должен содержать :* или он должен точно совпадать с taskDefinition.

Дайте мне знать, как у вас дела !!.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...