Разрешения для вызова Lambda конфликтуют с разрешениями шлюза API - PullRequest
0 голосов
/ 08 февраля 2019

У меня развернуто приложение в Lambda, и я использую API-шлюз для пересылки HTTP-запросов в приложение.

Моя проблема заключается в том, что API-шлюз не пересылает запросы, которые не отправляютсяПерейдем к базовому URL-адресу приложения.

Другими словами, код внутри моего Lambda-обработчика выполняется, когда есть HTTP-запрос к https://blabblahblah.execute-api.us-west-2.amazonaws.com/Prod/.Однако HTTP-запрос к https://blabblahblah.execute-api.us-west-2.amazonaws.com/Prod/pong выдает 500, и никакой код не выполняется.У меня есть несколько операторов ведения журнала внутри моего обработчика, и они ничего не регистрируют для запросов без базовых URL.

Я сузил проблему до проблемы с разрешениями.

Iесть 2 набора разрешений, которые плохо работают вместе.

  1. Мне нужно разрешить API-шлюзу вызывать мою лямбда-функцию
  2. Лямбда-функция должна иметь возможность вызывать себя.

Я думал, что яоба эти разрешения работали корректно, но любые HTTP-запросы, которые не нацелены на базовый URL, выбрасывали 500 в шлюз API (т.е. я не вижу записей журнала Cloudwatch для запроса, но ответ равен 500).

Я думаю, это означает, что в моем шаблоне SAM должна быть какая-то ошибка.

Resources:
  IAMRole:
    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

  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: lambda.handler
      Role: !GetAtt IAMRole.Arn
      Runtime: ruby2.5
      CodeUri: "./src/"
      MemorySize: 512
      Timeout: 30
      Events:
        MyAppApi:
            Type: Api
            Properties:
                Path: /
                Method: ANY
                RestApiId: !Ref MyAppAPI
  MyAppAPI:
    Type: AWS::Serverless::Api
    Properties:
      Name: MyAppAPI
      StageName: Prod
      DefinitionBody:
        swagger: '2.0'
        basePath: '/'
        info:
          title: !Ref AWS::StackName
        paths:
          /{proxy+}:
            x-amazon-apigateway-any-method:
              responses: {}
              x-amazon-apigateway-integration:
                uri:
                  !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyFunction.Arn}/invocations'
                passthroughBehavior: "when_no_match"
                httpMethod: POST
                type: "aws_proxy"
          /:
            post:
              responses: {}
              x-amazon-apigateway-integration:
                uri:
                  !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyFunction.Arn}/invocations'
                passthroughBehavior: "when_no_match"
                httpMethod: POST
                type: "aws_proxy"
  ConfigLambdaPermission:
    Type: "AWS::Lambda::Permission"
    DependsOn:
    - MyFunction
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !Ref MyFunction
      Principal: apigateway.amazonaws.com
  ConfigLambdaPermission:
    Type: "AWS::Lambda::Permission"
    DependsOn:
    - MyFunction
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !Ref MyFunction
      Principal: !GetAtt IAMRole.Arn

Outputs:
  MyFunction:
    Description: Lambda Function for interacting with Slack
    Value:
      Fn::GetAtt:
      - MyFunction
      - Arn
  MyAppAppUrl:
    Description: App endpoint URL
    Value: !Sub "https://${MyAppAPI}.execute-api.${AWS::Region}.amazonaws.com/"

Есть идеи, как заставить все работать правильно?

1 Ответ

0 голосов
/ 08 февраля 2019

Да, вам нужно добавить другой ресурс, а также триггер события.А у вас лямбда-разрешения бесполезны в приведенном выше шаблоне.Вот как это работает для меня.

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Resources:
  IAMRole:
    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

  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: roleTest.roleTest
      Role: !GetAtt IAMRole.Arn
      Runtime: nodejs8.10
      CodeUri: s3://apicfn/roleTest.zip
      MemorySize: 512
      Timeout: 30
      Events:
        MyAppApi1:
            Type: Api
            Properties:
                Path: /
                Method: ANY
        MyAppApi2:
            Type: Api
            Properties:
                Path: /{proxy+}
                Method: ANY
Outputs:
  MyFunction:
    Description: Lambda Function for interacting with Slack
    Value:
      Fn::GetAtt:
      - MyFunction
      - Arn

PS: даже не нужен раздел Serverless::Api для этого шаблона.

...