Lambda 함수에 대한 파일 시스템 액세스 구성 - AWS Lambda

Lambda 함수에 대한 파일 시스템 액세스 구성

Amazon Elastic File System(Amazon EFS) 파일 시스템을 로컬 디렉터리에 마운트하도록 함수를 구성할 수 있습니다. Amazon EFS를 사용하면 함수 코드가 안전하고 높은 동시성으로 공유 리소스에 액세스하여 수정할 수 있습니다.

실행 역할 및 사용자 권한

파일 시스템에 사용자 구성 AWS Identity and Access Management(IAM) 정책이 없는 경우, EFS는 파일 시스템 탑재 대상을 사용하여 파일 시스템에 연결할 수 있는 모든 클라이언트에 대한 모든 액세스 권한을 부여하는 기본 정책을 사용합니다. 파일 시스템에 사용자 구성 IAM 정책이 있는 경우 함수의 실행 역할에 올바른 elasticfilesystem 권한이 있어야 합니다.

실행 역할 권한
  • 엘라스틱 파일 시스템: ClientMount

  • 엘라스틱 파일 시스템: (읽기 전용 연결에는 필요하지 않음) ClientWrite

이러한 권한은 Access 관리형 정책에 포함됩니다. AmazonElasticFileSystemClientReadWrite 또한 실행 역할에는 파일 시스템의 VPC에 연결하는 데 필요한 권한도 있어야 합니다.

파일 시스템을 구성할 때 Lambda는 권한을 사용하여 마운트 대상을 확인합니다. 파일 시스템에 연결되도록 함수를 구성하려면 사용자에게 다음 권한이 필요합니다.

사용자 권한
  • 엘라스틱 파일 시스템: DescribeMountTargets

파일 시스템 및 액세스 포인트 구성

함수가 연결되는 모든 가용 영역에 마운트 대상이 있는 Amazon EFS에서 파일 시스템을 생성합니다. 성능 및 복원력을 위해 최소 두 개의 가용 영역을 사용합니다. 예를 들어, 간단한 구성에서 별도의 가용 영역에 두 개의 프라이빗 서브넷이 있는 VPC를 가질 수 있습니다. 이 함수는 두 서브넷에 모두 연결되며 각 서브넷에서 마운트 대상을 사용할 수 있습니다. 함수와 마운트 대상에서 사용되는 보안 그룹에서 NFS 트래픽(포트 2049)을 허용하는지 확인합니다.

참고

파일 시스템을 생성할 때 나중에 변경할 수 없는 성능 모드를 선택합니다. 범용 모드는 지연 시간이 짧으며 최대 I/O 모드는 더 높은 최대 처리량과 IOPS를 지원합니다. 선택에 관한 도움말은 Amazon Elastic File System 사용 설명서Amazon EFS 성능을 참조하세요.

액세스 포인트는 함수의 각 인스턴스를 연결된 가용 영역에 대한 올바른 마운트 대상에 연결합니다. 최상의 성능을 위해 루트가 아닌 경로를 사용하여 액세스 포인트를 생성하고 각 디렉터리에서 생성되는 파일 수를 제한합니다. 다음 예제에서는 파일 시스템에 my-function라는 디렉터리를 생성하고 소유자 ID를 표준 디렉터리 권한(755)으로 1001로 설정합니다.

예 액세스 포인트 구성
  • 이름files

  • 사용자 ID1001

  • 그룹 ID1001

  • 경로/my-function

  • 권한755

  • 소유자 사용자 ID1001

  • 그룹 사용자 ID1001

함수가 액세스 포인트를 사용할 때 사용자 ID 1001이 지정되고, 디렉터리에 대한 전체 액세스 권한을 가집니다.

자세한 내용은 Amazon Elastic File System 사용 설명서의 다음 항목을 참조하세요.

파일 시스템에 연결(콘솔)

함수는 VPC의 로컬 네트워크를 통해 파일 시스템에 연결됩니다. 함수가 연결되는 서브넷은 파일 시스템의 마운트 지점을 포함하는 동일한 서브넷이거나 NFS 트래픽(포트 2049)을 파일 시스템으로 라우팅할 수 있는 동일한 가용 영역의 서브넷일 수 있습니다.

참고

함수가 VPC에 아직 연결되어 있지 않은 경우 아웃바운드 네트워킹을 VPC의 리소스에 연결 단원을 참조하세요.

파일 시스템 액세스를 구성하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 구성(Configuration)을 선택한 다음 파일 시스템(File systems)을 선택합니다.

  4. 파일 시스템에서 파일 시스템 추가를 선택합니다.

  5. 다음 속성을 구성합니다.

    • EFS 파일 시스템 – 동일한 VPC에 있는 파일 시스템에 대한 액세스 포인트입니다.

    • 로컬 마운트 경로 - 파일 시스템이 Lambda 함수에서 마운트되는 위치로, /mnt/로 시작합니다.

요금

Amazon EFS는 스토리지 및 처리량에 대해 요금을 청구하며, 요율은 스토리지 클래스에 따라 달라집니다. 자세한 내용은 Amazon EFS 요금을 참조하세요.

Lambda는 VPC 간 데이터 전송에 대해 요금을 청구합니다. 이는 함수의 VPC가 파일 시스템이 있는 다른 VPC로 피어링된 경우에만 적용됩니다. 요금은 동일한 리전의 VPC 간 Amazon EC2 데이터 전송과 동일합니다. 자세한 내용은 Lambda 요금을 참조하세요.

Lambda의 Amazon EFS 통합에 대한 자세한 내용은 Lambda에서 Amazon EFS 사용 단원을 참조하세요.

Lambda API를 사용하여 파일 시스템 액세스 구성

다음 API 작업을 사용하여 Lambda 함수를 파일 시스템에 연결합니다.

함수를 파일 시스템에 연결하려면 update-function-configuration 명령을 사용하세요. 다음 예제에서는 my-function라는 함수를 액세스 포인트의 ARN을 사용하여 파일 시스템에 연결합니다.

ARN=arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd aws lambda update-function-configuration --function-name my-function \ --file-system-configs Arn=$ARN,LocalMountPath=/mnt/efs0

describe-access-points 명령을 사용하여 파일 시스템 액세스 포인트의 ARN을 가져올 수 있습니다.

aws efs describe-access-points

다음 결과가 표시됩니다.

{ "AccessPoints": [ { "ClientToken": "console-aa50c1fd-xmpl-48b5-91ce-57b27a3b1017", "Name": "lambda-ap", "Tags": [ { "Key": "Name", "Value": "lambda-ap" } ], "AccessPointId": "fsap-015cxmplb72b405fd", "AccessPointArn": "arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd", "FileSystemId": "fs-aea3xmpl", "RootDirectory": { "Path": "/" }, "OwnerId": "123456789012", "LifeCycleState": "available" } ] }

다른 AWS 계정에 Amazon EFS 파일 시스템 탑재

다른 AWS 계정에 Amazon EFS 파일 시스템을 탑재하도록 함수를 구성할 수 있습니다. 파일 시스템을 탑재하기 전에 다음 사항을 확인해야 합니다.

  • VPC 피어링을 구성하고 각 VPC의 라우팅 테이블에 적절한 경로를 추가해야 합니다.

  • 탑재하려는 Amazon EFS 파일 시스템의 보안 그룹은 Lambda 함수와 연결된 보안 그룹의 인바운드 액세스를 허용하도록 구성되어야 합니다.

  • 가용 영역 ID가 일치하는 각 VPC에 서브넷을 생성해야 합니다.

  • 두 VPC 모두에서 DNS 호스트 이름을 활성화해야 합니다.

Lambda 함수가 다른 AWS 계정의 Amazon EFS 파일 시스템에 액세스하려면 함수에 권한을 부여하는 파일 시스템 정책도 해당 파일 시스템에 있어야 합니다. 파일 시스템 정책을 생성하는 방법을 알아보려면 Amazon Elastic File System User Guide의 Creating file system policies를 참조하세요.

다음은 지정된 계정의 Lambda 함수에 파일 시스템에서 모든 API 작업을 수행할 수 있는 권한을 부여하는 정책 예제를 보여줍니다.

{ "Version": "2012-10-17", "Id": "efs-lambda-policy", "Statement": [ { "Sid": "efs-lambda-statement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{LAMBDA-ACCOUNT-ID}:root" }, "Action": "*", "Resource": "arn:aws:elasticfilesystem:{REGION}:{ACCOUNT-ID}:file-system/{FILE SYSTEM ID}" } ] }
참고

표시된 예제 정책은 와일드카드 문자('*')를 사용하여 지정된 AWS 계정의 Lambda 함수가 파일 시스템에서 API 작업을 수행할 수 있는 권한을 부여합니다. 여기에는 파일 시스템 삭제가 포함됩니다. 다른 AWS 계정이 파일 시스템에서 수행할 수 있는 작업을 제한하려면 명시적으로 허용하려는 작업을 지정합니다. 가능한 API 작업 목록은 Amazon Elastic File System에 사용되는 작업, 리소스 및 조건 키를 참조하세요.

크로스 계정 파일 시스템 탑재를 구성하려면 AWS Command Line Interface(AWS CLI) update-function-configuration 작업을 사용합니다.

다른 AWS 계정에 파일 시스템을 탑재하려면 다음 명령을 실행합니다. 사용자의 함수 이름을 사용하고 Amazon 리소스 이름(ARN)을 탑재하려는 파일 시스템에 대한 Amazon EFS 액세스 포인트의 ARN으로 바꿉니다. LocalMountPath는 함수가 파일 시스템에 액세스할 수 있는 경로(/mnt/로 시작)입니다. Lambda 탑재 경로가 파일 시스템의 액세스 포인트 경로와 일치하는지 확인하세요. 예를 들어 액세스 포인트가 /efs인 경우 Lambda 탑재 경로는 /mnt/efs여야 합니다.

aws lambda update-function-configuration --function-name MyFunction \ --file-system-configs Arn=arn:aws:elasticfilesystem:us-east-1:222233334444:access-point/fsap-01234567,LocalMountPath=/mnt/test

AWS CloudFormation, 및 AWS SAM

AWS CloudFormation 및 AWS Serverless Application Model(AWS SAM)를 사용하여 Lambda 애플리케이션 생성을 자동화할 수 있습니다. AWS SAM AWS::Serverless::Function 리소스에서 파일 시스템 연결을 활성화하려면 FileSystemConfigs 속성을 사용합니다.

예 template.yml - 파일 시스템 구성
Transform: AWS::Serverless-2016-10-31 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet1: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: "us-west-2a" EfsSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: VpcId: Ref: VPC GroupDescription: "mnt target sg" SecurityGroupIngress: - IpProtocol: -1 CidrIp: "0.0.0.0/0" FileSystem: Type: AWS::EFS::FileSystem Properties: PerformanceMode: generalPurpose AccessPoint: Type: AWS::EFS::AccessPoint Properties: FileSystemId: Ref: FileSystem PosixUser: Uid: "1001" Gid: "1001" RootDirectory: CreationInfo: OwnerGid: "1001" OwnerUid: "1001" Permissions: "755" MountTarget1: Type: AWS::EFS::MountTarget Properties: FileSystemId: Ref: FileSystem SubnetId: Ref: Subnet1 SecurityGroups: - Ref: EfsSecurityGroup MyFunctionWithEfs: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.10 VpcConfig: SecurityGroupIds: - Ref: EfsSecurityGroup SubnetIds: - Ref: Subnet1 FileSystemConfigs: - Arn: !GetAtt AccessPoint.Arn LocalMountPath: "/mnt/efs" Description: Use a file system. DependsOn: "MountTarget1"

Lambda가 처음 실행되기 전에 마운트 대상이 완전히 생성되도록 하려면 DependsOn을 추가해야 합니다.

AWS CloudFormation AWS::Lambda::Function 유형의 경우, 속성 이름과 필드는 동일합니다. 자세한 내용은 AWS Lambda와 함께 AWS CloudFormation 사용 섹션을 참조하세요.

샘플 애플리케이션

이 안내서의 GitHub 리포지토리에는 Lambda 함수와 함께 Amazon EFS를 사용하는 방법을 보여주는 샘플 애플리케이션이 포함되어 있습니다.

  • efs-nodejs – Amazon VPC에서 Amazon EFS 파일 시스템을 사용하는 함수입니다. 이 샘플에는 Lambda와 함께 사용하도록 구성된 VPC, 파일 시스템, 마운트 대상 및 액세스 포인트가 포함되어 있습니다.