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: