amazon-web-services - 具有自定义自定义 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”部分。任何指导表示赞赏。
解决方案
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)],
)
)
您将需要根据您的环境加入相对路径
推荐阅读
- laravel - "message": "试图获取非对象的属性 'secret'", "exception": "ErrorException",
- python - 测量 scikit-learn 的内存使用量会改变模型性能
- spring-boot - MapStruct 从映射器中排除很多字段
- sql - 从 oracle sql 查询输出中删除分区行
- r - 如何使用 R 将一组个体变成二元组?
- c - scanf() 在 for 循环中无法正常工作
- javascript - 使用 html5 画布在 reactjs 中裁剪图像
- java - 在 AsyncTask 完成后做某事
- reactjs - 限制reactjs中图片的上传数量
- python - API 在调用 json 时返回 null