您如何将 API 网关指向 CDK 中的 lambda 别名?
How do you point API Gateway to a lambda Alias in CDK?
使用CDK将ApiGateway连接到lambda,我们首先创建一个RestApi(),然后创建一个LambdaIntegration将Apigateway连接到lambda。使用 lambda 别名时如何做到这一点?
解释了如何在没有 CDK 的情况下将 ApiG 连接到 Lambda 别名。如何将其转换为 CDK?
我们的目标是向与 API 网关一起使用的 lambda 添加预配置的并发性和自动缩放。
LambdaIntegration
Function gets 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,
}),
})
使用CDK将ApiGateway连接到lambda,我们首先创建一个RestApi(),然后创建一个LambdaIntegration将Apigateway连接到lambda。使用 lambda 别名时如何做到这一点?
我们的目标是向与 API 网关一起使用的 lambda 添加预配置的并发性和自动缩放。
LambdaIntegration
Function gets 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,
}),
})