无法加载共享库“ldap.so.2”或其某个依赖项。

0

【以下的问题经过翻译处理】 我使用Visual Studio创建了一个.NET 6 容器镜像 C# lambda函数。我的函数最终将使用https://github.com/flamencist/ldap4net查询活动目录。

这个包需要安装openldap,在我用于此lambda函数的Amazon Linux 2 docker容器镜像里原生安装了它。

当我调用已发布的lambda时,我遇到了以下错误。

{
  "errorType": "DllNotFoundException",
  "errorMessage": "Unable to load shared library 'ldap.so.2' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libldap.so.2: cannot open shared object file: No such file or directory",
  "stackTrace": [
    "at LdapForNet.Native.NativeMethodsLinux.ldap_initialize(IntPtr& ld, String uri)",
    "at LdapForNet.Native.LdapNativeLinux.Init(IntPtr& ld, String url)",
    "at LdapForNet.LdapConnection.Connect(String url, LdapVersion version)",
    "at LdapForNet.LdapConnectExtensions.Connect(ILdapConnection connection, Uri uri, LdapVersion version)",
    "at LdapForNet.LdapConnectExtensions.Connect(ILdapConnection connection, String hostname, Int32 port, LdapSchema ldapSchema, LdapVersion version)",
    "at hqpoc_lam_net6_docker.Function.ValidateUser(String domainName, String username, String password) in C:\\git\\hqpoc-lam-net6-docker\\hqpoc-lam-net6-docker\\src\\hqpoc-lam-net6-docker\\Function.cs:line 35",
    "at hqpoc_lam_net6_docker.Function.FunctionHandler(String input, ILambdaContext context) in C:\\git\\hqpoc-lam-net6-docker\\hqpoc-lam-net6-docker\\src\\hqpoc-lam-net6-docker\\Function.cs:line 24",
    "at lambda_method1(Closure , Stream , ILambdaContext , Stream )",
    "at Amazon.Lambda.RuntimeSupport.Bootstrap.UserCodeLoader.Invoke(Stream lambdaData, ILambdaContext lambdaContext, Stream outStream) in /src/Repo/Libraries/src/Amazon.Lambda.RuntimeSupport/Bootstrap/UserCodeLoader.cs:line 145",
    "at Amazon.Lambda.RuntimeSupport.HandlerWrapper.<>c__DisplayClass8_0.<GetHandlerWrapper>b__0(InvocationRequest invocation) in /src/Repo/Libraries/src/Amazon.Lambda.RuntimeSupport/Bootstrap/HandlerWrapper.cs:line 56",
    "at Amazon.Lambda.RuntimeSupport.LambdaBootstrap.InvokeOnceAsync(CancellationToken cancellationToken) in /src/Repo/Libraries/src/Amazon.Lambda.RuntimeSupport/Bootstrap/LambdaBootstrap.cs:line 176"
  ]

我已经把所有相关的二进制文件都打包进了Lambda函数目录里,正如这里描述的:https://aws.amazon.com/premiumsupport/knowledge-center/lambda-linux-binary-package/

我如何在C# Lambda函数docker 容器里使用原生的二进制 openldap?谢谢!

profile picture
专家
已提问 5 个月前36 查看次数
1 回答
0

【以下的回答经过翻译处理】 你好,

我是AWS支持团队的Tim。我与AWS的一些同事一起合作,发现我们的AWS ECR Dotnet 6基础镜像(https://gallery.ecr.aws/lambda/dotnet)包含openldap。

当你提到它是原生安装时,我理解为你在运行代码时使用了我们提供的openldap包(因此你的代码建立在提供的openldap)。

建议在Dockerfile中添加以下行来安装openldap,无论我们是否包含它(这样你可以完全控制你的依赖项):

RUN yum install -y openldap

如果基础镜像中的openldap被删除,你捆绑的安装方式将保证它始终在镜像构建过程中被包含和安装。

只需要注意的是,软件开发有点难以排除错误,在双人编程的情景下会变得更容易(我会与你一起在那里)。但我尽自己所能在我的一面寻找答案。

  • 假设你在修改Dockerfile后成功捆绑了它,错误会提示你考虑设置LD_DEBUG环境变量。
  • 另一个可能的问题是文件的权限,我曾在我们的基于ZIP的Python部署包中遇到类似的错误,需要改变权限(https://aws.amazon.com/premiumsupport/knowledge-center/lambda-deployment-package-errors/
  • 最后一个可能成为问题的是你建立容器的方法,这是我自己没有多少可见性的地方(我之前提到的双人编程问题: ^))。也许你可以仔细查看这些。如果你的系统非常干净且默认设置(即没有进行过太多修改),那么可能需要和dotnet语言维护者一起进行一些挖掘。我发现一个github议题和你的情况类似(不是完全一样的问题)https://github.com/dotnet/dotnet-docker/issues/1946

我有一些额外的资源可以提供帮助。我们最近发布了一篇博文(截至本文撰写时为 5 天前),介绍如何开始使用 AWS Lambda 的 dotnet 6 运行时,请点击此处:https://aws.amazon.com/blogs/compute/introducing-the-net-6-runtime-for-aws-lambda/。

此外,在过去一小时内(截至本文撰写之时),我们的无服务器团队发布了一个视频教程,提供了一些新发布的 dotnet 6 运行时的演示:https://www.youtube.com/watch?v=l4_WNjMHDx8。

如需进一步排除故障,您可以查看 aws dotnet GitHub 页面并提交问题,他们以前可能遇到过此类错误:https://github.com/aws/dotnet

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则