#amazon-web-services #aws-lambda #aws-cdk
#amazon-веб-сервисы #aws-lambda #aws-cdk
Вопрос:
Я пытаюсь создать дистрибутив CloudFront с помощью EdgeLambda.
Пытался следить за этим вопросом [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')
}]
),
)
Значение функции необходимо добавить в раздел «edge_lambda» в разделе «Функция lambda». Любые рекомендации приветствуются.
Ответ №1:
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)],
)
)
Вам нужно будет объединить относительный путь в соответствии с вашей средой
Комментарии:
1. Пожалуйста, добавьте некоторые пояснения к вашему ответу, чтобы другие могли извлечь из него уроки