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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

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

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

ファイルシステムにユーザー設定の AWS Identity and Access Management (IAM) ポリシーがない場合、EFS は、ファイルシステムマウントターゲットを使用してファイルシステムに接続できるすべてのクライアントへのフルアクセスを許可するデフォルトのポリシーを使用します。ファイルシステムにユーザー設定の IAM ポリシーがある場合、関数の実行ロールには正しい elasticfilesystem 許可が必要です。

実行ロールのアクセス許可
  • elasticfilesystem:ClientMount

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

これらのアクセス許可は、AmazonElasticFileSystemClientReadWriteアクセス管理ポリシーに含まれています。さらに、実行ロールは、ファイルシステムの 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

  • ユーザー ID1001

  • グループ ID1001

  • パス/my-function

  • アクセス許可755

  • 所有者ユーザー ID1001

  • グループユーザー ID1001

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

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

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

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

注記

関数が VPC にまだ接続されていない場合は、「」を参照してくださいアウトバウンドネットワークを VPC 内のリソースに接続する

ファイルシステムアクセスを設定するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

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

  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 を使用したファイルシステムアクセスの設定

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" } ] }

Amazon EFS ファイルシステムを別の AWS アカウント にマウントする

Amazon EFS ファイルシステムを別の AWS アカウント にマウントする関数を設定できます。ファイルシステムをマウントする前に、次のことを確認する必要があります。

  • VPC ピアリングが設定され、各 VPC のルートテーブルに適切なルートが追加されている。

  • マウントする Amazon EFS ファイルシステムのセキュリティグループが、Lambda 関数に関連付けられたセキュリティグループからのインバウンドアクセスを許可するように設定されている。

  • 各 VPC にアベイラビリティーゾーン (AZ) ID の一致するサブネットが作成されている。

  • 両方の VPC で DNS ホスト名が有効である。

Lambda 関数が別の AWS アカウント の Amazon EFS ファイルシステムにアクセスできるようにするため、そのファイルシステムには関数にアクセス許可を付与するファイルシステムポリシーも必要です。ファイルシステムポリシーの作成方法については、「Amazon Elastic File System ユーザーガイド」の「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、ファイルシステム、マウントターゲット、アクセスポイントが含まれます。