Python 3.x 如何使用AWS CDK将阶段变量传递给api网关中的lambda函数?
我有一个API网关,它触发由stage变量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_.
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 hitversion:12
这件事我已经谈过了
现在您有了lambda:dev
和lambda:prod
2别名。
为了让您的方法
命中不同的别名lambda:dev
和lambda:prod
,您需要(主要思想)
:
Lambdadev/prod alias
允许使用方法
创建版本、别名和权限是完全不同的事情,所以这里没有提到。我不得不更改自动生成的权限lambdainintegration,最后我自己扩展了该类-我不知道这是否是您正在寻找的(它也在typescript中),但这可能会有所帮助。如果您可以添加更多信息,我将很乐意帮助您:)