CDK에서 us-east-1 외부의 Lambda@Edge 사용

3923 단어
us-east-1에서 Lambda@Edge 기능 및 CloudFront를 배포하는 경우 모든 리소스를 올바르게 설정하는 것이 간단합니다.

배경



ap-southeast-2는 제 고향 지역입니다.
us-east-1은 CDN 및 기타 글로벌 리소스를 배포하는 곳입니다.

내 OAI와 S3가 내 홈 리전에 있어야 하므로 CloudFront는 ap-southeast-2의 스택에서 배포되었습니다. 문제)

참고: Lambda@Edge 함수는 CloudFront 배포 및 스택의 리전에 관계없이 us-east-1 리전에서 생성되어야 합니다.

자세히 살펴보면 us-east-1에 Edge 기능을 배포하면 일반 람다 구성을 사용할 수 있습니다.

func = lambda_.Function(self, "EdgeFunction",
    runtime=lambda_.Runtime.NODEJS_12_X,
    handler="index.handler",
    code=lambda_.Code.from_asset(<path_of_your_lambda@edge function>)
)


나와 같은 스택 구조가 있는 경우 ARN 또는 관련 참조를 SSM에 업로드하고 리소스가 리전에서 리전으로 전달되도록 해야 합니다.

아래 방법으로 엄지 손가락

EdgeFunction



edge_lambda_function = cloudfront.experimental.EdgeFunction(self, "edge_lambda_function",
    runtime=lambda_.Runtime.NODEJS_12_X,
    handler="index.handler",
    code=lambda_.Code.from_asset(<path_of_your_lambda@edge function>),
)


이제 동일한 스택에서 기본 멘토드에서 참조할 수 있습니다.

cdn_distribution = cloudfront.Distribution(
self, 
"cdn_distribution",
default_behavior=cloudfront.BehaviorOptions(origin=my_origin),
    additional_behaviors={
        "images/*": cloudfront.BehaviorOptions(
            origin=my_origin,
            edge_lambdas=[cloudfront.EdgeLambda(
                function_version=edge_lambda_function.current_version,
                event_type=cloudfront.LambdaEdgeEventType.VIEWER_REQUEST,
                include_body=True
            )
            ]
        )
    }
)


문제



함수에 연결된 역할이 지정된 CloudFront EdgeFunction을 사용할 때,

edge_lambda_role = iam.Role(
               self,
                "edge-lambda-iam-role",
             assumed_by=iam.CompositePrincipal(
                    iam.ServicePrincipal('lambda.amazonaws.com'),
                    iam.ServicePrincipal('edgelambda.amazonaws.com')
                ),
                managed_policies=[
                    iam.ManagedPolicy.from_aws_managed_policy_name('service-role/AWSLambdaBasicExecutionRole')
                ]
            )


오류 -

Adding this dependency ("edge-lambda-stack-xxxxxxxxxxxxxxxxxxxxxxxxx/edge-fucntion/Resource" depends on "cloudfront/edge-iam-role/Resource") would create a cyclic reference.


이것은 가장 까다로운 부분이며 무슨 일이 일어나고 있는지 이해하는 데 시간이 걸렸습니다.

해결책



약간의 조사 후 누군가 언급했습니다.

The created us-east-1 stack must have a dependency on the "main" stack, as the main stack can't be created first; doing so would mean the function ARN isn't available to read and that the Distribution would not deploy correctly. Creating the role in the main stack certainly leads to a circular dependency.



따라서 이를 제거하고 Lambda@Edge 구성이 즉시 생성하도록 해야 합니다(우리가 정의한 IAM 역할보다 더 나은 것 같습니다. 잠시 후에 설명하겠습니다)

내부적으로 EdgeFunction 메서드는 다음을 수행합니다.
  • 모든 마법을 수행할 수 있는 충분한 권한이 있지만 허용되지 않는 IAM 역할을 만듭니다.


  • 사용자 지정 리소스는 버전 arn도 param store에 업로드합니다(CloudFront는 함수 arn 대신 버전 arn을 원함)



  • 이 모든 작업을 수행하는 데 2시간이 걸렸습니다. 해결책을 찾는 것을 즐기며 이것이 도움이 되기를 바랍니다.

    좋은 웹페이지 즐겨찾기