AWS Lambda и SNS: межрегиональный вызов Invoke Lambda

У меня есть функция Lambda, развернутая в нескольких регионах. Я хотел бы опубликовать сообщение в SNS, которое будет вызывать эти функции.

Используя aws-cli, я создал темы, предоставив Lambda разрешение на общение с SNS и создав подписки. Подписка создается успешно, и я вижу ее в консоли AWS. Но это не работает. Лямбда-функция не вызывается.


person Shane H    schedule 26.01.2016    source источник
comment
Вы добавили подписку в качестве источника событий в настройках лямбда-функции?   -  person Assaf Lavie    schedule 26.01.2016
comment
Спасибо за вопрос @AssafLavie. Я не делал этого специально, но не считаю это необходимым при вызове из SNS или S3.   -  person Shane H    schedule 27.01.2016
comment
Чтобы уточнить, я могу воспроизвести это на более простом примере, создав тему SNS с одним подписчиком в другом регионе. В этом случае я публикую сообщение в теме, но функция никогда не вызывается. Кажется, разрешения связаны, но я не вижу ничего особенного для перехода между регионами   -  person Shane H    schedule 27.01.2016


Ответы (1)


Это пример на основе CloudFormation. Вы должны добавить разрешение на вызов SNS к функциям Lambda:

{
    "Type" : "AWS::Lambda::Permission",
    "Properties" : {
        "FunctionName" : { "Fn::GetAtt" : [ "YourLambda", "Arn" ] },
        "Action" : "lambda:InvokeFunction",
        "Principal" : "sns.amazonaws.com",
        "SourceArn" : { "Ref" : "YourSNSTopicArn" }
    }
}

Затем вам нужно подписать свой Lambdas на свою SNS тему. Это можно сделать через вызов API или через CloudFormation.

{
    "Type" : "AWS::SNS::Topic",
    "Properties" : {
        "TopicName" : "YourTopicName",
        "Subscription" : [ {
            "Endpoint" : { "Fn::GetAtt" : [ "YourLambda", "Arn" ] },
            "Protocol": "lambda"
        } ]
    }
}

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

person adamkonrad    schedule 26.01.2016
comment
Спасибо. Не могли бы вы помочь мне понять, что происходит с этой политикой AssumeRole? Я не использую Cloud Formation, поэтому я не очень хорошо его знаю, но вы не указали ресурс в этой политике, значит, это дает Lambda разрешение на выполнение какой-либо роли? Есть ли у этого проблемы с безопасностью? - person Shane H; 27.01.2016
comment
Прошу прощения за то, что первая итерация была не совсем правильной. Вам не нужна корневая роль. Есть ли смысл в исправленном примере? - person adamkonrad; 27.01.2016
comment
На данный момент я создал политику с ресурсом с подстановочными знаками. К сожалению, это не помогло. Я уже дал Lambda политику PassRole. - person Shane H; 27.01.2016
comment
Да, хорошо, поэтому роль Lambda включает политику для InvokeFunction. И когда я публикую сообщение в теме, оно вызывает функцию в том же регионе, что и тема. Проблема в том, что он не вызывает функции из других регионов, хотя я ясно вижу их подписки, когда смотрю на эту тему. - person Shane H; 27.01.2016
comment
Вам необходимо изменить разрешения для ваших лямбда-функций в других регионах, чтобы разрешить выполнение из вашей темы SNS через ARN. Это проблема, с которой вы столкнулись. В настоящее время это невозможно через панель управления, только через API или CloudFormation. - person adamkonrad; 27.01.2016
comment
Я использую aws-cli для обеспечения. Вот пример разрешений, которые я устанавливаю: aws lambda add-permission \ --region ${REGION} \ --function-name ${FUNCTION_ARN}:PROD \ --statement-id sns-invoke \ --action lambda:invokeFunction \ --principal sns.amazonaws.com \ --source-arn arn:aws:sns:us-west-2:${ACCT_NUM}:prod-reducer-us-west-2 Это дает рабочему разделу возможность вызывать псевдоним PROD лямбда-функции. - person Shane H; 27.01.2016
comment
Я предпочитаю скрипты aws cli, ими легче управлять. Что за --statement-id sns-invoke это то, что вы где-то предопределили? Не могли бы вы встроить заявление? - person adamkonrad; 27.01.2016
comment
Я использую скрипты bash. Вы предпочитаете питон или ..? В этом случае я понимаю, что мы передаем sns-invoke как идентификатор оператора, созданного с помощью этой команды. - person Shane H; 27.01.2016
comment
Обычно рубиновый. Ваша команда выглядит нормально. Можете ли вы вставить команду, с помощью которой вы создаете подписку SNS? - person adamkonrad; 27.01.2016
comment
Спасибо за вашу помощь. Странный. Если мне нужно преобразовать это для использования региональных тем SNS, это должно работать нормально, но это прискорбно. Вот подписка: aws sns subscribe \ --region us-west-2 \ --topic-arn arn:aws:sns:us-west-2:${ACCT_NUM}:prod-reducer-${REGION} \ --protocol "lambda" \ --notification-endpoint ${FUNCTION_ARN}:PROD - person Shane H; 27.01.2016
comment
Спасибо! Я нашел проблему. Вы можете увидеть это в утверждении, которое я вставил ранее: я жестко запрограммировал имя темы в этом утверждении. Я ценю вашу помощь, потому что боялся, что это ограничение AWS, и я не искал проблему в коде. - person Shane H; 27.01.2016