如何解决您如何将API网关指向CDK中的lambda别名?
使用CDK将ApiGateway连接到lambda,我们首先创建RestApi(),然后创建LambdaIntegration将Apigateway连接到lambda。使用lambda Alias时,该怎么做?
How to point ApiGateway to a specific Lambda alias说明了如何在没有CDK的情况下将ApiG连接到Lambda别名。如何将其转换为CDK?
我们的目标是向与API网关一起使用的lambda添加预配置的并发和自动缩放。
解决方法
LambdaIntegration
函数将handler: IFunction
作为参数作为lambda对象。
话虽如此,您可以使用以下代码片段导入所需的lambda版本:
const lambdaAlias=lambda.Function.fromFunctionArn(scope,'LambdaImportUsingARN',"lambdaAliasARN")
将lambdaAliasARN
替换为您的lambda的ARN。
例如-
arn:aws:lambda:${AWS_REGION}:${AWS_ACCOUNT}:function:${LAMBDA_NAME}:${ALIAS_NAME}
然后将其传递给LambdaIntegration
:
const lambdaIntegrationUsingAlias = new apigateway.LambdaIntegration(lambdaAlias)
此外,lambda别名需要权限才能允许ApiGateway调用它。
const lambda = ...
const alias = Alias(this,"alias-id",AliasProps.builder()
.provisionedConcurrentExecutions(1)
.version(lambda.currentVersion)
.aliasName(ALIAS_NAME)
.build()
)
// First add permission for your stage to invoke
alias.addPermission("apigateway-permission",Permission.builder()
.action("lambda:InvokeFunction")
.principal(ServicePrincipal("apigateway.amazonaws.com"))
.sourceArn("arn:aws:execute-api:$region:$account:${api.restApiId}/$stage/POST/$path")
.build())
// Next add permission for testing
alias.addPermission("apigateway-test-permission",Permission.builder()
.action("lambda:InvokeFunction")
.principal(ServicePrincipal("apigateway.amazonaws.com"))
.sourceArn("arn:aws:execute-api:$region:$account:${api.restApiId}/test-invoke-stage/POST/$path")
.build())
,
以下是“API 网关 HTTP API”的 TypeScript CDK 示例,该示例由 Lambda 支持,使用别名和自动扩展的预配并发。
有关详细信息,请参阅 autoscaling docs。
import * as apigateway from '@aws-cdk/aws-apigatewayv2'
import * as apigatewayIntegrations from '@aws-cdk/aws-apigatewayv2-integrations'
import * as lambda from '@aws-cdk/aws-lambda'
const fn = new lambda.Function(this,'MyFunction',{
//...
})
const liveAlias = new lambda.Alias(this,'LiveAlias',{
aliasName: 'live',version: fn.currentVersion,})
const target = liveAlias.addAutoScaling({
minCapacity: 1,maxCapacity: 100,})
target.scaleOnUtilization({
utilizationTarget: 0.75,})
const httpApi = new apigateway.HttpApi(this,'HttpApi',{
defaultIntegration: new apigatewayIntegrations.LambdaProxyIntegration({
handler: liveAlias,}),})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。