Как ссылаться на Арн и имя AWS лямбда-функции, созданной с помощью Serverless Framework - PullRequest
0 голосов
/ 27 февраля 2020

Я использую Serverless Framework для создания лямбда-функции и хотел бы иметь возможность перекрестной ссылки на ее Arn и имя в других частях serverless.yml.

Я удивлен, насколько сложно я ' Нахожу это как! GetAtt и! Ref, похоже, не работают так, как я ожидал бы, если бы лямбда была создана с помощью vanilla CloudFormation. (AWS :: Lambda :: Function возвращает Ref и Fn :: GetAtt, которые упростили бы это!)

Я нашел несколько сообщений, которые ссылаются на решения, но ничего не говорится в простом английском языке sh как этого добиться.

НАСТРОЙКА

serverless.yml

...
functions:
  - ${file(functions/sendEmail.yml)}
...

sendEmail.yml

sendEmail:
  handler: lambda-functions/send-email.handler
...

ПОПЫТКИ НА ССЫЛКУ

Arn

В другой части шаблона я попытался:

...    
LambdaFunctionArn: !GetAtt sendEmail.Arn

, но при развертывании получаю:

Error: The CloudFormation template is invalid: Template error: instance of Fn::GetAtt references undefined resource sendEmail

Я заметил, что окончательный шаблон CloudFormation преобразовал sendEmail в sendEmailLambdaFunction, поэтому я попытался:

LambdaFunctionArn: !GetAtt sendEmailLambdaFunction.Arn

, но получил похожую ошибку.

Имя

Я также хотел бы иметь возможность ссылаться на имя, но, к сожалению,

!Ref sendEmail

вызывает ошибку:

Error: The CloudFormation template is invalid: Template format error: Unresolved resource dependencies [sendEmail] in the Resources block of the template

Любая помощь в отношении точных изменений, которые мне нужно сделать, чтобы добиться захвата лямбда-арна и имя, будет принята с благодарностью!

Спасибо заранее! I

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Я не уверен в лучшем опыте, но ниже работает для меня.

Укажите functionName в функции без сервера, и когда вы хотите arn, вы можете сформировать его.

test.yaml

TestFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: index.handler
    FunctionName: myFunction

При ссылке,

LambdaArn: !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:myFunction
0 голосов
/ 28 февраля 2020

Хорошо, благодаря Dinu sh за то, что поставили меня на путь, я достиг функционального решения следующим образом:

serverless.yml

custom:
  ...
  myEnvironment:
    assetPreName: ${self:service.name}-${self:provider.stage}
    arnRegionAndAccount: ${self:provider.region}:#{AWS::AccountId}
  ...
  myContact:
    ...
    lambdaFuncName: ${self:custom.myEnvironment.assetPreName}-sendEmail
    lambdaFuncArn: arn:aws:lambda:${self:custom.myEnvironment.arnRegionAndAccount}:function:${self:custom.myContact.lambdaFuncName}

Примечание: Для обозначения:

#{AWS::AccountId}

требуется плагин: псевдопараметры сервера.

sendEmail.yml

sendEmail:
  ...
  name: ${self:custom.myContact.lambdaFuncName}
  ...

В другом месте

LambdaFunctionArn: ${self:custom.myContact.lambdaFuncArn}

Я все еще думаю, что это позор, что я не мог просто использовать Ref и Fn :: GetAtt (как я мог бы, если бы лямбда была создана с помощью ванильного CloudFormation, AWS :: Lambda :: Функция, ресурс), но пока это работает.

Надеюсь, это поможет кому-то еще. Еще раз спасибо, Дину sh за настройку этого курса!

...