linux 在使用AOT和.Net7的Lambda调用中未找到版本“GLIBC_2.29”

vnjpjtjt  于 2023-05-22  发布在  Linux
关注(0)|答案(1)|浏览(189)

我有一个.Net6 Lambda在AWS上工作。最近,我使用.Net7将其更改为采用AOT。部署到AWS后,我在Lambda调用时遇到以下错误:

/var/task/bootstrap: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /var/task/bootstrap)

下面是我的函数模板的主要部分:

Function:
    Type: AWS::Serverless::Function
    Metadata:
      BuildMethod: dotnet7
    Properties:
      FunctionName: upload-handler
      CodeUri: ./packages/upload-handler
      Handler: bootstrap
      Runtime: provided.al2
      Architectures:
      - x86_64

下面是我.csproject文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <PublishAot>true</PublishAot>
    <AssemblyName>bootstrap</AssemblyName>
    <OutputType>Exe</OutputType>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
    <StripSymbols>true</StripSymbols>
    <TrimMode>partial</TrimMode>
    <AWSProjectType>Lambda</AWSProjectType>
    <Version>1.0.0</Version>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  </PropertyGroup>

  <ItemGroup>
      <RdXmlFile Include="rd.xml" />
  </ItemGroup>
  <ItemGroup Condition="'$(RuntimeIdentifier)' == 'linux-arm64'">
    <RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="68.2.0.9" />
    <PackageReference Include="Microsoft.ICU.ICU4C.Runtime" Version="68.2.0.9" />
  </ItemGroup>
  
  <ItemGroup>
    <PackageReference Include="Amazon.Lambda.APIGatewayEvents" Version="2.6.0" />
    <PackageReference Include="Amazon.Lambda.RuntimeSupport" Version="1.8.7" />
    <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.3.1" />
    <PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.7.5" />
    <PackageReference Include="AWSSDK.S3" Version="3.7.103.51" />
    <PackageReference Include="AWSSDK.SecretsManager" Version="3.7.102.26" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
    <PackageReference Include="Serilog" Version="2.12.0" />
    <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
  </ItemGroup>

</Project>

下面是我的dockerfile的主要部分:

FROM mcr.microsoft.com/dotnet/sdk:7.0

# Install NativeAOT build prerequisites
RUN apt-get update && apt-get install -y --no-install-recommends clang zlib1g-dev
COPY ./src/Upload.Handler/*.csproj ./src/Upload.Handler/
COPY ./upload-handler.sln ./
RUN dotnet restore

COPY ./src/ ./src/
ARG VERSION
RUN dotnet publish ./src/Upload.Handler -r linux-x64 -c Release -o ./out/upload-handler /p:Version=$VERSION

当我使用Docker在本地运行Lambda时,调用没有问题。我使用docker-composeaws cloudformation package构建和打包,并使用aws cloudformation deploy部署到AWS。我还使用了git pipeline CI/CD,用于构建和部署的镜像是ubuntu-latest

build:
  name: Build and Test
  runs-on: ubuntu-latest

我最好的猜测是dockerfile中缺少了一些东西,我应该在dockerfile中使用ubuntu-latest进行多阶段构建。有人能给我指个方向吗。

tkclm6bt

tkclm6bt1#

错误消息/var/task/bootstrap:/lib64/libm.so.6:versionGLIBC_2.29' not found(required by /var/task/bootstrap)`表示Lambda函数正在尝试使用一个库,该库需要比Lambda运行时可用的GNU C库(glibc)版本更高的版本。
Lambda运行时基于Amazon Linux 2,目前使用glibc 2.28。但是,.NET 7需要glibc 2.29或更高版本。
要修复此错误,您可以:
将Lambda运行时更新到包含glibc 2.29的较新版本。使用--no-supported-runtimes标志构建您的.NET 7应用程序,以禁用对受支持运行时的要求。以下是如何将Lambda运行时更新到包含glibc 2.29的较新版本的步骤:
转到AWS管理控制台并打开Lambda服务。点击“函数”选项卡。选择要更新的Lambda函数。单击“配置”选项卡。在“运行时”部分,选择“provided.al2”。点击“保存”按钮。Lambda函数将更新到提供的.al2运行时的最新版本,其中包括glibc 2.29。
以下是如何使用--no-supported-runtimes标志构建.NET 7应用程序以禁用对受支持运行时的要求的步骤:
打开命令提示符或终端窗口。导航到.NET 7应用程序所在的目录。运行以下命令:

dotnet publish --no-supported-runtimes

这将在不需要受支持的运行时的情况下构建应用程序。
修复错误后,您应该能够毫无问题地部署和调用Lambda函数。

相关问题