Deploy .NET lambda function bằng Native AOT

Sẽ có những TH bạn cần deploy Lambda function (.NET) mà không phụ thuộc vào môi trường runtimes, thì bạn có thể xem xét sử dụng Native AOT. Bản chất sẽ là bạn deploy lên 1 package đã được build sẵn, chỉ cần chạy thôi. Tuy nhiên có 2 lưu ý cho bạn ở đây:

  • Vì đã build rồi, nên sẽ không phù hợp để có thể tạo ra các giá trị dynamic trong quá trình runtime

  • Phải được build trên Amazon Linux 2 hoặc 2023, nếu không thì sẽ không chạy được ở Lambda.

Bài viết này mình sẽ hướng dẫn build bằng command + viết giúp bạn 1 file build.yml và appspec.yml để sử dụng CodeDeploy cho mục đích CI/CD

Build bằng command trên EC2:

Chúng ta tạm thời sẽ sử dụng luôn sample được generate bởi tool cho ví dụ.

Dưới đây là các câu command, những command này mình đã test thành công với Amazon Linux 2:

## Cài đặt các tools cần thiết. Bạn sẽ cần có dotnet và docker cho việc này 

sudo yum update

# Set up 1 số thư viện build 
sudo yum install gcc -y
sudo yum install zlib-devel -y
sudo yum install gcc-c++ -y
sudo yum install libicu -y
export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true

# Cài đặt docker
sudo yum install docker -y
sudo systemctl start docker
sudo usermod -aG docker $USER

# Cài đặt .net
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-7.0 -y
# Tài liệu tham khảo:
# https://learn.microsoft.com/en-us/dotnet/core/install/linux
# https://learn.microsoft.com/en-us/dotnet/core/install/linux-scripted-manual#scripted-install

# Cài đặt Lambda tool:
export DOTNET_ROOT=$(pwd)/.dotnet
export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools

dotnet tool install Amazon.Lambda.Tools --tool-path $(pwd)/.dotnet
dotnet new install Amazon.Lambda.Templates

# Generate sample project
dotnet new lambda.NativeAOT -n NativeAotSample
cd ./NativeAotSample/src/NativeAotSample
dotnet add package AWSSDK.Core

# Đóng gói project, nếu bạn muốn deploy luôn thì: dotnet lambda deploy-function. Lưu ý là câu lệnh này sẽ không deploy Lambda function trong VPC, mà sẽ tạo public Lambda.
dotnet lambda package

Sẽ tạo ra file zip build trong thư mục /home/ssm-user/NativeAotSample/src/NativeAotSample/bin/Release/net7.0

Bạn có thể lấy file zip trong thư mục trên ảnh, đưa lên S3, tạo Lambda function với runtime là OS-Only AMZ Linux 2:

Test:

dotnet lambda invoke-function testfunc --payload "hello world"

Kết quả:

Sử dụng codepipeline để CI/CD:

Codecommit:

Code mặc định generate ra + appspec.yml + buildspec.yml

buildspec.yml:

version: 0.2
phases:
  install:
    commands:
      - echo Installing Docker...
      - yum install -y docker
      - service docker start || /usr/bin/dockerd &
      - sleep 10 # Give Docker some time to start
      - cat /etc/os-release
      - rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
      - yum install -y dotnet-sdk-7.0
      - export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true
      # Assuming .NET 7.0 is installed in /usr/share/dotnet
      - export PATH=/usr/share/dotnet:$PATH 
      - /usr/share/dotnet/dotnet --info
      - /usr/share/dotnet/dotnet --version
      - /usr/share/dotnet/dotnet --list-sdks
      - /usr/share/dotnet/dotnet --list-runtimes
      - echo Installing Amazon Lambda Tools and Templates...
      - /usr/share/dotnet/dotnet tool install Amazon.Lambda.Tools --tool-path /usr/share/dotnet
      - /usr/share/dotnet/dotnet new -i Amazon.Lambda.Templates
  pre_build:
    commands:
      - echo Preparing build...
      - /usr/share/dotnet/dotnet new lambda.NativeAOT -n NativeAotSample
  build:
    commands:
      - echo Building the project...
      - cd ./NativeAotSample/src/NativeAotSample
      - /usr/share/dotnet/dotnet lambda package
artifacts:
  files:
    - appspec.yml
    - NativeAotSample/src/NativeAotSample/bin/Release/net7.0/*.zip
  discard-paths: no

appspec.yml

version: 0.0
Resources:
  - MyLambdaFunction:
      Type: AWS::Lambda::Function
      Properties:
        Name: "test-aot-2023"
        Alias: "test-aot"
        CurrentVersion: "1"
        TargetVersion: "3"

Sẽ cần thay đổi target version khi deploy. Nhưng trước khi deploy thì phải tạo version với version number = target version nếu không sẽ lỗi.

Alias phải trỏ vào cùng version với Current Version

Target Version, Current Version hay Alias đều phải được tạo và khai báo

Configure codebuild

Lưu ý chọn image build là aws/codebuild/amazonlinux2-x86_64-standard:4.0 để image build là amz linux 2:

[Container] 2024/01/24 04:03:01.972142 Running command cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
SUPPORT_END="2025-06-30"

Buildspec: Điền buildspec.yml

Configure CodeDeploy

Compute platform: AWS Lambda

Lưu ý là role deploy thì phải có quyền với Lambda

Kết quả deploy: