AWS: Lambda отправляет пакетное задание через клиент Python boto3, но время ожидания до получения ответа - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть лямбда-функция, которая имеет обработчик Python, который отправляет задание AWS Пакетная обработка через boto3 клиент:

client = boto3.client('batch', 'us-east-1')

def handle_load(event, context):

    hasher = hashlib.sha1()
    hasher.update(str(time.time()).encode())
    job_name = f"job-{hasher.hexdigest()[:10]}"
    job_queue = os.environ.get("job_queue")
    job_definition = os.environ.get("job_definition")

    logger.info(f"Submitting job named '{job_name}' to queue '{job_queue}' "
                f"with definition '{job_definition}'")

    response = client.submit_job(
        jobName=job_name,
        jobQueue=job_queue,
        jobDefinition=job_definition,
    )

    logger.info(f"Submission successful, job ID: {response['jobId']}")

Я вижу, как эта лямбда-функция отправляет пакетное задание в CloudWatch регистрирует, но время ожидания ответа всегда возвращается. Я никогда не вижу, чтобы эти задания появлялись в очереди, поэтому я не уверен, где вещи go после их отправки, кажется, что лямбда-тайм-аут всегда истекает до того, как ответ возвращается, у меня мало другого для go на.

Я успешно добавил задание в очередь через AWS CLI, используя те же ARN очереди и определения, которые используются в коде Python Lambda. Это задание можно увидеть в очереди на вкладке «Выполнить» (предположительно, задание будет запущено в какой-то момент в ближайшем будущем).

Отправка задания с помощью AWS CLI возвращается немедленно, поэтому необходимо что-то не так в конфигурации Lambda, препятствующей выполнению задания. Возможно, я не использую правильную роль для Lambda, которая отправляет задание, или у меня есть какие-то другие разрешения, которые не соответствуют истечении времени ожидания? У лямбды есть разрешение на действие batch:SubmitJob, разрешенное для всех ресурсов.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Если AWS лямбда-функция не подключена к VP C, то по умолчанию она подключена к Inte rnet. Это означает, что он может вызывать AWS API-функции, которые находятся в Inte rnet.

Если ваша функция Lambda настроена на использование VP C, она не будет иметь Inte rnet доступ по умолчанию. Это хорошо для подключения к другим ресурсам в VP C, но если вы хотите sh для связи со службой AWS, вы либо:

  • A NAT Шлюз в общедоступном c su bnet, с функцией Lambda, подключенной к частному su bnet, который имеет правило таблицы маршрутов, которое указывает на шлюз NAT, или
  • A VP C конечная точка , которая подключается к желаемой услуге. К сожалению, AWS Batch не имеет конечной точки VP C.

Итак, если вашей функции Lambda не нужно подключаться к другим ресурсам в VP C, вы можете отключите его и оно должно работать. В противном случае используйте NAT Gateway .

1 голос
/ 30 апреля 2020

На основании комментариев. Лямбда в VP C не имеет доступа к inte rnet. Вам нужно настроить inte rnet шлюз в publi c su bnet и NAT gateway в частном su bnet с вашей лямбдой, чтобы иметь доступ к AWS Пакетные конечные точки. В качестве альтернативы необходимо использовать VP C конечную точку интерфейса для AWS Batch. Из документов :

Подключите свою функцию к частным подсетям для доступа к частным ресурсам. Если вашей функции необходим доступ inte rnet, используйте NAT. Подключение функции к общедоступному c su bnet не дает ему доступа inte rnet или общедоступному c IP-адресу .

Также вам необходимо добавить разрешения для вашей исполняющей роли лямбды , чтобы иметь возможность создавать сетевой интерфейс в VP C:

  • ec2: CreateNetworkInterface

  • ec2: DescribeNetworkInterfaces

  • ec2: DeleteNetworkInterface

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