首页 > 解决方案 > 具有自定义自定义 Lambda 函数的 CloudFront

问题描述

我正在尝试使用 EdgeLambda 创建 CloudFront 分配。

尝试关注此问题 [https://github.com/aws/aws-cdk/issues/6259] 但是,我一直收到错误消息

cdk ls
jsii.errors.JavaScriptError: 
  Error: cloudfront/version/Resource [AWS::Lambda::Version] is missing required property: functionName

这是我正在使用的代码...

from aws_cdk import core
import aws_cdk.aws_cloudfront as cloudfront
import aws_cdk.aws_cloudfront_origins as origins
import aws_cdk.aws_iam as iamrole
import aws_cdk.aws_lambda as lambd 
import aws_cdk.custom_resources as custom

class cloudfrontStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, common, webstack, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # The code that defines your stack goes here
        lambdaedgefile = open("./bootstrap/lambdaedge.txt")
        lambdaedgecode = lambdaedgefile.read()
        
        #lamdaedgeversionfunction code
        lambdaedgeverfile = open("./bootstrap/lambdaedgeversion.txt")
        lambdaedgevercode = lambdaedgeverfile.read()
        
        lambdarole = "arn:aws:iam::6055:role/iam-lambda-edge-role"
        
        role = iamrole.Role.from_role_arn(self, "kmsrole", role_arn = lambdarole)
        
        lambdaedgefn = lambd.Function(
           self, 
           "lambdaEdgeFunction",
           description="A custom Lambda@Edge function for serving custom headers from CloudFront Distribution",
           function_name="lambda-edge",
           runtime=lambd.Runtime.NODEJS_12_X,
           role= role,
           memory_size=128,
           timeout=core.Duration.seconds(30),
           handler="index.handler",
           code=lambd.Code.inline(lambdaedgecode)
        )
        
        lambdaedgeversionfn = lambd.Function(
           self, 
           "lambdaEdgeVersionFunction",
           description="A custom Lambda@Edge Version function",
           function_name="lambda-edge-version",
           runtime=lambd.Runtime.NODEJS_10_X,
           role=role,
           memory_size=128,
           timeout=core.Duration.seconds(30),
           handler="index.handler",
           code=lambd.Code.inline(lambdaedgevercode)           
        )
        
        customlambdaedge = core.CustomResource(
            self,
            id = "lambdaedgeversion",
            service_token=lambdaedgeversionfn.function_arn,
            resource_type="Custom::LambdaVersion",
            properties={
                "FunctionName": lambdaedgefn.function_name,
                "LambdaCodeVersion" : "1"
            }
        )
        lambdaversion = lambd.Version(
            self,
            id = "version",
            lambda_=customlambdaedge         
        )
        lambdaversion.function_name("testfunctionname") ###### This did not work either
        
        alborigins = origins.LoadBalancerV2Origin(
            load_balancer= webstack.alb,
            https_port= 443,
            keepalive_timeout= core.Duration.seconds(60),
            origin_ssl_protocols= [ cloudfront.OriginSslPolicy.TLS_V1, cloudfront.OriginSslPolicy.TLS_V1_2,cloudfront.OriginSslPolicy.TLS_V1_1],
            protocol_policy= cloudfront.OriginProtocolPolicy.HTTPS_ONLY,
            read_timeout= core.Duration.seconds(60),
            )

        distribution = cloudfront.Distribution(
            self,
            id="cloudfrontdistribution",
            price_class= cloudfront.PriceClass.PRICE_CLASS_100,
            http_version =  cloudfront.HttpVersion.HTTP2,
            comment= "CloudFront Distribution",
            enabled= True,
            enable_ipv6= False,
            log_file_prefix= "cf",
            log_includes_cookies=False,

            default_behavior= cloudfront.BehaviorOptions(
                allowed_methods= cloudfront.AllowedMethods.ALLOW_ALL,
                cached_methods= cloudfront.CachedMethods.CACHE_GET_HEAD,
                viewer_protocol_policy=cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
                origin= alborigins,
                edge_lambdas= [{
                    "functionVersion" : customlambdaedge,
                    "eventType": cloudfront.LambdaEdgeEventType.ORIGIN_RESPONSE,
                    "lambdaFunction" : lambdaversion #customlambdaedge.get_att_string('Output')
                }]
            ),
        )

该函数的值需要添加到 lambda 函数下的“edge_lambda”部分。任何指导表示赞赏。

标签: amazon-web-servicesaws-lambdaaws-cdk

解决方案


redirection_func_lambda_edge = cloudfront.experimental.EdgeFunction(self, "Redirect",
            runtime=lambda_.Runtime.NODEJS_14_X,
            handler="index.handler",
            code=lambda_.Code.from_asset(os.path.join(dirname, "../../middleware"))
        )
distribution=cloudfront.Distribution(self, "MyCloudfront",
                        default_behavior=cloudfront.BehaviorOptions(origin=origins.S3Origin(my_website_bucket),
                            edge_lambdas=[cloudfront.EdgeLambda(
                                function_version=redirection_func_lambda_edge.current_version,
                                event_type=cloudfront.LambdaEdgeEventType.VIEWER_REQUEST)],
                        )
                        )

您将需要根据您的环境加入相对路径

参考:https ://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.aws_cloudfront.experimental/EdgeFunction.html


推荐阅读