Как я могу вызвать другую лямбда-функцию, также определенную в шаблоне AWS SAM? - PullRequest
1 голос
/ 25 марта 2020

Я знаю, как вызывать лямбда-функции, которые я назвал и уже существует как лямбда-функции, но как я могу иметь функцию A, вызывающую FunctionB, которую я определяю в AWS шаблоне SAM вместе, и не буду знать имя заранее, иначе динамически.

Есть ли способ передать имя FunctionB как часть шаблона SAM до его создания, чтобы шаблон знал имя полного имени FunctionB до создания FunctionA?

Я вижу много вопросов о тестировании только локально

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Вы можете передать имя другой функции или ARN как переменную окружения. Например:

Resources:
  FunctionA:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.6
      Role: !Sub ${FunctionRole.Arn}
      Environment:
        Variables:
          # pass FunctionB ARN as environment variable
          FUNCTION_B_ARN: !Sub ${FunctionB.Arn}
      Code:
        ZipFile: |
          import os
          def handler(event, context):
            # use environment variable
            print(os.getenv("FUNCTION_B_ARN"))
  FunctionB:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.6
      Role: !Sub ${FunctionRole.Arn}
      Code:
        ZipFile: |
          def handler(event, context):
            print("hello world")
  FunctionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - sts:AssumeRole
            Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
        Version: '2012-10-17'
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
0 голосов
/ 26 марта 2020

SAM отличается от CloudFormation. Сэм имеет ярлык. Тип ресурса SAM AWS :: Serverless :: Function упрощает это.

В этом примере шаблона SAM пример ресурса 'CallerFunction' имеет:

  1. Ограниченная политика для вызова функции 'microservice'
  2. Переменная среды с именем функции
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  A SAM template where lambda function caller invokes lambda function microservice.

Resources:
  CallerFunction:
    Type: AWS::Serverless::Function 
    Properties:
      Description: 'A lambda that invokes the function microservice'
      CodeUri: caller/
      Handler: app.handler
      Runtime: nodejs10.x
      Policies: 
        - LambdaInvokePolicy:
            FunctionName:
              !Ref MicroserviceFunction
      Environment:
        Variables:
          MICROSERVICE_FUNCTION: !Ref MicroserviceFunction
  MicroserviceFunction:
    Type: AWS::Serverless::Function 
    Properties:
      Description: 'A microservice lambda'
      CodeUri: microservice/
      Handler: index.handler
      Runtime: nodejs10.x
      Policies: CloudWatchLogsFullAccess

Веселитесь с помощью сервера!

...