当前位置: 首页 > 知识库问答 >
问题:

使用CloudFormation和API网关代理进行安装时出现Lambda权限错误

龙智
2023-03-14

下面是我的cloudformation脚本:

AWSTemplateFormatVersion: 2010-09-09
Description: An API that proxies requests to another HTTP endpoint

Resources:
  MyFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      Handler: samplefunction.lambda_handler
      Runtime: python2.7
      Code:
        S3Bucket: "ilya-lambdas"
        S3Key: "lambda-code.zip"
      Role: 'arn:aws:iam::acc-id:role/service-role/basic_lambda_role'


  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: foo3

  Resource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      ParentId: !GetAtt Api.RootResourceId
      RestApiId: !Ref Api
      PathPart: 'test'


  RootMethod:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      AuthorizationType: NONE
      HttpMethod: ANY
      ResourceId: !GetAtt Api.RootResourceId
      RestApiId: !Ref Api 
      Integration:
          IntegrationHttpMethod: ANY
          IntegrationResponses:
            - StatusCode: 200
              SelectionPattern: .*
          Type: AWS_PROXY
          PassthroughBehavior: WHEN_NO_MATCH
          Uri: !Join ["", ["arn:aws:apigateway:", "us-east-1", ":lambda:path/2015-03-31/functions/", !GetAtt MyFunction.Arn, "/invocations"] ]
          Credentials: 'arn:aws:iam::acc-id:role/service-role/basic_lambda_role'

  ProxyMethod:
      Type: 'AWS::ApiGateway::Method'
      Properties:
        HttpMethod: ANY
        ResourceId: !Ref Resource
        RestApiId: !Ref Api
        AuthorizationType: NONE
        Integration:
          IntegrationHttpMethod: ANY
          IntegrationResponses:
            - StatusCode: 200
              SelectionPattern: .*
          Type: AWS_PROXY
          Uri: !Join ["", ["arn:aws:apigateway:", "us-east-1", ":lambda:path/2015-03-31/functions/", !GetAtt MyFunction.Arn, "/invocations"] ]
          PassthroughBehavior: WHEN_NO_MATCH
          Credentials: 'arn:aws:iam::acc-id:role/service-role/basic_lambda_role'

  FunctionPermissions:
    Type: "AWS::Lambda::Permission"
    Properties: 
      Action: "lambda:InvokeFunction"        
      FunctionName: !GetAtt MyFunction.Arn
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Join [ "", ["arn:aws:execute-api:", !Ref "AWS::Region", ":", !Ref "AWS::AccountId", ":", !Ref Api, "/*/*/*" ] ] 



  Deployment:
    DependsOn:
      - MyFunction
      - RootMethod
      - ProxyMethod
    Type: 'AWS::ApiGateway::Deployment'
    Properties:
      RestApiId: !Ref Api
      StageName: prod

我已经被困在这一段时间了,任何的指针将非常感谢。

共有1个答案

翟嘉祥
2023-03-14

首先,我注意到您的IntegrationHttpMethodany。对于lambda,除非您正在使用{proxy+}配置,否则请尝试使用post。我非常肯定CloudFormation文档在这方面仍然是过时的,但是您会在这个答案中找到一些有用的信息。

我注意到的第二件事是错误的代理响应,在您的例子中,这可能只是一个错误配置。为了排除这种情况,AWS支持中心会对错误的代理响应进行处理。基本上,您的lambda响应应该采用以下格式,包括不添加任何额外的键。

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

您可以使用支持文档上的示例函数来代替常规函数,以便隔离问题。

 类似资料:
  • 我目前在lambda函数和API网关方面遇到了问题。我已经在API网关中启用了代理集成,以便返回Lambda函数的状态代码。现在我有一个问题,调用根本没有执行。错误图片 如果我测试Lambda,一切正常,数据库中的条目将被执行。不通过API网关。 我有什么问题? 非常感谢你的帮助! 测验 编辑: 我将此作为IAM政策添加: 但它仍然带来这个错误:

  • 我有两个代码库。一个定义了一个服务(服务a),它包括一个查询dynamoDB表的AWS lambda。 另外,定义了一个需要调用多个服务lambda的聚合API网关。 API网关使用交叉堆栈引用导入服务A中定义的lambda并为其创建lambda集成: null null 当API被调用时,它会失败,这可能是因为没有向apigateway服务授予invoke权限。 在服务A的aws-cdk项目中,

  • 我正在尝试在我的服务器上安装yeoman,但由于某些原因,我一直收到一个权限被拒绝的错误。 我曾尝试重新安装ubuntu(14.04),但没有任何效果。

  • 在浏览了大量的页面(包括一些SO页面)后(参见下面的列表),我仍然无法通过AWS CLI命令行工具授予我的APIGateway访问权来执行新添加的Lambda函数。 也就是说,我正在尝试复制这个: 我使用以下集成设置创建了一个新的endpoint: 我也尝试过在这些更改之前和之后部署API,但没有效果? PS--我也读过将函数的集成类型更改为POST的建议(参见此URL),但我的要求是有一个GET

  • 我正在尝试安装yii2alpha。下载composer并添加后运行以下命令时 去composer.json. 我得到以下错误。 问题1-在任何版本中都找不到请求的包最低稳定性,包名中可能有输入错误。 问题2-在任何版本中都找不到请求的包yiisoft/yii2 composer,包名中可能有输入错误。 问题3-在任何版本中都找不到请求的包yiisoft/yii2框架,包名中可能有输入错误。 潜在原

  • 同步调用:如果函数被同步调用并被限制,Lambda将返回429错误,调用服务将负责重试。ThrottledReason错误代码解释了您是遇到了功能级节流(如果指定)还是帐户级节流(请参见下面的注释)。每个服务都可能有自己的重试策略。例如,CloudWatch日志会重试失败的批处理多达五次,每次重试之间会有延迟。有关事件源及其调用类型的列表,请参阅支持的事件源。 参考文献 我不确定我对以上句子的理解