AWS CDKとAWS AFSを用いた永続的ファイルストアによるラムダ関数


これまでにラムダ機能を保存することができますし、ローカルのS 3のバケット間のデータ転送を必要とせずにファイルをロードすることがありますか?この品はあなたのためです.AWS EFSを使用することにより、私たちはあなたのラムダ関数にattach a persistent filesystemすることができます!
GitHub Repository

CDK initと配備


私は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ファイルシステム、ラムダ関数、およびアクセスポイントを展開します.

    スタックは、スタックします。パイ


    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ファイルシステムで開き、文字列を書き込みます.

    CDKRAY Lambdather Edge / Lambdather Edge / Lambdather Eefsパイ


    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でラムダコンソールに移動します.ファイルシステムが正常にラムダ関数に接続されていることに注意してください

    今すぐ前方に移動し、イベントの任意の種類を使用してテストします.

    私はこの記事がデータを永続させないラムダのあなたの問題を解決するのを助けたことを望みます.EFSは使いやすい、メモリの問題に汎用的なソリューションです.
    あなたがどんな料金も避けるためにされるとき、cdk destroyに確かめてください.