AWS CDK 및 AWS EFS를 사용하는 영구 파일 저장소가 있는 Lambda 함수

13142 단어 cloudcdkawslambda
Lambda 함수가 S3 버킷 간에 데이터를 전송할 필요 없이 로컬에서 파일을 저장하고 로드할 수 있기를 원한 적이 있습니까? 이 글은 당신을 위한 것입니다.
AWS EFS를 사용하면 Lambda 함수에 attach a persistent filesystem 할 수 있습니다!

GitHub Repository

CDK 초기화 및 배포



CDK 설정 및 환경 부트스트래핑은 다루지 않겠습니다. 해당 정보를 찾을 수 있습니다here..

CDK를 설정했으면 프로젝트를 설정해야 합니다.
  • mkdir cdk_docker_lambda && cd cdk_docker_lambda
  • cdk init --language python
  • source .venv/bin/activate
  • pip install -r requirements.txt && pip install -r requirements-dev.txt
    이제 빈 스택을 AWS에 배포합니다.
  • cdk deploy

  • 스택 설계



    CDK 스택은 EFS 파일 시스템, Lambda 함수 및 파일 시스템을 함수에 연결할 수 있는 액세스 포인트를 배포할 것입니다.

    cdk_lambda_efs/cdk_lambda_efs_stack.py




    from aws_cdk import Stack
    from aws_cdk import aws_ec2 as ec2
    from aws_cdk import aws_efs as efs
    from aws_cdk import aws_lambda as _lambda
    from constructs import Construct
    from aws_cdk import RemovalPolicy
    
    
    class CdkLambdaEfsStack(Stack):
        def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
            super().__init__(scope, construct_id, **kwargs)
    
            # I like to define all my pieces in __init__
            self.vpc = None
            self.access_point = None
            self.lambda_func = None
    
            self.build_infrastructure()
    
        def build_infrastructure(self):
            self.build_vpc()
            self.build_filesystem()
            self.build_lambda_func()
    
        def build_vpc(self):
            # Build the VPC where both EFS and Lambda will sit
            self.vpc = ec2.Vpc(self, "VPC")
    
        def build_filesystem(self):
            file_system = efs.FileSystem(
                scope=self,
                id="Efs",
                vpc=self.vpc,
                file_system_name="ExampleLambdaAttachedEFS",
                # Makes sure to delete EFS when stack goes down
                removal_policy=RemovalPolicy.DESTROY,
            )
            # create a new access point from the filesystem
            self.access_point = file_system.add_access_point(
                "AccessPoint",
                # set /export/lambda as the root of the access point
                path="/export/lambda",
                # as /export/lambda does not exist in a new efs filesystem, the efs will create the directory with the following createAcl
                create_acl=efs.Acl(
                    owner_uid="1001", owner_gid="1001", permissions="750"
                ),
                # enforce the POSIX identity so lambda function will access with this identity
                posix_user=efs.PosixUser(uid="1001", gid="1001"),
            )
    
        def build_lambda_func(self):
            # I'm just using the normal CDK lambda function here. See my other articles for additional building methods.
            _lambda.Function(
                self,
                "LambdaWithEFS",
                runtime=_lambda.Runtime.PYTHON_3_9,
                # lambda function file name.handler function
                handler="lambda_EFS.handler",
                # Points to directory of lambda function
                code=_lambda.Code.from_asset("cdk_lambda_efs/lambda_EFS"),
                # Lambda needs to be in same VPC as EFS
                vpc=self.vpc,
                filesystem=_lambda.FileSystem.from_efs_access_point(
                    ap=self.access_point, mount_path="/mnt/filesystem"
                ) if self.access_point else None,
            )
    
    


    람다 함수



    추가 종속성 없이 람다 함수를 배포하겠습니다. 종속성이 필요한 경우 이를 수행하기 위해 다른CDK 구성을 사용해야 합니다. 그리고 .

    이 람다 함수는 EFS 파일 시스템에서 파일을 열고 문자열을 쓴 다음 다시 열고 결과를 반환합니다.

    cdk_lambda_efs/lambda_EFS/lambda_EFS.py




    from pathlib import Path
    
    
    def handler(event, context):
        # Writing to a file on the EFS filesystem
        path = Path("/mnt/filesystem/test.txt")
        with path.open("w") as f:
            f.write("Test123")
        # Now open the file, read the text, return
        with path.open("r") as f:
            text = f.read()
        return f"Hello Lambda! {text}"
    
    


    연결된 파일 시스템으로 람다 기능 테스트



    AWS의 Lambda 콘솔로 이동합니다. 먼저 파일 시스템이 람다 함수에 성공적으로 연결되었음을 알 수 있습니다.



    이제 모든 종류의 이벤트를 사용하여 테스트하십시오.



    이 기사가 데이터를 유지하지 않는 람다 문제를 해결하는 데 도움이 되었기를 바랍니다. EFS는 메모리 문제에 대한 사용하기 쉽고 다양한 솔루션입니다.

    비용이 청구되지 않도록 완료되면 cdk destroy를 확인하십시오.

    좋은 웹페이지 즐겨찾기