Lambda 関数のファイルシステムアクセスの設定 - AWS Lambda

Lambda 関数のファイルシステムアクセスの設定

Amazon Elastic File System (Amazon EFS) ファイルシステムをローカルディレクトリにマウントするように関数を設定できます。Amazon EFS を使用すると、関数コードは共有リソースに安全かつ高い同時実行数でアクセスして変更できます。

実行ロールとユーザーアクセス許可

Lambda は、関数のアクセス許可を使用してファイルシステムをマウントします。ファイルシステムに接続するには、ファイルシステムの VPC への接続に必要なアクセス許可に加えて、次のアクセス許可が関数の実行ロールに必要です。

実行ロールのアクセス許可

  • elasticfilesystem:ClientMount

  • elasticfilesystem:ClientWrite (読み取り専用接続には不要)

これらのアクセス許可は、AmazonElasticFileSystemClientReadWriteAccess 管理ポリシーに含まれています。

ファイルシステムを設定する場合、Lambda はアクセス許可を使用してマウントターゲットを検証します。ファイルシステムに接続するように関数を設定するには、IAM ユーザーに以下のアクセス許可が必要です。

ユーザーアクセス許可

  • elasticfilesystem:DescribeMountTargets

ファイルシステムとアクセスポイントの設定

関数が接続するすべてのアベイラビリティーゾーンにマウントターゲットを持つファイルシステムを Amazon EFS に作成します。パフォーマンスと耐障害性のために、少なくとも 2 つのアベイラビリティーゾーンを使用します。たとえば、シンプルな設定では、別々のアベイラビリティーゾーンに 2 つのプライベートサブネットを持つ VPC を作成できます。この関数は両方のサブネットに接続し、それぞれのサブネットでマウントターゲットを使用できます。NFS トラフィック (ポート 2049) が、関数およびマウントターゲットで使用されるセキュリティグループによって許可されていることを確認します。

注記

ファイルシステムを作成するときは、後で変更できないパフォーマンスモードを選択します。汎用 モードではレイテンシーが低く、最大 I/O モードではより高い最大スループットと IOPS がサポートされます。選択のヘルプについては、Amazon Elastic File System ユーザーガイドの「Amazon EFS のパフォーマンス」を参照してください。

アクセスポイントは、関数の各インスタンスを、接続先のアベイラビリティーゾーンの適切なマウントターゲットに接続します。最大のパフォーマンスを得るには、ルート以外のパスを持つアクセスポイントを作成し、各ディレクトリに作成するファイル数を制限します。ユーザー ID と所有者 ID は必須ですが、特定の値は必要ありません。次の例では、ファイルシステムに my-function という名前のディレクトリを作成し、標準ディレクトリ許可 (755) で所有者 ID を 1001 に設定します。

例 アクセスポイントの設定

  • 名前files

  • ユーザー ID1001

  • グループ ID1001

  • パス/my-function

  • アクセス許可755

  • 所有者ユーザー ID1001

  • グループユーザー ID1001

関数がアクセスポイントを使用する場合、ユーザー ID 1001 とディレクトリへのフルアクセス許可が与えられます。

詳細については、Amazon Elastic File System ユーザーガイドの次のトピックを参照してください。

ファイルシステムへの接続 (コンソール)

関数は、VPC 内のローカルネットワークを介してファイルシステムに接続します。関数が接続するサブネットは、ファイルシステムのマウントポイントを含む同じサブネットでも、NFS トラフィック (ポート 2049) をファイルシステムにルーティングできる同じアベイラビリティーゾーン内のサブネットでもかまいません。

注記

関数が VPC にまだ接続されていない場合は、「」を参照してくださいVPC 内のリソースにアクセスするように Lambda 関数を設定する

ファイルシステムアクセスを設定するには

  1. Lambda コンソールで [Functions (関数)] ページを開きます。

  2. 関数を選択します。

  3. [設定]、[ ファイルシステム ] の順にクリックします。

  4. [ファイルシステム] で、[ファイルシステムの追加] を選択します。

  5. 以下のプロパティを設定します。

    • EFS ファイルシステム - 同じ VPC 内のファイルシステムのアクセスポイント。

    • ローカルマウントパス - ファイルシステムが Lambda 関数にマウントされている場所 (/mnt/ で始まります)。

Pricing

Amazon EFS では、ストレージとスループットに対して料金が発生します。レートはストレージクラスによって異なります。詳細については、「Amazon EFS の料金」を参照してください。

Lambda では、VPC 間のデータ転送に対して料金が発生します。これは、関数の VPC がファイルシステムを持つ別の VPC にピア接続されている場合にのみ該当します。レートは、同じリージョン内の VPC 間の Amazon EC2 データ転送と同じです。詳細については、「AWS Lambda の料金」を参照してください。

Lambda と Amazon EFS の統合の詳細については、「Lambda で Amazon EFS を使用する」を参照してください。

Lambda API を使用したファイルシステムアクセスの設定

Lambda 関数をファイルシステムに接続するには、次の API オペレーションを使用します。

関数をファイルシステムに接続するには、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

ファイルシステムのアクセスポイントの ARN は、describe-access-points コマンドで取得できます。

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 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.9 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 リポジトリには、Amazon EFS と Lambda 関数の使用方法を示すサンプルアプリケーションが含まれています。

  • efs-nodejs - Amazon VPCで Amazon EFS ファイルシステムを使用する関数。このサンプルには、Lambda で使用するように設定された VPC、ファイルシステム、マウントターゲット、アクセスポイントが含まれます。