Невозможно получить доступ к S3 через конечную точку VPC в Lambda - PullRequest
0 голосов
/ 25 мая 2018

У меня есть функция Lambda в моем VPC, и я хочу получить доступ к корзине S3.

Я правильно установил конечную точку S3 VPC, я думаю,

, потому что я создал экземпляр EC2 вта же подсеть (подсеть лямбда-функции),

использует ту же группу безопасности,

и запускает копию кода функции лямбда,

Может корректно отображать S3содержимое файла.

Но когда я запускаю код в Lambda, он не работает.

Итак, я хочу знать в чем разница между "запустить в EC2" и"запустить в Lambda"?

Почему произошел сбой при запуске в Lambda?

Вот мой код функции Lambda:

import boto3

s3 = boto3.client('s3', region_name='ap-northeast-1')

def lambda_handler(event, context):
    bucket = '*xxxxxx*'
    key = 's3-upload.json'
    try:
        response = s3.get_object(Bucket=bucket, Key=key)
        print('--------------------------------------')
        print(response)
        print('--------------------------------------')
        body = response['Body'].read()
        print(body)
        print('--------------------------------------')
        print("CONTENT TYPE: " + response['ContentType'])

    except Exception as e:
        print('Error getting object.')
        print(e)
        raise e

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Если вы хотите разрешить AWS Lambda доступ к Amazon S3, используйте один из следующих способов:

  • Не связывайте функцию с VPC.В этом случае доступ выполняется автоматически.
  • Если функция присоединена к общедоступной подсети в VPC, свяжите Elastic IP с ENI лямбда-функции, которая появляется в VPC
  • Если функция подключена к частной подсети в VPC, запустите NAT Gateway в общедоступной подсети и обновите таблицы маршрутизации.Трафик будет поступать в Интернет через шлюз NAT.
  • Добавьте конечную точку VPC Amazon S3 в VPC и обновите таблицы маршрутизации.Трафик будет проходить через него вместо интернет-шлюза.
0 голосов
/ 28 мая 2018

Спасибо всем!Я нашел причину.

В моей Lambda есть две подсети: private_sn_1 и private_sn_2,

private_sn_1 правильно установил таблицу маршрутизации конечной точки vpc,

, но private_sn_2 установил неправильный маршрутtable,

и мой ec2 создан в private_sn_1, чтобы он мог получить доступ к конечной точке vpc.

В обычном случае Lambda будет работать в произвольном порядке в private_sn_1 или private_sn_2,

, но в моем случаеон всегда выполняется в private_sn_2 (я не знаю почему),

, поэтому, когда я исправил таблицу маршрутов private_sn_2,

все правильно.

0 голосов
/ 25 мая 2018

Несмотря на то, что они находятся в одном VPC, EC2 и Lambda по-прежнему являются разными средами в AWS.Возможность запуска вашего кода в одном, а не в другом означает, что ваш код в порядке и работает, поэтому, скорее всего, это проблема конфигурации с AWS.

Вы проверили роль обслуживания / выполнения, которую представляет лямбда?с помощью?

Необходимо убедиться, что используемой роли IAM разрешен правильный уровень доступа S3.

Эта документация по ролям выполнения для лямбды может предоставить полезную отправную точку: https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role

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

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:Get*",
            "s3:List*"
        ],
        "Resource": "*"
    }
]

}

...