通过GitHub Actions部署的AWS .NET 6 Lambda获取目录路径问题
解决AWS .NET 6 Lambda读取text-files文件夹的问题
核心原因
你遇到的问题并非路径获取逻辑错误,而是text-files文件夹及其中的文件未被包含进Lambda的部署包。GitHub Actions部署时,若项目配置未明确指定,这类静态文件不会被打包到/var/task目录下,自然找不到对应路径。
解决步骤
1. 修改项目配置文件(MyFunction.csproj)
必须在.csproj中添加配置,确保text-files下的所有文件被复制到项目输出目录,这样部署时才会被打包进Lambda环境:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <LambdaRuntime>dotnet6</LambdaRuntime> <PublishReadyToRun>true</PublishReadyToRun> <PublishSingleFile>true</PublishSingleFile> <RuntimeIdentifier>linux-x64</RuntimeIdentifier> <SelfContained>false</SelfContained> </PropertyGroup> <!-- 新增此配置段,确保静态文件被打包 --> <ItemGroup> <None Include="text-files\**" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup> <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="2.1.0" /> <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.3.0" /> </ItemGroup> </Project> - `Include="text-files\**"`:匹配`text-files`文件夹下所有文件及子目录 - `CopyToOutputDirectory="PreserveNewest"`:将这些文件同步到项目输出目录,部署时会被纳入Lambda部署包 ### 2. 正确的路径读取逻辑 配置完成后,你之前使用的`LAMBDA_TASK_ROOT`是Lambda官方推荐的执行目录环境变量,此时可以正常使用: ```csharp var taskRoot = Environment.GetEnvironmentVariable("LAMBDA_TASK_ROOT"); var directoryPath = Path.Combine(taskRoot, "text-files"); // 可选:先验证路径存在性 if (Directory.Exists(directoryPath)) { // 读取文件示例 var files = Directory.GetFiles(directoryPath); foreach (var file in files) { var content = File.ReadAllText(file); // 处理文件内容逻辑 } }
3. 验证GitHub Actions部署流程
确保GitHub Actions的部署步骤基于dotnet publish的输出打包,比如典型流程:
- name: 发布Lambda项目 run: dotnet publish -c Release -o ./publish - name: 部署到AWS Lambda uses: aws-actions/aws-lambda-deploy@v2 with: function-name: 你的Lambda函数名 zip-file: ./publish/你的项目名.zip
./publish目录会包含所有输出文件(包括text-files),部署后会被解压到Lambda的/var/task目录下。
总结
只要通过.csproj配置确保静态文件被打包,使用LAMBDA_TASK_ROOT拼接路径即可正常读取text-files中的文件。
内容的提问来源于stack exchange,提问作者user246392
相关产品推荐
相关产品推荐

