it-roy-ru.com

Amazon S3 вызывает другую функцию Lambda в другом аккаунте

Я хочу запустить лямбду в учетной записи B, когда в корзину S3 входит какой-либо объект.

Но я слышал, что мы можем получить доступ к Lambda только с одной и той же учетной записи S3, для кросс-учетной записи S3 Lambda я должен запустить Lambda с той же учетной записью и сделать еще один триггер, который запускает другую учетную запись Lambda:

  1. S3 (Счет A) -> Лямбда (Счет B) - невозможно
  2. S3 (счет A) -> лямбда (счет A) -> лямбда (счет B) - возможно

Может кто-нибудь помочь мне, какой вариант возможен? Если так, то как?

4
sandeep

Мне удалось успешно активировать лямбда-функцию AWS в учетной записи B из загрузки в корзину Amazon S3 в учетной записи A.

Account-A.S3-bucket -> Account-B.Lambda-function

Вот что я сделал:

  • Создание корзины Amazon S3 в учетной записи A
  • Создана функция Lambda в учетной записи B
  • Добавлена ​​ Политика на основе ресурсов для AWS Lambda в функцию Lambda через Интерфейс командной строки AWS (CLI) , которая позволяла корзине S3 вызывать lambda:InvokeFunction на Lambda функция
  • В корзину S3 добавлена ​​Bucket Policy, чтобы разрешить доступ к GetObject из любого места (это должно быть заблокировано в дальнейшем, но этого достаточно для эксперимента)
  • Сконфигурировал Event для ObjectCreate (All) в корзине S3, ссылаясь на функцию Lambda через ARN
  • Загрузил файл в ведение Account-A.S3
  • Account-B.Lambda-функция была успешно запущена

Затем я повторил эксперимент с bucket в другом регионе, и он не удался, сказав:

Область обслуживания пункта назначения уведомления недопустима для ограничения местоположения сегмента

5
John Rotenstein

@ Решение Джона работает, но есть некоторые шаги, которые я хотел бы добавить к его ответу.

  • S3 ведро и лямбда должны находиться в одном регионе. Например, оба должны быть созданы в регионе us-east-1. Различные регионы будут выдавать ошибку, как показано ниже:

Область обслуживания пункта назначения уведомления недопустима для ограничения местоположения сегмента

Ниже приведены Шаги, которым я следовал, чтобы создать триггер:

Account-A.S3-bucket -> Account-B.Lambda-function
  1. Из Терминала переключитесь на профиль AWS Account-B, где будет находиться Lambda.
  2. Запустите команду ниже, измените параметры для вашего случая:

    aws lambda add-permission \ --region {Account-B.Lambda region Eg. us-east-1} \ --function-name {Account-B.Lambda name} \ --statement-id 1 \ --principal s3.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn arn:aws:s3:::{Account-A.S3 name} \ --source-account {Account-A.account-id} \ --profile {Account-B.profile-name}

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

  1. Перейдите к Account-A 's S3 bucket и в Properties вкладка> в Events
  2. Выберите Добавить уведомление
  3. Добавьте следующие поля:

    Name: ObjectCreation Events: ObjectCreate (All) Send to: Lambda function Lambda: Add Lambda function ARN Lambda function ARN: your-lambda-arn

Примечание. Функция Lambda может по-прежнему отображать ошибку, но новые объекты, добавленные в корзину S3, запускают журналы лямбды и печати (событий) в журналах Cloudwatch. 

1
Vaulstein

В новой консоли S3 перейдите на консоль S3 и откройте ведро. Нажмите на вкладку Свойства -> События. Вам нужно дать разрешение S3 для вызова функции Lambda. См. настроить Amazon s3 bucket для запуска лямбда-функции, созданной в другой учетной записи

0
krishna_mee2004

Оба варианта должны быть возможны. Таким образом, вы можете пойти с первым вариантом, который является минималистичным.

Используйте функцию перекрестного доступа в IAM для предоставления доступа к S3 (учетная запись A) из Lambda (учетная запись B). 

Это достигается путем создания роли IAM в учетной записи B, которая предоставляется для доступа к корзине в учетной записи A и допускается для принятия лямбда (в учетной записи B). 

Для получения дополнительной информации см. Следующую документацию от AWS.

0
Ashan