Как вызвать лямбду в другом аккаунте aws, используя шаблон облачной информации SAM - PullRequest
0 голосов
/ 10 октября 2019

Фрагмент облачной информации для роли

Я создаю модель серверной архитектуры (SAM) с использованием облачной лямбда-информации AWS. У меня есть две лямбды - лямбда-фронтенд и лямбда-бэкэнд. Передняя лямбда находится в учетной записи A, а внутренняя лямбда - в учетной записи B. Внешняя лямбда выводит статические файлы из S3 для пользовательского интерфейса. Когда он должен выполнить обработку данных бэкенда, он должен вызвать лямбду бэкэнда в другой учетной записи aws. У меня есть роль в обеих учетных записях, и я также доверял обеим учетным записям. Он еще не может вызвать лямбду-бэкэнд. Как вызвать лямбда-бэкэнд, используя шаблон облачной информации.

1 Ответ

0 голосов
/ 11 октября 2019

Back End:

Ваша внутренняя лямбда должна дать внешнему лямбда-разрешению для ее вызова:

  BackEndLambdaPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: 'lambda:InvokeFunction'
      FunctionName: 
        Fn::GetAtt:
          - BackEndLambda
          - Arn
      Principal: <enter principal>
      SourceArn: <front end lambda arn is optional but recommended>

Front End:

Внешний интерфейс, вам нужно дать разрешение на вызов другой функции (это происходит в разделе Политики либо Serverless :: Function, либо Iam :: Role, в зависимости от того, как настроена ваша лямбда):


        - Effect: Allow
          Action:
            - 'lambda:InvokeFunction'
          Resource: "arn:aws:lambda:us-east-1:123456789012:function:function-name"

Передайте функцию arn в ваш лямбда-интерфейс в свойстве Environment:

       Environment:
         Variables:
           BackEndFunctionArn:"arn:aws:lambda:us-east-1:123456789012:function:function-name"

Вызовите лямбду-конец из кода вашего лямбда-интерфейса (пример python):

def invoke_back_end(event):
    event = {"data": "Hello back end"}
    function_arn = os.environ.get("BackEndFunctionArn")
    client = boto3.client('lambda')
    # "RequestResponse" is a synchronous invocation. Use "Event" for async
    response = client.invoke(FunctionName=function_arn, Payload=json.dumps(event), InvocationType='RequestResponse')
    return response
...