AWS Lambda 访问本地资源或存储 C#



如何使用 C# 在 Lambda 中存储和访问文件 我使用了可用于 lambda 的 tmp 文件夹,但出现无法加载文件或程序集的错误。如何解决错误?我使用了 ADP nuget。

using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(reportLine, Path.GetTempPath() + 
"sample_auth.key");
}

我用它来将文件下载到 lambda 的 tmp 文件夹中。我没有在字符串机密中包含其他配置,但您可以查看下面的 github 以获取完全相同的示例。

string config = @"{
""sslCertPath"": ""/tmp/sample.pfx"",
""sslKeyPath"": ""/tmp/sample_auth.key"",
}";
ADPAccessToken token = null;
if (String.IsNullOrEmpty(clientconfig))
{
Console.WriteLine("Settings file or default options not available.");
}
else
{
ClientCredentialConfiguration connectionCfg = JSONUtil.Deserialize<ClientCredentialConfiguration>(clientconfig);
ClientCredentialConnection connection = (ClientCredentialConnection)ADPApiConnectionFactory.createConnection(connectionCfg);
//context.Logger.Log(ADPApiConnection.certificatepath);
//context.Logger.Log(clientconfig);
try
{
connection.connect();
if (connection.isConnectedIndicator())
{
token = connection.accessToken;
//    context.Logger.Log("Connected to API end point");
//    //Console.WriteLine("Token:  ");
//    //Console.WriteLine("         AccessToken: {0} ", token.AccessToken);
//    //Console.WriteLine("         TokenType: {0} ", token.TokenType);
//    //Console.WriteLine("         ExpiresIn: {0} ", token.ExpiresIn);
//    //Console.WriteLine("         Scope: {0} ", token.Scope);
//    //Console.WriteLine("         ExpiresOn: {0} ", token.ExpiresOn);
//    //Console.ReadLine();
}
}
catch (ADPConnectionException e)
{
context.Logger.Log(e.Message);
}
//catch (Exception e)
//{
//    context.Logger.Log(e.Message);
//}
//Console.Read();
}
return "Ok";
}

我收到一个错误,我认为 lambda 检查/var/task 文件夹

errorMessage": "One or more errors occurred. (Could not load file or 
assembly 'System.Net.Http.WebRequest, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file 
specified.n)",
"cause":   {
"errorType": "FileNotFoundException",
"errorMessage": "Could not load file or assembly 
'System.Net.Http.WebRequest, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file 
specified.n",

下面是示例程序: https://github.com/adplabs/adp-connection-NET/blob/master/ADPClientDemo/Program.cs

我可以在控制台上运行该程序,但是当我尝试在lambda中执行此操作时,出现错误。是因为来自 AWS 的 NuGet 吗?

我有以下 NuGet

Amazon Lambda Core
Amazon Lambda S3 Events 
Amazon lambda Serialization json
AWS SDK Core 
Microsoft Asp Net Web Api Client 
ADP library connection NET

无法加载文件或程序集:System.Net.Http.WebRequest

该错误似乎是由版本控制问题引起的,我认为您需要使用System.Net.Http.WebRequestdll 的 .Net 核心版本或比 .Net 4.0 更高的版本才能与 .NET Core 2.0 一起使用。

实际上,请看这个答案,您可能会不走运:您使用的库需要面向.NET Core:https://github.com/dotnet/corefx/issues/28267#issuecomment-396349873

另请参阅 https://stackoverflow.com/a/41683787/495455 和无法加载 .NET AWSSDK 中的文件或程序集"System.Net.Http.Webrequest",了解类似的版本控制问题和修复。


如果这不能解决问题,请考虑使用 AWS API。您可以将 sample_auth.key 文件放在 S3 存储桶上并读取它,例如 https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html


或者根据您链接到的示例,他们将 json 文件与 Lambda 打包: https://github.com/adplabs/adp-connection-NET/tree/master/ADPClientDemo/Content/config

他们使用StreamReader读取它,也许这会使用System.IOdll 而不是尝试查找System.Net.Http.WebRequestdll:

string configFileName = "default.json";
StreamReader sr = new StreamReader("..\..\Content\config\" + configFileName);
string clientconfig = sr.ReadToEnd();

最新更新