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

如何使用AWS云形成在AWS API网关集成中指定舞台变量?

葛航
2023-03-14

我正在尝试构建AWS CloudFormation模板以创建API网关。
当我手动创建API网关时,我使用阶段变量为不同阶段使用不同的AWS函数。

eg.我有一个名为adminLogin的阶段变量,当API网关的阶段是dev
stage_adminLogin时,adminLogin的值将是-
dev_adminLogin

云信息模板片段-

test:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: 'test'
      Body:
        swagger: "2.0"
        info:
          version: "2019-04-11T02:29:18Z"
          title: "Test"
        basePath: !Ref "testEnv"
        schemes:
          - "https"
        paths:
          /admin/login:
            post:
              consumes:
                - "application/json"
              produces:
                - "application/json"
              responses:
                '200':
                  description: "200 response"
                  schema:
                    $ref: "#/definitions/Empty"
              x-amazon-apigateway-integration:
                #uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${stageVariables.adminLogin}/invocations"
                uri: !Join [
                    '', [
                      'arn:',
                      'aws:',
                      'apigateway:',
                      !Ref "AWS::Region",
                      ':lambda:',
                      'path/2015-03-31/functions/',
                      '${stageVariables.adminLogin}',
                      '/invocations'
                    ]
                  ]
                responses:
                  default:
                    statusCode: "200"
                passthroughBehavior: "when_no_templates"
                httpMethod: "POST"
                contentHandling: "CONVERT_TO_TEXT"
                type: "aws_proxy"

当我运行cloudformation模板时,出现以下错误-

Errors found during import: Unable to put integration on 'POST' for resource at path '/admin/login': Invalid lambda function 
(Service: AmazonApiGateway; 
Status Code: 400; 
Error Code: BadRequestException; 

问题完全在于uri属性,
我两个都试过了-

uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${stageVariables.adminLogin}/invocations"

uri: !Join ['', ['arn:','aws:','apigateway:',!Ref "AWS::Region",':lambda:','path/2015-03-31/functions/','${!stageVariables.adminLogin}','/invocations']]

参考-

  1. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway方法集成uri
  2. https://docs.aws.amazon.com/apigateway/latest/developerguide/amazon-api-gateway-using-stage-variables.html

共有1个答案

何嘉运
2023-03-14

应该使用Lambda ARN(而不仅仅是Lambda函数名)提到Lambda函数

前任:

uri: "arn:aws:apigateway:REGION:lambda:path/2015-03-31/functions/arn:aws:lambda:REGION:ACCOUNTID:function:dev_adminLogin/invocations"

把它放在云层中,如下所示应该可以工作

uri: !Join
      - ''
      - - 'arn:aws:apigateway:'
        - !Ref "AWS::Region"
        - ':lambda:path/2015-03-31/functions/arn:aws:lambda:'
        - !Ref "AWS::Region"
        - ':'
        - !Ref "AWS::AccountId"
        - ':function:${stageVariables.adminLogin}/invocations'

还要记住添加lambda权限(对于dev_adminLogin和stage_adminLogin),否则apigateway将无法调用lambda,并将收到5XX错误

使用CLI:

aws lambda add-permission  --function-name "arn:aws:lambda:REGION:ACCOUNTID:function:dev_adminLogin"    --source-arn "arn:aws:execute-api:REGION:ACCOUNTID:API_ID/*/POST/admin/login"    --principal apigateway.amazonaws.com    --statement-id stmt1    --action lambda:InvokeFunction

aws lambda add-permission  --function-name "arn:aws:lambda:REGION:ACCOUNTID:function:stage_adminLogin"    --source-arn "arn:aws:execute-api:REGION:ACCOUNTID:API_ID/*/POST/admin/login"    --principal apigateway.amazonaws.com    --statement-id stmt2    --action lambda:InvokeFunction

参考:https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html

 类似资料:
  • 我们正在尝试从C#Windows服务调用AWS API网关来执行后台作业。哪个应该触发API网关定期初始化请求? 我们使用RestSharp调用APIendpoint,该类称为AwsAuthenticator,它继承自RestSharp.Authenticators.IAAuthenticator。但当我们调用API Gateway时,收到的错误是“我们计算的请求签名与您提供的签名不匹配。请检查您

  • 当我使用spring cloud gateway集成spring cloud sleuth时,我发现性能比单独使用spring cloud gateway慢得多。是否有优化方案? 机器配置:6芯,16g Spring云网关:5331.9 tps Spring云网关Spring云侦探:4119.47 tps “Spring云网关”比“Spring云网关Spring云侦探”慢约1000-2000tps

  • 一般来说,对于CDK实现来说,属性“目前不支持AWS云形成”是什么意思,具体来说: Cognito Userpool Lambda配置的CloudFormation属性中显示:CustomEmailSender-AWS CloudFormation当前不支持。https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-pro

  • 我计划将Razorpay支付网关集成到我的客户网站中,该网站已在WordPress中开发,其中的场景如下。 用户将填写他的需求查询表。 然后根据客户的要求,业主将回复成本和一些代码给客户(通过移动/电子邮件通信)。 客户将在网站的支付页面提交表单(姓名,金额,代码为备注和电子邮件ID),该表单将重定向到支付网关页面。 在WordPress网站上,该插件(Razorpay Quick Payment

  • 我有以下的云形成模板片段。整个模板创建了ECS法门集群以及所有资源。但是现在,我面临着法门服务和任务定义的问题。 模板的服务部分如下所示: 服务: 任务定义如下: 任务定义: 我知道,fargate服务和任务定义在集群中是相互关联的。但问题是,如何使用模板建立这种关系。 我收到以下失败事件: 任务定义中不存在容器abc服务开发人员。(服务:AmazonECS;状态代码:400;错误代码:Inval

  • 文档在控制台中的操作非常清楚,https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html,但在CDK中复制真的很痛苦。 我的问题是如何在CDK中创建一个以s3(中间没有lambda)为支持的RESTAPI,或者至少如何创建apigateway。AWS整合