Sửa lỗi AWS Lambda 'Runtime.ImportModuleError: No module named requests' Khi Deploy Thiếu Dependencies

beginner☁️ AWS2026-03-26| AWS Lambda, Python 3.8 / 3.9 / 3.10 / 3.11 runtime, triển khai qua AWS Console, AWS CLI, hoặc SAM/Terraform

Error Message

Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'requests'
#lambda#python#layers#triển khai#dependencies

Lỗi Gặp Phải

Bạn triển khai một hàm Lambda, kích hoạt nó, và ngay lập tức thấy thông báo sau trong CloudWatch Logs:

[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'requests'
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 1, in <module>
    import requests

Lambda chạy trong một môi trường thực thi tối giản, không có sẵn các gói của bên thứ ba. Nếu code của bạn gọi import requests, import pandas, hoặc bất kỳ thứ gì nằm ngoài thư viện chuẩn của Python, bạn cần tự đóng gói những thư viện đó. Ngay cả boto3 cũng có phiên bản tích hợp sẵn có thể đã lỗi thời — nếu bạn cần một phiên bản cụ thể, hãy đóng gói nó vào luôn.

Nguyên Nhân Gây Ra Lỗi

Dù bạn tải lên tệp .zip hay dùng trình soạn thảo trực tiếp trên console, Lambda chỉ nhìn thấy những tệp bạn đưa vào một cách tường minh. Không có kết nối nào đến máy tính của bạn. Các gói bạn đã cài bằng pip nằm trong môi trường ảo của bạn — chúng chưa bao giờ được đưa vào gói triển khai, vì vậy Lambda hoàn toàn không biết chúng tồn tại.

Cách Khắc Phục 1 — Đóng Gói Dependencies Vào Gói Triển Khai (Nhanh Nhất)

Giải pháp nhanh nhất: cài đặt các gói trực tiếp vào thư mục dự án, sau đó nén tất cả lại thành một file zip.

Bước 1 — Tạo thư mục dự án sạch

mkdir my_lambda
cd my_lambda

Bước 2 — Cài đặt dependencies vào thư mục dự án

pip install requests -t .

Cờ -t . yêu cầu pip cài đặt vào thư mục hiện tại thay vì môi trường Python toàn cục của bạn. Lặp lại điều này cho mọi gói mà hàm của bạn cần. Với requests==2.31.0, bạn sẽ có khoảng 300KB tệp được đặt ngay vào thư mục đó.

Bước 3 — Thêm tệp hàm của bạn

# lambda_function.py
import requests

def lambda_handler(event, context):
    response = requests.get("https://httpbin.org/get")
    return {
        "statusCode": response.status_code,
        "body": response.text
    }

Bước 4 — Nén tất cả lại

zip -r function.zip .

Lưu ý quan trọng: lambda_function.py phải nằm ở thư mục gốc của file zip, không được nằm trong thư mục con. Lambda tìm kiếm handler ở cấp cao nhất và sẽ không tìm trong các thư mục con.

Bước 5 — Triển khai file zip

aws lambda update-function-code \
  --function-name my-function-name \
  --zip-file fileb://function.zip

Cách Khắc Phục 2 — Sử Dụng Lambda Layer (Tốt Hơn Cho Tái Sử Dụng)

Bạn có năm hàm Lambda đều dùng requestsboto3? Việc đóng gói cùng một bộ thư viện vào năm file zip riêng biệt vừa tốn dung lượng vừa khiến việc cập nhật trở nên phức tạp. Lambda Layer cho phép bạn đóng gói dependencies một lần và gắn vào bất kỳ hàm nào cần — giúp mỗi file zip triển khai gọn nhẹ (đôi khi dưới 10KB) và việc cập nhật dependency được tập trung ở một nơi.

Bước 1 — Tạo cấu trúc thư mục cho layer

Các Python layer phải tuân theo một bố cục thư mục cụ thể. Lambda tìm kiếm các gói trong thư mục python/ — nếu đặt tên khác, Lambda sẽ không tải chúng.

mkdir -p layer/python
pip install requests -t layer/python/

Bước 2 — Nén layer lại

cd layer
zip -r ../requests_layer.zip python/
cd ..

Bước 3 — Publish layer lên AWS

aws lambda publish-layer-version \
  --layer-name requests-layer \
  --zip-file fileb://requests_layer.zip \
  --compatible-runtimes python3.9 python3.10 python3.11

Sao chép LayerVersionArn từ kết quả trả về. Nó có dạng như arn:aws:lambda:us-east-1:123456789012:layer:requests-layer:1 — bạn sẽ cần dùng nó ở bước tiếp theo.

Bước 4 — Gắn layer vào hàm của bạn

aws lambda update-function-configuration \
  --function-name my-function-name \
  --layers arn:aws:lambda:us-east-1:123456789012:layer:requests-layer:1

Thay ARN bạn đã sao chép từ Bước 3 vào đây.

Bước 5 — Triển khai code hàm (không cần đóng gói deps)

# Chỉ nén tệp hàm — không cần đóng gói thư viện
zip function.zip lambda_function.py

aws lambda update-function-code \
  --function-name my-function-name \
  --zip-file fileb://function.zip

Cách Khắc Phục 3 — Sử Dụng AWS SAM hoặc CDK (Cho Pipeline CI/CD)

Đang làm việc trong một dự án nhóm với pipeline triển khai chuyên nghiệp? Bỏ qua việc nén thủ công hoàn toàn. Thêm tệp requirements.txt và SAM sẽ tự động xử lý việc đóng gói dependencies trong quá trình chạy sam build.

# requirements.txt
requests==2.31.0
# template.yaml (phần liên quan)
Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python3.11
      CodeUri: ./src
      Layers: []  # SAM tự động cài từ requirements.txt
sam build
sam deploy

Xác Minh Kết Quả Khắc Phục

Sau khi triển khai, gọi hàm và kiểm tra kết quả trả về:

aws lambda invoke \
  --function-name my-function-name \
  --payload '{}' \
  response.json

cat response.json

Một lần chạy thành công sẽ trả về:

{"statusCode": 200, "body": "{...}"}

Vẫn thấy Runtime.ImportModuleError? Xem trực tiếp log mới nhất:

aws logs tail /aws/lambda/my-function-name --follow

Trước khi triển khai lại, hãy xác nhận rằng gói thực sự đã có trong file zip:

unzip -l function.zip | grep requests

Bạn sẽ thấy requests/__init__.py ở thư mục gốc của archive. Nếu dòng đó không xuất hiện, nghĩa là gói chưa được đưa vào.

Những Lỗi Thường Gặp Khiến Lỗi Cứ Lặp Lại

  • Sai phiên bản Python: Chạy pip install với Python 3.11 nhưng triển khai lên runtime Python 3.9 sẽ làm hỏng các gói có biên dịch như numpy hay cryptography. Hãy đảm bảo phiên bản Python trên máy bạn khớp chính xác với runtime Lambda.
  • Cài vào thư mục sai: Chạy pip install requests mà không có -t . sẽ cài các gói vào Python hệ thống của bạn, không phải thư mục dự án. Chúng sẽ không được đưa vào file zip.
  • Cấu trúc zip bị lồng: Nén từ thư mục cha sẽ tạo ra cấu trúc như my_lambda/lambda_function.py. Lambda không thể tìm thấy handler theo cách đó. Hãy luôn cd vào thư mục dự án trước khi nén.
  • Tên thư mục layer không đúng: Các gói Python trong layer phải nằm trong thư mục python/ bên trong file zip. Dùng tên thư mục khác và Lambda sẽ âm thầm bỏ qua toàn bộ layer.
  • Quên gắn layer: Publish một layer không tự động kết nối nó với bất kỳ hàm nào. Bước update-function-configuration --layers là bắt buộc — dễ bỏ sót, khó phát hiện.
  • Wheel dành riêng cho nền tảng: Các gói có phần mở rộng C (như numpy hay Pillow) phải được biên dịch cho Amazon Linux 2. Hãy build chúng bên trong Docker container tương ứng: docker run --rm -v $(pwd):/var/task public.ecr.aws/lambda/python:3.11 pip install requests -t /var/task/

Tóm Tắt Nhanh — Nên Dùng Cách Nào

  • Một hàm duy nhất, dependencies đơn giản: Đóng gói bằng pip install -t . và nén lại.
  • Nhiều hàm dùng chung dependencies: Dùng Lambda Layer.
  • Dự án nhóm có CI/CD: Dùng SAM hoặc CDK với requirements.txt.
  • Gói lớn hoặc có biên dịch (numpy, pandas, Pillow): Build bằng Docker khớp với runtime Lambda.

Related Error Notes