Доступ AWS S3 от Lambda в VPC

В целом, я довольно смущен, используя AWS Lambda в VPC. Проблема заключается в том, что Lambda отключается, пытаясь получить доступ к ведро S3. Решение представляется конечной точкой VPC.

Я добавил функцию Lambda в VPC, чтобы он мог получить доступ к базе данных RDS, которая не показана в коде ниже, но функциональна. Тем не менее, теперь я не могу получить доступ к S3 и делать все возможное для этого.

Я попытался создать конечную точку VPC S3, но ничего не изменилось.

Конфигурация VPC

Я использую простой VPC, созданный по умолчанию всякий раз, когда я впервые делал экземпляр EC2. Он имеет четыре подсети, все созданные по умолчанию.

Таблица маршрутов VPC

_Destination - Target - Status - Propagated_

172.31.0.0/16 - local - Active - No

pl-63a5400a (com.amazonaws.us-east-1.s3) - vpce-b44c8bdd - Active - No

0.0.0.0/0 - igw-325e6a56 - Active - No

Простая загрузка S3 Lambda:

import boto3
import pymysql
from StringIO import StringIO

def lambda_handler(event, context):
    s3Obj = StringIO()

    return boto3.resource('s3').Bucket('marineharvester').download_fileobj('Holding - Midsummer/sample', s3Obj)

Ответ 1

В случае boto3 URL-адреса S3 являются виртуальными по умолчанию, что требует разрешения доступа к Интернету для конкретных URL-адресов региона. Это приводит к зависанию лямбда-функции до истечения времени ожидания.

Для решения этой проблемы необходимо использовать объект Config при создании клиента, который говорит boto3 вместо этого создавать URL-адреса S3 на основе пути:

import boto3 import botocore.config

client = boto3.client('s3', 'ap-southeast-2, config=botocore.config.Config(s3={'addressing_style':'path'}))

Обратите внимание, что регион в вызове должен быть регионом, в который вы развертываете лямбду и конечную точку VPC.

После этого вы сможете использовать список префиксов pl-xxxxxx для конечной точки VPC в группе безопасности Lambda и по-прежнему получать доступ к S3.

Вот рабочий скрипт CloudFormation, который демонстрирует это. Он создает корзину S3, лямбду (которая помещает записи в корзину), связанную с VPC, содержащим только частные подсети и конечную точку VPC, и необходимые роли IAM.

Ответ 2

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

Когда вы создаете новую учетную запись AWS, которую я сделал прошлой осенью, таблица маршрутов, автоматически связанная с вашим VPC по умолчанию, не отображается (см. таблицы маршрутов → Связи подсетей в консоли).

Поэтому, если вы будете следовать инструкциям, чтобы создать конечную точку и создать маршрут для этой конечной точки, маршрут не будет добавлен, потому что нет подсети для его установки. И как обычно с AWS вы не получите сообщение об ошибке...

Что вы должны сделать, это создать подсеть для вашей лямбда-функции, связать эту подсеть с таблицей маршрутов и лямбда-функцией, а затем повторно выполнить инструкции конечной точки, и в случае успеха вы найдете таблицу маршрутов, которая имеет три записи, например:

Destination     Target
10.0.0.0/16     Local
0.0.0.0/0       igw-1a2b3c4d
pl-1a2b3c4d     vpce-11bb22cc

Если у вас есть только две записи (нет записи pl-xxxxx), значит, вы еще не достигли успеха.

В конце концов, я не удивлюсь, что лямбда-функции нужна подсеть для жизни, как и любой другой объект в сети. И, вероятно, желательно, чтобы он не находился в той же подсети, что и ваши экземпляры EC2, потому что для lambda могут потребоваться другие маршруты или разрешения безопасности. Обратите внимание, что GUI в lambda действительно хочет, чтобы у вас было две подсети в двух разных AZ, что также является хорошей идеей.

Ответ 3

Причиной моей проблемы была неправильная настройка правил исходящей почты моей группы безопасности. В частности, мне нужно было добавить правило исходящего исходящего трафика с пунктом назначения pl-XXXXXXXX (услуга S3. Фактическое значение было предоставлено консолью AWS).

Ответ 4

Существует еще одно решение, связанное с конечными точками VPC.

На консоли AWS выберите службу VPC, а затем - конечные точки. Создайте новую конечную точку, свяжите ее со службой s3

Выбор конечной точки VPC S3

а затем выберите VPC и таблицу маршрутов.

Затем выберите уровень доступа (полный или пользовательский), и он будет работать.