2016-12-29 10 views
3

После подключения к необходимым ресурсам AWS в начале моей лямбды-функции исполнения, у меня есть lambda_handler функцию, которая выглядит следующим образом:Неприятность с помощью модуля запроса питона, чтобы сделать API после вызова в пределах AWS лямбды

def lambda_handler(event, context, dst): 

    bucket = event['Records'][0]['s3']['bucket']['name'] 
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8')) 
    print('Bucket: %s' % bucket) 
    print('Object key: %s' % key) 

    crm_file_name = key.split('/')[-1] 
    crm_query = make_crm_db_query(crm_file_name) 
    cur = conn.cursor() 
    status = cur.execute(crm_query) 

    if status == 1: 
     details = cur.fetchone() 
     opportunity_id = details[0] 

     tmp = dst.get_key('%s/%s' % (opportunity_id, crm_file_name)) 
     print('starting API request...') 
     s = requests.Session() 
     r = s.post('http://link/to/endpoint/',\ 
      files={'pdf': tmp}, data={'opportunity_id': opportunity_id}) 
     print(r) 
     print(r.content) 
    else: 
     print('not the right file type') 

в моей среде разработки это возвращает следующее, указывая, что сообщение было успешно:

starting API request... 
<Response [201]> 
{"opportunity_id":253,"pdf":"https://s3.storage.asset.com:443/253/253___PDF.pdf?Signature=[CONFIDENTIAL STUFF HERE ;)]"} 

в журналах AWS Cloud Watch, однако процесс зависает при попытке выполнить запрос на почту. Вот пример журнала:

starting API request... 
END RequestId: beedb0c4-ce07-11e6-a715-53b3bd8edccc 
REPORT RequestId: beedb0c4-ce07-11e6-a715-53b3bd8edccc Duration: 30002.89 ms Billed Duration: 30000 ms Memory Size: 128 MB Max Memory Used: 22 MB 
2016-12-29T20:46:24.356Z beedb0c4-ce07-11e6-a715-53b3bd8edccc Task timed out after 30.00 seconds 

S3 ведро, API конечной точки и RDS все они принадлежат к одной и той же VPC. Процесс работает в dev, но висит в производстве. Любые указатели на то, как отладить это?

Я проверил this post, в котором говорится, что для подключения к внешним интернет-ресурсам требуется шлюз NAT, но наша конечная точка API работает на экземпляре EC2 в пределах того же VPC. Думает ли AWS, что мы все еще пытаемся установить внешнее соединение, потому что мы работаем с вызовами API? Как мне отладить это?

+0

Невозможно уйти отсюда с точки зрения аутсайдеров. Я бы просто дважды проанализировал различия между установкой dev и prod ... и убедитесь, что сделанные вами предположения верны. – Jack

+1

Вам необходимо убедиться, что вы используете закрытый IP-адрес сервера EC2, на котором запущен API. Если вы используете публичный IP-адрес, он будет рассматриваться как ресурсы, которые существуют вне VPC. Кроме того, вы открыли группу безопасности, к которой принадлежит сервер EC2, чтобы разрешить доступ к функции Lambda (через идентификатор группы безопасности, к которой принадлежит функция Lambda)? –

+0

@MarkB: Это действительно полезно, спасибо, я беспокоился, что это может быть что-то вроде этого. Проблема в том, что мы запускаем приложение на экземпляре EC2, настроенном с Jenkins. Балансы нагрузки считывают заголовок входящих запросов и затем вызывают соответствующее приложение на основе имени общедоступного домена. Если мы переключимся на частный IP, тогда балансировщик нагрузки не будет знать, какое приложение нужно вызвать. Похоже, мы можем либо настроить правила балансировки нагрузки (не уверен, насколько это легко), либо создать выделенный экземпляр. Как вы думаете? – Aaron

ответ

1

Я столкнулся с такими же timeout problem, причина ниже.

AWS document:

При добавлении конфигурации VPC к функции лямбда, он может только доступ к ресурсам в этой VPC. Если функции Lambda необходимо получить доступ к ресурсам VPC и общедоступному Интернету, VPC должен иметь экземпляр преобразования сетевых адресов (NAT) внутри VPC.

Комментарий Марка B является правильным.

Я советую вам следовать за этим blog, чтобы построить NAT.

+0

Спасибо, @Jimlin, вы и Марк Б находятся на месте. VPC был самым простым способом решить эту проблему. – Aaron

 Смежные вопросы

  • Нет связанных вопросов^_^