in apigw-canary-deployment-cdk/app.py [0:0]
def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
# Import Lambda ARN, REST API ID, and Method ARN from stack exports
LAMBDA_ARN = cdk.Fn.import_value("MyLambdaFunction")
API_ID = cdk.Fn.import_value("MyAPIGWID")
METHOD_ARN = cdk.Fn.import_value("MyMethodArn")
STAGE_NAME = cdk.Fn.import_value("MyStageName")
# Import Lambda function from ARN
lambda_fn = lambda_.Function.from_function_arn(self, 'lambda_fn', LAMBDA_ARN)
# Create new function version
version = lambda_.CfnVersion(
self, "lambdaVersion",
function_name=lambda_fn.function_name
)
# Save Versions when deleting stack for canary promotion and additional deployments
version.apply_removal_policy(policy=cdk.RemovalPolicy.RETAIN)
# Create Dev alias
alias = lambda_.CfnAlias(
self, "lambdaAlias",
function_name=lambda_fn.function_name,
function_version=version.attr_version,
name="Dev"
)
# Add permissions for Dev alias
permission = lambda_.CfnPermission(
self, "aliasPermission",
action="lambda:InvokeFunction",
function_name=alias.ref,
principal="apigateway.amazonaws.com",
source_arn=METHOD_ARN.replace(
STAGE_NAME, "*"
)
)
# Create a canary deployment
canary_deployment = apigateway.CfnDeployment(
self, "CanaryDeployment",
rest_api_id=API_ID,
deployment_canary_settings=apigateway.CfnDeployment.DeploymentCanarySettingsProperty(
percent_traffic=50,
stage_variable_overrides={
"lambdaAlias": "Dev"
}
),
stage_name="prod"
)