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

AWS Lambda access local resource or storage 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

Could not load file or assembly: System.Net.Http.WebRequest

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

实际上请看这个答案你可能不走运:你使用的库需要以 .NET Core 为目标发布https://github.com/dotnet/corefx/issues/28267#issuecomment-396349873

另请参阅 and 了解类似的版本控制问题和修复。


如果这不能解决问题,请考虑使用 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.IO dll 而不是试图找到 System.Net.Http.WebRequest dll:

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