【问题标题】:How do you point API Gateway to a lambda Alias in CDK?您如何将 API 网关指向 CDK 中的 lambda 别名?
【发布时间】:2020-12-08 04:05:36
【问题描述】:

使用 CDK 将 ApiGateway 连接到 lambda,我们首先创建一个 RestApi(),然后创建一个 LambdaIntegration 将 Apigateway 连接到 lambda。使用 lambda Alias 时如何做到这一点?

How to point ApiGateway to a specific Lambda alias 解释了如何在没有 CDK 的情况下将 ApiG 连接到 Lambda 别名。这个怎么翻译成CDK?

我们的目标是为与 API Gateway 一起使用的 lambda 添加预配置并发和自动缩放。

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway aws-cdk


    【解决方案1】:

    LambdaIntegration 函数获取 handler: IFunction 作为参数,它是 lambda 对象。

    话虽如此,您可以使用以下代码 sn-p 导入所需的 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())
    

    【讨论】:

    • 这是不正确的——Function.fromFunctionArn() 返回的 lambda 将始终指向 LATEST,即使您指定了别名。您需要明确导入Alias
    • @gshpychka 可能是 CDK 团队更新了逻辑。当我发布这个答案时 - 它起作用了。因此,赞成票。
    • 或者可能投票者没有意识到他们仍然指向最新版本。
    • 我自己用过,所以不可以。
    【解决方案2】:

    这是一个 TypeScript CDK 示例,它是由 Lambda 支持的“API Gateway HTTP API”,使用别名和自动扩展的预置并发。

    请参阅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,
      }),
    })
    

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 2017-10-27
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      相关资源
      最近更新 更多