設定 Lambda 函數的檔案系統存取權 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定 Lambda 函數的檔案系統存取權

您可以設定函數,將 Amazon Elastic File System (Amazon EFS) 檔案系統掛載到本機目錄。使用 Amazon EFS,您的函數程式碼可安全地存取和修改共用資源,並發揮高度並行效能。

執行角色和使用者許可

如果檔案系統沒有使用者設定的 AWS Identity and Access Management (IAM) 政策,EFS 將使用預設政策,只要是可以使用檔案系統掛載目標連線至檔案系統的用戶端,該政策都會授予完全存取權。如果檔案系統具有使用者設定的 IAM 政策,則函數的執行角色必須具有正確的 elasticfilesystem 許可。

執行角色許可
  • 彈性文件系統:ClientMount

  • 彈性文件系統:ClientWrite (只讀連接不需要)

這些權限包含在AmazonElasticFileSystemClientReadWrite存取管理原則中。此外,您的執行角色必須具有連線至檔案系統的 VPC 所需的許可

設定檔案系統時,Lambda 會使用您的許可來驗證掛載目標。若要設定函數以連線至檔案系統,您的使用者需要下列許可:

使用者權限
  • 彈性文件系統:DescribeMountTargets

設定檔案系統和存取點

在函數所連線的每個可用區域中,在具有掛載目標的 Amazon EFS 中建立檔案系統。為了提高效能和彈性,請至少使用兩個可用區域。例如,在簡單的組態中,您可以在不同的可用區域中擁有包含兩個私有子網路的 VPC。此函數連線到兩個子網路,每個子網路都有可用的掛載目標。確定函數和掛載目標所使用的安全群組允許 NFS 流量 (連接埠 2049)。

注意

建立檔案系統時,您選擇稍後無法變更的效能模式。General purpose (一般用途) 模式具有較低的延遲,而 Max I/O (IO 上限) 模式支援較高的輸送量上限和 IOPS。如需協助選擇,請參閱 Amazon Elastic File System 使用者指南中的 Amazon EFS 效能

存取點會將函數的每個執行個體連線至可用區域連線到的正確掛載目標。為了獲得最佳效能,請使用非根路徑建立存取點,並限制您在每個目錄中建立的檔案數目。下列範例會在檔案系統上建立名為 my-function 的目錄,並將擁有者 ID 設為 1001,具有標準目錄許可 (755)。

範例 存取點組態
  • 名稱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 file system (EFS 檔案系統) - 相同 VPC 中的檔案系統存取點。

    • Local mount path (本機掛載路徑) - 檔案系統掛載於 Lambda 函數 (以 /mnt/ 開頭) 的位置。

定價

Amazon EFS 會針對儲存和輸送量收取費用,費率依儲存類別而異。如需詳細資訊,請參閱 Amazon EFS 定價

Lambda 會針對 VPC 之間的資料傳輸收取費用。這僅適用於您的函數的 VPC 對等連線到帶有檔案系統的另一個 VPC 的情況。費率與相同區域內 VPC 之間的 Amazon EC2 資料傳輸費用相同。如需詳細資訊,請參閱 Lambda 定價

如需 Lambda 與 Amazon EFS 整合的詳細資訊,請參閱 搭配使用 Amazon EFS 與 Lambda

使用 Lambda API 設定檔案系統存取權

使用下列 API 操作將 Lambda 函數連線至檔案系統:

若要將函數連線至檔案系統,請使用 update-function-configuration 命令。下列範例會使用存取點的 ARN,將名為 my-function 的函數連線至檔案系統。

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 函數相關聯的安全群組傳入存取。

  • 必須使用相符的可用區域 (AZ) ID,在每個 VPC 中建立子網路。

  • VPC 都必須啟用 DNS 主機名稱

若要讓您的 Lambda 函數存取另一個 AWS 帳戶中的 Amazon EFS 檔案系統,該檔案系統也必須有檔案系統政策,授予許可給您的函數。若要了解如何建立檔案系統政策,請參閱《Amazon Elastic File System 使用者指南》中的建立檔案系統政策

下列範例政策提供指定帳戶中的 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 EFS 存取點 ARN 取代 Amazon Resource Name (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"

您必須新增 DependsOn,以確保 Lambda 在第一次執行之前,已完全建立掛載目標。

對於 AWS CloudFormation AWS::Lambda::Function 類型,數系名稱和欄位是相同的。如需詳細資訊,請參閱 搭配使用 AWS Lambda 與 AWS CloudFormation

範例應用程式

本指南的 GitHub 儲存庫包含範例應用程式,示範如何將 Amazon EFS 與 Lambda 函數搭配使用。

  • efs-nodejs - 在 Amazon VPC 中使用 Amazon EFS 檔案系統的函數。此範例包含設為與 Lambda 搭配使用的 VPC、檔案系統、掛載目標以及存取點。