Вызвать 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 из внешней учетной записи:

  1. Потребительский счет создает лямбду,
  2. Учетная запись потребителя добавляет источник событий для лямбды в консоли AWS, указав тему ARN провайдера SNN (не беспокойтесь о сообщениях об ошибках здесь),
  3. Учетная запись поставщика добавляет разрешения на подписку SNS на учетную запись IAM потребителя, созданную в сторонней учетной записи AWS (выполняется с помощью "политики изменения тем", упомянутой выше),
  4. Потребитель использует учетную запись 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 - это потребитель, у которого есть лямбда, и

  1. Разрешение функции 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"  
    
  2. разрешить теме вызывать лямбда-функцию,

    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"  
    
  3. подписаться на лямбда-функцию в теме.

    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 команда.

Другие вопросы по тегам