của James Beswick | TRÊN 14 tháng 12 năm 2023| trong AWS Lambda , Serverless | Liên kết cố định | Chia sẻ
Bài đăng này được viết bởi Jeff Gebhart, Chuyên gia cấp cao TAM, Serverless.
AWS Lambda hiện hỗ trợ Python 3.12 dưới dạng cả hình ảnh cơ sở bộ chứa và runtime được quản lý. Python 3.12 được xây dựng dựa trên các cải tiến về hiệu suất được phát hành lần đầu tiên cùng với Python 3.11, đồng thời bổ sung một số tính năng về hiệu suất và khả năng đọc ngôn ngữ trong trình thông dịch. Với bản phát hành này, các nhà phát triển Python giờ đây có thể tận dụng các tính năng và cải tiến mới này khi tạo các ứng dụng phi máy chủ trên AWS Lambda.
Bạn có thể sử dụng Python 3.12 với Powertools cho AWS Lambda (Python ), một bộ công cụ dành cho nhà phát triển để triển khai các biện pháp thực hành tốt nhất của Serverless như khả năng quan sát, xử lý hàng loạt, tích hợp Cửa hàng tham số, tính tạm thời, cờ tính năng, Số liệu CloudWatch và ghi nhật ký có cấu trúc cùng với các tính năng khác.
Bạn cũng có thể sử dụng Python 3.12 với Lambda@Edge, cho phép bạn tùy chỉnh nội dung có độ trễ thấp được phân phối qua Amazon CloudFront .
Python là ngôn ngữ phổ biến để xây dựng các ứng dụng serverless. Bản phát hành Python 3.12 có một số cải tiến về trình thông dịch và cú pháp.
Khi ra mắt, runtime Lambda mới nhận được ít mức sử dụng hơn so với runtime đã thiết lập hiện có. Điều này có thể dẫn đến thời gian khởi động nguội lâu hơn do giảm khả năng lưu trữ bộ nhớ đệm trong các hệ thống con Lambda nội bộ. Thời gian khởi động nguội thường cải thiện trong những tuần sau khi ra mắt khi mức sử dụng tăng lên. Do đó, AWS khuyến nghị không nên đưa ra kết luận từ việc so sánh hiệu suất song song với các runtime Lambda khác cho đến khi hiệu suất ổn định. Vì hiệu suất phụ thuộc nhiều vào khối lượng công việc nên khách hàng có khối lượng công việc nhạy cảm với hiệu suất nên tiến hành thử nghiệm của riêng mình thay vì dựa vào điểm chuẩn kiểm tra chung.
Thay đổi runtime Lambda
Amazon Linux 2023
runtime Python 3.12 dựa trên provided.al2023 runtime, dựa trên hình ảnh vùng chứa tối thiểu của Amazon Linux 2023 . Bản cập nhật hệ điều hành này mang đến một số cải tiến so với hệ điều hành dựa trên Amazon Linux 2 (AL2) được sử dụng cho các runtime Lambda Python từ Python 3.8 đến Python 3.11.
provided.al2023 chỉ chứa các thành phần thiết yếu cần thiết để cài đặt các gói khác và cung cấp dung lượng triển khai nhỏ hơn, dưới 40 MB so với hơn 100 MB cho hình ảnh dựa trên AL2 của Lambda.
Với glibc phiên bản 2.34, khách hàng có quyền truy cập vào phiên bản hiện đại của glibc, được cập nhật từ phiên bản 2.26 bằng hình ảnh dựa trên AL2.
Hình ảnh tối thiểu của Amazon Linux 2023 sử dụng microdnfl àm trình quản lý gói, symlinked dưới dạng dnf. Điều này thay thế yum trình quản lý gói được sử dụng trong các hình ảnh dựa trên AL2 trước đó. Nếu triển khai các hàm Lambda dưới dạng hình ảnh vùng chứa, bạn phải cập nhật Dockerfiles để sử dụng dnf thay vì yum khi nâng cấp lên hình ảnh cơ sở Python 3.12.
Ngoài ra, curl và gnupg2 cũng được bao gồm dưới dạng phiên bản tối thiểu curl-minimal và gnupg2-minimal.
Tìm hiểu thêm về provided.al2023 runtime trong bài đăng blog Giới thiệu runtime Amazon Linux 2023 dành cho AWS Lambda và bài đăng blog ra mắt Amazon Linux 2023 .
Thay đổi định dạng phản hồi
Bắt đầu với runtime Python 3.12, các hàm trả về các ký tự Unicode như một phần của phản hồi JSON của chúng. Các phiên bản trước trả về chuỗi thoát cho các ký tự Unicode trong phản hồi.
Ví dụ: trong Python 3.11, nếu bạn trả về một chuỗi Unicode chẳng hạn như “こんにちは”, nó sẽ thoát khỏi các ký tự Unicode và trả về “\u3053\u3093\u306b\u3061\u306f”. runtime Python 3.12 trả về “こんにちは” ban đầu.
Thay đổi này làm giảm kích thước của tải trọng được Lambda trả về. Trong ví dụ trước, phiên bản thoát là 32 byte so với 17 byte của chuỗi Unicode. Việc sử dụng phản hồi Unicode giúp giảm kích thước của phản hồi Lambda, giúp dễ dàng điều chỉnh các phản hồi lớn hơn vào giới hạn phản hồi Lambda 6MB (đồng bộ).
Khi nâng cấp lên Python 3.12, bạn có thể cần điều chỉnh mã của mình trong các mô-đun khác để giải quyết hành vi mới này. Nếu phương thức gọi mong muốn thoát khỏi Unicode dựa trên hành vi runtime trước đó, bạn phải thêm mã vào hàm trả về để thoát Unicode theo cách thủ công hoặc điều chỉnh phương thức gọi để xử lý kết quả trả về Unicode.
Xử lý tiện ích mở rộng để tắt máy một cách nhẹ nhàng
Giờ đây, các hàm Lambda có phần mở rộng bên ngoài có thể được hưởng lợi từ khả năng tắt máy nhẹ nhàng được cải thiện. Khi dịch vụ Lambda sắp tắt runtime, dịch vụ sẽ gửi tín hiệu SIGTERM đến runtime và sau đó là sự kiện SHUTDOWN tới từng tiện ích mở rộng bên ngoài đã đăng ký.
Những sự kiện này được gửi mỗi khi môi trường thực thi tắt. Điều này cho phép bạn bắt tín hiệu SIGTERM trong hàm Lambda và dọn sạch các tài nguyên, chẳng hạn như các kết nối cơ sở dữ liệu do hàm này tạo ra.
Để tìm hiểu thêm về vòng đời của môi trường thực thi Lambda, hãy xem Môi trường thực thi Lambda . Thông tin chi tiết và ví dụ khác về cách sử dụng tính năng tắt máy nhẹ nhàng với tiện ích mở rộng có sẵn trong kho lưu trữ AWS Samples GitHub .
Các tính năng mới của Python
Hiểu nội tuyến
Với việc triển khai PEP 709 , việc hiểu từ điển, danh sách và tập hợp hiện đã được đưa vào nội tuyến. Các phiên bản trước tạo ra một chức năng sử dụng một lần để thực hiện những hiểu biết đó. Việc loại bỏ chi phí này sẽ giúp việc thực thi hiểu nhanh hơn theo hệ số hai.
Có một số thay đổi về hành vi đối với khả năng hiểu do bản cập nhật này. Ví dụ: lệnh gọi hàm ‘locals()’ từ trong phạm vi hiểu hiện bao gồm các đối tượng từ phạm vi chứa, không chỉ trong chính phạm vi hiểu như trong các phiên bản trước. Bạn nên kiểm tra các hàm bạn đang di chuyển từ phiên bản Python cũ hơn sang Python 3.12.
Thay đổi cách gõ
Python 3.12 tiếp tục phát triển việc đưa các chú thích kiểu vào Python. PEP 695 bao gồm một cú pháp mới, nhỏ gọn hơn cho các lớp và hàm chung, đồng thời thêm câu lệnh “loại” mới để cho phép tạo bí danh loại. Bí danh loại được đánh giá theo yêu cầu. Điều này cho phép các bí danh tham chiếu đến các loại khác được xác định sau.
Các tham số loại hiển thị trong phạm vi khai báo và bất kỳ phạm vi lồng nhau nào, nhưng không hiển thị ở phạm vi bên ngoài.
Chính thức hóa chuỗi f
Một trong những thay đổi lớn nhất trong Python 3.12, việc chính thức hóa cú pháp chuỗi f, được đề cập trong PEP 701 . Giờ đây, bất kỳ biểu thức hợp lệ nào cũng có thể được chứa trong một chuỗi f, bao gồm cả các chuỗi f khác.
Trong các phiên bản trước của Python, việc sử dụng lại dấu ngoặc kép trong chuỗi f sẽ dẫn đến lỗi. Với Python 3.12, việc sử dụng lại trích dẫn được hỗ trợ đầy đủ trong các chuỗi f lồng nhau, chẳng hạn như ví dụ sau:
>>>songs = [‘Take me back to Eden’, ‘Alkaline’, ‘Ascensionism’]
>>>f”This is the playlist: {“, “.join(songs)}”
‘This is the playlist: Take me back to Eden, Alkaline, Ascensionism’
Ngoài ra, mọi biểu thức Python hợp lệ đều có thể được chứa trong chuỗi f. Điều này bao gồm các biểu thức nhiều dòng và khả năng nhúng nhận xét trong chuỗi f.
Trước Python 3.12, ký tự “\” không được phép trong chuỗi f. Điều này đã ngăn cản việc sử dụng cú pháp “\N” để xác định các ký tự Unicode thoát trong phần nội dung của chuỗi f.
Cải tiến Asyncio
Có một số cải tiến đối với mô-đun asyncio. Chúng bao gồm các cải tiến về hiệu suất đối với việc ghi ổ cắm và triển khai asyncio.current_task() mới có thể mang lại cải thiện hiệu suất gấp 4–6 lần. Các vòng lặp sự kiện hiện đã tối ưu hóa trình theo dõi con cho môi trường cơ bản của chúng.
Sử dụng Python 3.12 trong Lambda
Bảng điều khiển quản lý AWS
Để sử dụng runtime Python 3.12 nhằm phát triển các hàm Lambda, hãy chỉ định giá trị tham số runtime Python 3.12 khi tạo hoặc cập nhật một hàm. Phiên bản Python 3.12 hiện có sẵn trong danh sách thả xuống runtime trên trang Tạo hàm :
Để cập nhật hàm Lambda hiện có lên Python 3.12, hãy điều hướng đến hàm trong bảng điều khiển Lambda và chọn Chỉnh sửa trong bảng Cài đặt runtime . Phiên bản mới của Python có sẵn trong danh sách thả xuống runtime :
Hình ảnh vùng chứa AWS Lambda
Thay đổi phiên bản hình ảnh cơ sở Python bằng cách sửa đổi câu lệnh FROM trong Dockerfile của bạn:
Docker
FROM public.ecr.aws/lambda/python:3.12
# Copy function code
COPY lambda_handler.py ${LAMBDA_TASK_ROOT}
Khách hàng chạy hình ảnh Docker Python 3.12 cục bộ, bao gồm cả khách hàng sử dụng AWS SAM, phải nâng cấp bản cài đặt Docker lên phiên bản 20.10.10 trở lên.
Mô hình ứng dụng phi máy chủ AWS (AWS SAM)
Trong AWS SAM đặt thuộc tính Runtime thành python3.12 để sử dụng phiên bản này.
YAML
AWSTemplateFormatVersion: ‘2010-09-09’
Transform: AWS::Serverless-2016-10-31
Description: Simple Lambda Function
MyFunction:
Type: AWS::Serverless::Function
Properties:
Description: My Python Lambda Function
CodeUri: my_function/
Handler: lambda_function.lambda_handler
Runtime: python3.12
AWS SAM hỗ trợ tạo mẫu này bằng Python 3.12 cho các ứng dụng serverless mới bằng lệnh `sam init`. Tham khảo tài liệu AWS SAM .
Bộ công cụ phát triển đám mây AWS (AWS CDK)
Trong AWS CDK , đặt thuộc tính runtime để Runtime.PYTHON_3_12sử dụng phiên bản này. Trong Python CDK:
Python
from constructs import Construct
from aws_cdk import ( App, Stack, aws_lambda as _lambda )
class SampleLambdaStack(Stack):
def __init__(self, scope: Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
base_lambda = _lambda.Function(self, ‘SampleLambda’,
handler=’lambda_handler.handler’, runtime=_lambda.Runtime.PYTHON_3_12, code=_lambda.Code.from_asset(‘lambda’))
Trong TypeScript CDK:
Typescript
import * as cdk from ‘aws-cdk-lib’;
import * as lambda from ‘aws-cdk-lib/aws-lambda’
import * as path from ‘path’;
import { Construct } from ‘constructs’;
export class CdkStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here
// The python3.12 enabled Lambda Function
const lambdaFunction = new lambda.Function(this, ‘python311LambdaFunction’, {
runtime: lambda.Runtime.PYTHON_3_12,
memorySize: 512,
code: lambda.Code.fromAsset(path.join(__dirname, ‘/../lambda’)),
handler: ‘lambda_handler.handler’
})
}
}
Phần kết luận
Lambda hiện hỗ trợ Python 3.12. Bản phát hành này sử dụng Hệ điều hành Amazon Linux 2023, hỗ trợ phản hồi Unicode và tắt nhẹ nhàng các chức năng có tiện ích mở rộng bên ngoài cũng như các tính năng ngôn ngữ Python 3.12.
Bạn có thể xây dựng và triển khai các hàm bằng Python 3.12 bằng Bảng điều khiển quản lý AWS , AWS CLI , AWS SDK , AWS SAM , AWS CDK hoặc công cụ Cơ sở hạ tầng dưới dạng mã (IaC) mà bạn chọn. Bạn cũng có thể sử dụng hình ảnh cơ sở vùng chứa Python 3.12 nếu bạn muốn xây dựng và triển khai các hàm của mình bằng hình ảnh vùng chứa.
Hỗ trợ runtime Python 3.12 giúp các nhà phát triển xây dựng các ứng dụng serverless hiệu quả hơn, mạnh mẽ hơn và có khả năng mở rộng hơn. Hãy dùng thử runtime Python 3.12 trong Lambda ngay hôm nay và trải nghiệm những lợi ích của phiên bản ngôn ngữ cập nhật này.
Để biết thêm tài nguyên học tập không có máy chủ, hãy truy cập Serverless Land .