Lambda 関数のファイルシステムアクセスの設定
Amazon Elastic File System (Amazon EFS) ファイルシステムをローカルディレクトリにマウントするように関数を設定できます。Amazon EFS を使用すると、関数コードは共有リソースに安全かつ高い同時実行数でアクセスして変更できます。
セクション
実行ロールとユーザーアクセス許可
ファイルシステムにユーザー設定の AWS Identity and Access Management (IAM) ポリシーがない場合、EFS は、ファイルシステムマウントターゲットを使用してファイルシステムに接続できるすべてのクライアントへのフルアクセスを許可するデフォルトのポリシーを使用します。ファイルシステムにユーザー設定の IAM ポリシーがある場合、関数の実行ロールには正しい elasticfilesystem
許可が必要です。
実行ロールのアクセス許可
-
elasticfilesystem:ClientMount
-
elasticfilesystem:ClientWrite (読み取り専用接続には不要)
これらのアクセス許可は、AmazonElasticFileSystemClientReadWriteAccess 管理ポリシーに含まれています。さらに、実行ロールは、ファイルシステムの VPC に接続するために必要な許可を備えている必要があります。
ファイルシステムを設定する場合、Lambda はアクセス許可を使用してマウントターゲットを検証します。ファイルシステムに接続するように関数を設定するには、ユーザーに以下のアクセス許可が必要です。
ユーザーアクセス許可
-
elasticfilesystem:DescribeMountTargets
ファイルシステムとアクセスポイントの設定
関数が接続するすべてのアベイラビリティーゾーンにマウントターゲットを持つファイルシステムを Amazon EFS に作成します。パフォーマンスと耐障害性のために、少なくとも 2 つのアベイラビリティーゾーンを使用します。たとえば、シンプルな設定では、別々のアベイラビリティーゾーンに 2 つのプライベートサブネットを持つ VPC を作成できます。この関数は両方のサブネットに接続し、それぞれのサブネットでマウントターゲットを使用できます。NFS トラフィック (ポート 2049) が、関数およびマウントターゲットで使用されるセキュリティグループによって許可されていることを確認します。
ファイルシステムを作成するときは、後で変更できないパフォーマンスモードを選択します。汎用 モードではレイテンシーが低く、最大 I/O モードではより高い最大スループットと IOPS がサポートされます。選択のヘルプについては、Amazon Elastic File System ユーザーガイドの「Amazon EFS のパフォーマンス」を参照してください。
アクセスポイントは、関数の各インスタンスを、接続先のアベイラビリティーゾーンの適切なマウントターゲットに接続します。最大のパフォーマンスを得るには、ルート以外のパスを持つアクセスポイントを作成し、各ディレクトリに作成するファイル数を制限します。次の例では、ファイルシステムに my-function
という名前のディレクトリを作成し、標準ディレクトリ許可 (755) で所有者 ID を 1001 に設定します。
例 アクセスポイントの設定
-
名前 -
files
-
ユーザー ID -
1001
-
グループ ID -
1001
-
パス -
/my-function
-
アクセス許可 -
755
-
所有者ユーザー ID -
1001
-
グループユーザー ID -
1001
関数がアクセスポイントを使用する場合、ユーザー ID 1001 とディレクトリへのフルアクセス許可が与えられます。
詳細については、Amazon Elastic File System ユーザーガイドの次のトピックを参照してください。
ファイルシステムへの接続 (コンソール)
関数は、VPC 内のローカルネットワークを介してファイルシステムに接続します。関数が接続するサブネットは、ファイルシステムのマウントポイントを含む同じサブネットでも、NFS トラフィック (ポート 2049) をファイルシステムにルーティングできる同じアベイラビリティーゾーン内のサブネットでもかまいません。
関数が VPC にまだ接続されていない場合は、「」を参照してくださいVPC 内のリソースにアクセスするように Lambda 関数を設定する
ファイルシステムアクセスを設定するには
Lambda コンソールの [Functions]
(関数) ページを開きます。 -
関数を選択します。
-
[設定]、[ ファイルシステム ] の順にクリックします。
-
[ファイルシステム] で、[ファイルシステムの追加] を選択します。
-
以下のプロパティを設定します。
-
EFS ファイルシステム - 同じ VPC 内のファイルシステムのアクセスポイント。
-
ローカルマウントパス - ファイルシステムが Lambda 関数にマウントされている場所 (
/mnt/
で始まります)。
-
Amazon EFS では、ストレージとスループットに対して料金が発生します。レートはストレージクラスによって異なります。詳細については、「Amazon EFS の料金
Lambda では、VPC 間のデータ転送に対して料金が発生します。これは、関数の VPC がファイルシステムを持つ別の VPC にピア接続されている場合にのみ該当します。レートは、同じリージョン内の VPC 間の Amazon EC2 データ転送と同じです。詳細については、「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、ファイルシステム、マウントターゲット、アクセスポイントが含まれます。