Запрос на интеграцию Lambda-шлюза CloudFormation API не получает нужные разрешения? - PullRequest
3 голосов
/ 25 мая 2020

У меня есть шаблон стека CloudFormation , который создает ресурс шлюза API, в котором используется метод Type: LAMBDA_PROXY. Первоначально он отлично работает для доступа к домену root, например https://28af295f439b5f0aef7c7805864ba3981f282e1e.guacchain.com/, но когда я пытаюсь получить доступ к https://28af295f439b5f0aef7c7805864ba3981f282e1e.guacchain.com/about, сетевой запрос возвращает код состояния 500 и ответ {"message": "Internal server error"}

Сгенерированная лямбда-функция имеет следующую политику на основе ресурсов:

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "stack-28af295f439b5f0aef7c7805864ba3981f282e1e-lambdaApiGatewayInvoke-128TRSSUE8WDQ",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:378688096774:function:lambda-28af295f439b5f0aef7c7805864ba3981f282e1e",
      "Condition": {
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:execute-api:us-east-1:378688096774:bccwb0kvvd/*/*/*"
        }
      }
    }
  ]
}

При переходе на страницу запроса интеграции шлюза API и простом редактировании поля «Лямбда-функция» (вырезание существующего значения затем вставив его обратно, затем нажав галочку), я получаю это всплывающее окно «Добавить разрешение»: enter image description here

После нажатия ОК и последующего обновления страницы консоли Lambda, ее базы ресурсов Обновления политики для включения двух, казалось бы, повторяющихся операторов (разница только в поле Sid):

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "stack-28af295f439b5f0aef7c7805864ba3981f282e1e-lambdaApiGatewayInvoke-128TRSSUE8WDQ",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:378688096774:function:lambda-28af295f439b5f0aef7c7805864ba3981f282e1e",
      "Condition": {
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:execute-api:us-east-1:378688096774:bccwb0kvvd/*/*/*"
        }
      }
    },
    {
      "Sid": "d6d795d4-8461-4774-bd6e-ae8d8ea3bcee",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:378688096774:function:lambda-28af295f439b5f0aef7c7805864ba3981f282e1e",
      "Condition": {
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:execute-api:us-east-1:378688096774:bccwb0kvvd/*/*/*"
        }
      }
    }
  ]
}

После развертывания API Gateway и ожидания около минуты https://28af295f439b5f0aef7c7805864ba3981f282e1e.guacchain.com/about наконец становится доступный. Итак, мой вопрос: что неадекватно исходной политике на основе лямбда-ресурсов, которая запрещает доступ ко всем запросам, кроме /, в домене? вырезая имя лямбда-функции и вставив его на страницу запроса интеграции, оно не отображается как параметр автозаполнения, в то время как другие отображаются.

Это lambdaIAMRole, который я определил в стеке CloudFormation:

  lambdaIAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Action:
              - 'sts:AssumeRole'
            Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
      Policies:
        - PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Action:
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                  - 'logs:PutLogEvents'
                Effect: Allow
                Resource:
                  - !Sub >-
                    arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${lambdaFunctionName}:*
          PolicyName: lambda

И ресурс лямбда-функции имеет Role: !GetAtt lambdaIAMRole.Arn как часть своего поля Properties.

1 Ответ

2 голосов
/ 26 мая 2020

На основе комментариев и проверки шаблона CloudFormation было обнаружено, что проблема была вызвана неправильной настройкой IntegrationHttpMethod в apiGatewayLambdaResourceMethod.

Вместо

IntegrationHttpMethod: GET

это должно быть

IntegrationHttpMethod: POST

Это потому, что AWS_PROXY для лямбда требует POST метода, а не GET.

...