Вызвать Lambda с помощью SNS с внешнего аккаунта
Я следил за следующим сообщением в блоге от Amazon (сценарий 3: запуск лямбда-функции из уведомления корзины Amazon S3 в другой учетной записи) об авторизации функций Lambda для различных целей. Я хотел бы настроить лямбда-функцию для приема сообщений SNS от внешних учетных записей (внешних к действию с лямбда-функцией).
https://aws.amazon.com/blogs/compute/easy-authorization-of-aws-lambda-functions/
Я ожидал добавить разрешение для удаленного вызова функции следующим образом:
$ aws lambda add-permission \
--function-name MyFunction \
--region us-west-2 \
--statement-id Id-123 \
--action "lambda:InvokeFunction" \
--principal sns.amazonaws.com \
--source-arn arn:aws:sns:::<topic name> \
--source-account <account number> \
--profile adminuser
Затем я попытался перейти к теме SNS и установить Lambda в качестве конечной точки и ввести удаленный ARN для функции lambda в первой учетной записи. Это не так хорошо работает, так как конечная точка ожидает арн для функции в учетной записи...
План Б: Попробуйте создать подписку через CLI, чтобы обойти ограничение в консоли...
aws sns --profile adminuser \
--region us-west-2 subscribe
--topic-arn arn:aws:sns:us-west-2:<account #>:<topic name>
--protocol lambda
--notification-endpoint arn:aws:lambda:us-west-2:<account id>:function:<lambda function name>
Отклик:A client error (AuthorizationError) occurred when calling the Subscribe operation: The account <account id> is not the owner of the lambda function arn:aws:lambda:us-west-2:<account id>:function:<function name>
Кто-нибудь смог вызвать функцию Lambda из "удаленного" SNS в другой учетной записи? Я немного озадачен тем, где, возможно, я ошибся... Исходя из примечания в блоге, я полностью ожидал, что удаленный SNS будет работать:Note: Amazon SNS (Simple Notification Service) events sent to Lambda works the same way, with “sns.amazonaws.com” replacing “s3.amazonaws.com” as the principal.
2 ответа
Вы можете это сделать, если учетная запись провайдера авторизует учетную запись потребителя, которой принадлежит лямбда, для подписки на тему SNS. Это можно сделать в "Редактировании политики тем" на странице тем.
Вот краткое изложение шагов, позволяющих лямбде прослушивать тему SNS из внешней учетной записи:
- Потребительский счет создает лямбду,
- Учетная запись потребителя добавляет источник событий для лямбды в консоли AWS, указав тему ARN провайдера SNN (не беспокойтесь о сообщениях об ошибках здесь),
- Учетная запись поставщика добавляет разрешения на подписку SNS на учетную запись IAM потребителя, созданную в сторонней учетной записи AWS (выполняется с помощью "политики изменения тем", упомянутой выше),
- Потребитель использует учетную запись IAM, начиная с шага 2, чтобы добавить подписку в учетную запись поставщика с помощью интерфейса командной строки AWS.
Пример команды, которая работала для меня ранее для шага 4:
aws sns subscribe --topic-arn <provider_sns_arn> --protocol lambda --notification-endpoint <consumer_lambda_arn> --profile consumer-IAM-account
Сегодня было подобное требование. Итак, есть 3 шага. Предположим111111111
- аккаунт производителя с темой в соц.сетях и 2222222222
- это потребитель, у которого есть лямбда, и
Разрешение функции Lambda подписаться на тему
aws sns --profile SNS_Owner_Profile add-permission \ --topic-arn "arn:aws:sns:us-east-1:111111111:your-sns-top" \ --label "AllowCrossAccountSns" \ --aws-account-id "2222222222" \ --action-name "Receive" "Subscribe"
разрешить теме вызывать лямбда-функцию,
aws lambda --profile Lambda_Owner_Profile add-permission \ --function-name "your-lambda-function" \ --statement-id "allowCrossAccountSNS" \ --principal "sns.amazonaws.com" \ --action "lambda:InvokeFunction" \ --source-arn "arn:aws:sns:us-east-1:111111111:your-sns-top"
подписаться на лямбда-функцию в теме.
aws sns --profile Lambda_Owner_Profile subscribe \ --topic-arn "arn:aws:sns:us-east-1:111111111:your-sns-top" \ --protocol "lambda" \ --notification-endpoint "arn:aws:lambda:us-east-1:2222222222:function:your-lambda-function"
Я столкнулся с той же проблемой. Ошибка связана с тем, что вы вызываете функцию подписки на SNS из учетной записи, которая владеет темой SNS. Хотя это кажется логичным и обычным для вас способом, AWS ожидает, что вы сделаете это наоборот, когда дело доходит до доступа между учетными записями: вы должны вызывать функцию подписки на SNS из учетной записи, которая владеет функцией Lambda.
В AWS Lambda Developer Guide есть учебное пособие, в котором команды AWS CLI используются для настройки вызова функции Lambda из SNS, принадлежащей другой учетной записи.
Процедура очень похожа на процедуру в принятом ответе. Подписка не должна быть подтверждена. Он был готов к тестированию сразу после aws sns subscribe
команда.