Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使用AWS CDK将阶段变量传递给api网关中的lambda函数?_Python 3.x_Amazon Web Services_Aws Api Gateway_Aws Cdk - Fatal编程技术网

Python 3.x 如何使用AWS CDK将阶段变量传递给api网关中的lambda函数?

Python 3.x 如何使用AWS CDK将阶段变量传递给api网关中的lambda函数?,python-3.x,amazon-web-services,aws-api-gateway,aws-cdk,Python 3.x,Amazon Web Services,Aws Api Gateway,Aws Cdk,我有一个API网关,它触发由stage变量stageVariables.lbfunc指定的lambda函数 如何使用AWS CDK创建此类集成请求 看起来我应该为创建一个特殊的处理程序 但是我找不到任何这样做的示例代码 以下是我当前的代码。我希望lambdainintegration的处理程序可以由stage变量确定 # dev_lambda_function should be replaced by something else dev_lambda_function = lambda_.

我有一个API网关,它触发由stage变量
stageVariables.lbfunc
指定的lambda函数

如何使用AWS CDK创建此类集成请求

看起来我应该为创建一个特殊的
处理程序

但是我找不到任何这样做的示例代码

以下是我当前的代码。我希望
lambdainintegration
的处理程序可以由stage变量确定

# dev_lambda_function should be replaced by something else
dev_lambda_function = lambda_.Function(self, "MyServiceHandler",
            runtime=lambda_.Runtime.PYTHON_3_7,
            code=lambda_.Code.asset("resources"),
            handler="lambda_function.lambda_handler",
            description="My dev lambda function"
            )
stage_options = apigateway.StageOptions(stage_name="dev", 
    description="dev environment", 
    variables=dict(lbfunc="my-func-dev")
)
# What should I pass to the handler variable so that LambdaRestApi triggers the lambda function specified by the stage variable "stageVariables.lbfunc"?
api = apigateway.LambdaRestApi(self, "my-api",
            rest_api_name="My Service",
            description="My Service API Gateway",
            handler=dev_lambda_function,    
            deploy_options=stage_options)

最近刚刚解决了这个问题,我只是在这里记录下我是如何解决的(在我忘记之前)

这里的想法是,当你的API方法被命中时,它会发出一个
POST
请求你的
lambda
。因此,您可以为lambda创建一个“URL”,这样您的API方法就可以达到这个目的。(好的,我终于找到了,你可以在这里阅读,因为,看看那里的URI)

  • 创建一个名为apintegration的
    构造

    class ApiIntegration(core.Construct):
    
       @property
       def integration(self):
         return self._integration
    
        def __init__(self, scope: core.Construct, id: str, function: _lambda,  ** kwargs):
         super().__init__(scope, id, **kwargs)
    
         # Here you construct a "URL" for your lambda
         api_uri = (
             f"arn:aws:apigateway:"
             f"{core.Aws.REGION}"
             f":lambda:path/2015-03-31/functions/"
             f"{function.function_arn}"
             f":"
             f"${{stageVariables.lambdaAlias}}" # this will appear in the picture u provide
             f"/invocations"
         )
         # Then here make a integration 
         self._integration = apigateway.Integration(
             type=apigateway.IntegrationType.AWS_PROXY,
             integration_http_method="POST",
             uri=api_uri
         )
    
  • 在您的
    MyStack(core.Stack)
    类中,您可以这样使用它:

          # Here u define lambda, I not repeat again 
          my_lambda = ur lambda you define
    
          # define stage option 
          dev_stage_options = apigateway.StageOptions(
                                stage_name="dev",
                                    variables={
                                       "lambdaAlias": "dev" # define ur variable here
                                })
          # create an API, put in the stage options
          api = apigateway.LambdaRestApi(
                   self, "MyLittleNiceApi",
                   handler=my_lambda,
                   deploy_options=dev_stage_options
                )
    
          # Now use the ApiIntegration you create 
          my_integration = ApiIntegration(
              self, "MyApiIntegration", function=my_lambda)
    
         # make a method call haha
         my_haha_method = api.root.add_resource("haha")
    
         # put in the integration that define inside the Construct 
         my_haha_post_method = my_method.add_method('POST',
                               integration=my_integration.integration,
                               #...then whatever here)
    
  • 现在检查控制台时,您的方法将具有Lambda函数和
    stageVariable

    现在您应该创建
    lambda别名
    ,其思想如下:

          # Here u define lambda, I not repeat again 
          my_lambda = ur lambda you define
    
          # define stage option 
          dev_stage_options = apigateway.StageOptions(
                                stage_name="dev",
                                    variables={
                                       "lambdaAlias": "dev" # define ur variable here
                                })
          # create an API, put in the stage options
          api = apigateway.LambdaRestApi(
                   self, "MyLittleNiceApi",
                   handler=my_lambda,
                   deploy_options=dev_stage_options
                )
    
          # Now use the ApiIntegration you create 
          my_integration = ApiIntegration(
              self, "MyApiIntegration", function=my_lambda)
    
         # make a method call haha
         my_haha_method = api.root.add_resource("haha")
    
         # put in the integration that define inside the Construct 
         my_haha_post_method = my_method.add_method('POST',
                               integration=my_integration.integration,
                               #...then whatever here)
    
    • 你有一个lambda
    • 为lambda创建两个别名,
      dev
      prod
    • API阶段变量开发->命中->lambda
      dev
      alias
    • API阶段变量产品->命中->lambda
      prod
      alias
    每个lambda别名都会命中不同版本的lambda,例如:

    • dev
      alias hit
      $Latest
    • prod
      alias hit
      version:12
    这件事我已经谈过了

    现在您有了
    lambda:dev
    lambda:prod
    2别名。 为了让您的
    方法
    命中不同的别名
    lambda:dev
    lambda:prod
    ,您需要
    (主要思想)

    Lambda
    dev/prod alias
    允许使用
    方法


    创建版本、别名和权限是完全不同的事情,所以这里没有提到。

    我不得不更改自动生成的权限lambdainintegration,最后我自己扩展了该类-我不知道这是否是您正在寻找的(它也在typescript中),但这可能会有所帮助。如果您可以添加更多信息,我将很乐意帮助您:)