Chọn giải pháp phù hợp cho các tham số bên ngoài của AWS Lambda

Khi sử dụng AWS Lambda để xây dựng các ứng dụng serverless, khách hàng thường cần truy xuất các tham số từ nguồn bên ngoài trong thời gian chạy. Điều này cho phép bạn chia sẻ các giá trị tham số trên nhiều functions hoặc microservices, cung cấp một nguồn xác thực duy nhất cho các bản cập nhật. Một ví dụ phổ biến là truy xuất chi tiết kết nối cơ sở dữ liệu từ một nguồn bên ngoài và sau đó sử dụng tên máy chủ, tên người dùng và mật khẩu đã truy xuất để kết nối với cơ sở dữ liệu:

Hình 1. Hàm Lambda truy xuất thông tin đăng nhập cơ sở dữ liệu từ một nguồn bên ngoài

AWS cung cấp đa dạng tùy chọn để lưu trữ dữ liệu tham số, bao gồm AWS Systems Manager Parameter Store, AWS AppConfig, Amazon S3, và Lambda environment variables. Trong blog này, chúng ta sẽ khám phá các dữ liệu tham số khác nhau mà bạn có thể cần lưu trữ. Tôi cũng sẽ đề cập đến những cân nhắc để chọn giải pháp tham số phù hợp và cách truy xuất và lưu vào bộ nhớ cache dữ liệu tham số một cách hiệu quả trong môi trường thực thi Lambda function.

Các trường hợp sử dụng phổ biến

Các ví dụ tham số phổ biến, bao gồm:

  • Lưu trữ an toàn dữ liệu bí mật, chẳng hạn như thông tin xác thực hoặc khóa API.
  • Chi tiết kết nối cơ sở dữ liệu như tên máy chủ, cổng và thông tin đăng nhập.
  • Dữ liệu lược đồ (ví dụ: phản hồi JSON có cấu trúc).
  • Chứng chỉ TLS để xác thực mTLS hoặc JWT.
  • Mẫu email.
  • Cấu hình người dùng trong hệ thốngchia sẻ đa người dùng
  • Thông tin chi tiết về các tài nguyên AWS bên ngoài để giao tiếp, chẳng hạn như URL hàng đợi  Amazon SQS , tên event bus Amazon EventBridge hoặc ARN của AWS Step Functions ARN.

Các cân nhắc cần lưu ý

Có một số cân nhắc chính khi chọn giải pháp phù hợp cho dữ liệu tham số bên ngoài.

  1. Chi phí – chi phí bao nhiêu để lưu trữ dữ liệu và truy xuất dữ liệu đó thông qua lệnh gọi API?
  2. Bảo mật – cần mã hóa và kiểm soát truy cập chi tiết nào?
  3. Hiệu suất – các yêu cầu về độ trễ truy xuất là gì?
  4. Kích thước dữ liệu – có bao nhiêu dữ liệu để lưu trữ và truy xuất?
  5. Tần suất cập nhật – thông số thay đổi thường xuyên như thế nào và function xử lý các thông số cũ như thế nào?
  6. Phạm vi truy cập – nhiều functions hoặc dịch vụ có truy cập tham số không?

Những cân nhắc này giúp xác định nơi lưu trữ dữ liệu tham số và tần suất truy xuất dữ liệu đó.

Ví dụ:  Với thông số 4KB cập nhật hàng giờ và được sử dụng bởi hàng trăm functions cần được tối ưu hóa để có chi phí truy xuất thấp và hiệu suất cao. Chọn một giải pháp hỗ trợ các yêu cầu API GET chi phí thấp với số lượng giao dịch cao mỗi giây (TPS) sẽ tốt hơn một giải pháp hỗ trợ dữ liệu lớn.

Các lựa chọn dịch vụ AWS

Có một số dịch vụ AWS có sẵn để lưu trữ dữ liệu thông số bên ngoài.

Amazon S3

S3 là dịch vụ lưu trữ đối tượng cung cấp độ bền dữ liệu 99,999999999% (11 9 giây) và khả năng mở rộng hầu như không giới hạn với chi phí thấp. Các đối tượng có thể có kích thước lên đến 5 TB ở bất kỳ định dạng nào, làm cho S3 trở thành một giải pháp tốt để lưu trữ dữ liệu tham số lớn hơn.

Amazon DynamoDB

Amazon DynamoDB là dịch vụ CSDL NoSQL key-value được quản lý hoàn toàn, serverless, được thiết kế cho hiệu suất dưới 10 mili giây ở bất kỳ quy mô nào. Do hiệu suất cao của dịch vụ này, đây là nơi lý tưởng để lưu trữ các thông số khi độ trễ truy xuất thấp là quan trọng.

AWS Secret Manager

AWS Secrets Manager giúp xoay vòng, quản lý và truy xuất dữ liệu bí mật dễ dàng hơn. Điều này làm cho nó trở thành nơi lý tưởng để lưu trữ các thông số nhạy cảm như mật khẩu và khóa API.

AWS Systems Manager Parameter Store

Parameter Store cung cấp một kho lưu trữ tập trung để quản lý dữ liệu cấu hình. Dữ liệu này có thể là văn bản rõ ràng hoặc được mã hóa bằng AWS Key Management Service (KMS). Các thông số có thể được gắn thẻ và tổ chức thành các phân cấp để quản lý đơn giản hơn. Parameter Store là một lựa chọn mặc định tốt cho các tham số mục đích chung trong AWS. Phiên bản tiêu chuẩn (không tính thêm phí) có thể lưu trữ các thông số với dung lượng lên đến 4 KB và phiên bản nâng cao (có tính phí bổ sung) lên đến 8 KB.

Để biết ví dụ về mã sử dụng Parameter Store cho các tham số Lambda, hãy xem mẫu Serverless Land pattern.

AWS AppConfig

AppConfig là một tính năng của AWS Systems Manager nhằm để tạo, quản lý và triển khai nhanh chóng các cấu hình ứng dụng. AppConfig cho phép bạn xác nhận các thay đổi trong quá trình triển khai và tự động quay trở lại, nếu có lỗi. Các chiến lược triển khai AppConfig giúp quản lý các thay đổi cấu hình một cách an toàn.

AppConfig cũng cung cấp một tiện ích Lambda extension để lấy và truy xuất dữ liệu cấu hình bộ đệm cục bộ. Điều này dẫn đến ít lệnh gọi API hơn và giảm thời lượng functions, giảm chi phí.

Biến môi trường AWS Lambda 

Bạn có thể lưu trữ dữ liệu tham số dưới dạng biến môi trường Lambda như một phần của cấu hình phiên bản cụ thể của function. Các biến môi trường Lambda được lưu trữ trong quá trình tạo hoặc cập nhật function. Bạn có thể truy cập các biến này trực tiếp từ mã của mình mà không cần liên hệ với nguồn bên ngoài. Các biến môi trường là lý tưởng cho các giá trị tham số không cần cập nhật thường xuyên và giúp làm cho mã function có thể sử dụng lại trên các môi trường khác nhau. Tuy nhiên, không giống như các tùy chọn khác, các giá trị không thể được truy cập tập trung bởi nhiều functions hoặc dịch vụ.

Vòng đời triển khai Lambda

Vòng đời triển khai Lambda có chứa nhiều giai đoạn mà bạn cần hiểu rõ. Điều này giúp quyết định thời điểm xử lý truy xuất tham số trong mã Lambda của bạn, bao gồm cả quản lý bộ đệm.

Hình 2. Vòng đời triển khai Lambda

Khi một Lambda function được gọi lần đầu tiên hoặc khi Lambda đang mở rộng quy mô để xử lý các yêu cầu bổ sung, một môi trường thực thi sẽ được tạo ra. Giai đoạn đầu tiên trong vòng đời của môi trường thực thi là khởi tạo (Init), trong đó các mã bên ngoài function xử lý chính sẽ chạy. Đây được coi là cold start.

Môi trường thực thi sau đó có thể được sử dụng lại cho các lần gọi tiếp theo. Điều này có nghĩa là giai đoạn Init không cần phải chạy lại và chỉ chạy mã functions của trình xử lý chính. Đây được coi là warm start.

Một môi trường thực thi chỉ có thể chạy một lệnh gọi duy nhất tại một thời điểm. Các lệnh gọi đồng thời yêu cầu môi trường thực thi bổ sung. Khi một môi trường thực thi mới được yêu cầu, điều này sẽ bắt đầu một giai đoạn Init mới, giai đoạn này chạy quá trình cold start.

Bộ nhớ đệm và cập nhật

Truy xuất tham số trong Init

Hình 3. Truy xuất tham số trong Init

Khi môi trường thực thi Lambda được sử dụng lại, bạn có thể cải thiện hiệu suất và giảm chi phí truy xuất tham số bên ngoài bằng cách lưu vào bộ nhớ đệm giá trị. Việc ghi giá trị vào bộ nhớ hoặc hệ thống tệp Lambda / tmp cho phép dữ liệu sẵn sàng trong các lần gọi sau đó trong cùng một môi trường thực thi.

Cách tiếp cận này làm giảm các lệnh gọi API, vì chúng không được thực hiện trong mỗi lần gọi. Tuy nhiên, điều này có thể gây ra một tham số lỗi thời và các giá trị có thể khác nhau trong các môi trường thực thi đồng thời.

Ví dụ Python sau đây cho thấy cách truy xuất giá trị Lưu trữ tham số bên ngoài function xử lý Lambda trong giai đoạn Init

Python

import boto3
ssm = boto3.client('ssm', region_name='eu-west-1')
parameter = ssm.get_parameter(Name='/my/parameter')
def lambda_handler(event, context):
    # My function code...

Truy xuất tham số trên mọi lần thực thi function

Hình 4. Truy xuất tham số trên mỗi lần gọi

Một tùy chọn khác là truy xuất tham số trong mỗi lần gọi bằng cách thực hiện lệnh gọi API bên trong mã trình xử lý. Điều này giúp giá trị luôn được cập nhật, nhưng có thể dẫn đến chi phí truy xuất cao hơn và thời gian function chạy dài hơn do lệnh gọi API được thêm vào trong mỗi lần gọi.

Ví dụ Python sau đây cho thấy cách tiếp cận này:

Python

import boto3
ssm = boto3.client('ssm', region_name='eu-west-1')
def lambda_handler(event, context):
    parameter = ssm.get_parameter(Name='/my/parameter')
    # My function code...

Dùng AWS AppConfig Lambda extension

Hình 5. Dùng AWS AppConfig Lambda extension

AppConfig cho phép bạn truy xuất và lưu trữ các giá trị từ dịch vụ bằng Lambda extension. Tiện ích mở rộng truy xuất các giá trị và cung cấp chúng qua máy chủ HTTP cục bộ. Sau đó, Lambda function sẽ truy vấn máy chủ HTTP cục bộ để tìm giá trị. Tiện ích mở rộng AppConfig làm mới các giá trị trong khoảng thời gian thăm dò có thể định cấu hình, mặc định là 45 giây. Điều này cải thiện hiệu suất và giảm chi phí, vì function chỉ cần thực hiện một cuộc gọi HTTP cục bộ.

Ví dụ mã Python sau đây cho thấy cách truy cập các tham số được lưu trong bộ nhớ cache.

Python

import urllib.request
def lambda_handler(event, context):
    url = f'http://localhost:2772/applications/application_name/environments/environment_name/configurations/configuration_name'
    config = urllib.request.urlopen(url).read()
    # My function code...

Để lưu vào bộ đệm các giá trị bí mật bằng cách sử dụng bộ đệm HTTP cục bộ của tiện ích mở rộng Lambda và Trình quản lý bí mật của AWS, hãy xem tài liệu Hướng dẫn theo quy định của AWS.( AWS Prescriptive Guidance documentation)

Sử dụng Lambda Powertools cho Python hoặc Java

Lambda Powertools cho Python hoặc Lambda Powertools for Java chứa các tiện ích để quản lý bộ nhớ đệm tham số. Bạn có thể định cấu hình khoảng thời gian bộ nhớ cache, mặc định là 5 giây. Các kho thông số được hỗ trợ bao gồm Secrets Manager, AWS Systems Manager Parameter Store, AppConfig và DynamoDB. Bạn cũng có lựa chọn đi cùng với nhà cung cấp của riêng bạn. Ví dụ sau cho thấy tiện ích tham số Powertools cho Python truy xuất một giá trị duy nhất từ Systems Manager Parameter Store.

Python

from aws_lambda_powertools.utilities import parameters
def handler(event, context):
    value = parameters.get_parameter("/my/parameter")
    # My function code...

Bảo mật

Bảo mật thông số là một yếu tố quan trọng cần chú ý. Bạn nên đánh giá việc mã hóa ở trạng thái nghỉ, khi chuyển tiếp, truy cập mạng riêng và các quyền chi tiết cho từng giải pháp tham số bên ngoài dựa trên trường hợp sử dụng.

Tất cả các dịch vụ chính được đề cập trong bài đăng này đều hỗ trợ mã hóa phía máy chủ và bạn có thể chọn sử dụng AWS KMS để quản lý các khóa của riêng mình. Khi truy cập các thông số bằng AWS SDK và các công cụ CLI, các kết nối được mã hóa khi truyền bằng TLS theo mặc định. Bạn có thể buộc hầu hết sử dụng TLS 1.2.

Để truy cập các thông số từ bên trong Amazon Virtual Private Cloud (Amazon VPC) mà không cần truy cập internet, bạn có thể sử dụng AWS PrivateLink và tạo VPC endpoint cho từng dịch vụ. Tất cả các dịch vụ được đề cập trong bài đăng này đều hỗ trợ các kết nối AWS PrivateLink.

Sử dụng chính sách AWS Identity and Access Management (IAM) để quản lý những người dùng hoặc vai trò nào có thể truy cập các thông số cụ thể.

Hướng dẫn chung

Blog này sẽ giúp bạn khám phá một số điều lưu ý cần thực hiện khi sử dụng nguồn bên ngoài cho các tham số Lambda. Giải pháp tốt nhất phụ thuộc vào trường hợp sử dụng. Có một số nguyên tắc chung khi chọn dịch vụ AWS.

  • Đối với các thông số chi phí thấp cho mục đích chung, hãy sử dụng AWS Systems Manager Parameter Store.
  • Đối với một function đơn, các tham số nhỏ, hãy sử dụng các biến môi trường Lambda.
  • Đối với các giá trị bí mật yêu cầu xoay vòng tự động, hãy sử dụng AWS Secrets Manager.
  • Khi bạn cần bộ nhớ đệm được quản lý, hãy sử dụng tiện ích mở rộng AWS AppConfig Lambda hoặc Lambda Powertools cho Python / Java.
  • Đối với các item lớn hơn 400 KB, hãy sử dụng Amazon S3.
  • Khi tần suất truy cập cao và yêu cầu độ trễ thấp, hãy sử dụng Amazon DynamoDB.

Kết luận

Các tham số bên ngoài cung cấp nguồn dữ liệu thống nhất trên các hệ thống phân tán cho phép cập nhật và tái sử dụng mã hiệu quả. Bài đăng trên blog này nêu bật một số lưu ý khi sử dụng các tham số bên ngoài với Lambda để giúp bạn chọn giải pháp thích hợp nhất cho trường hợp sử dụng của mình.

Xem xét cách bạn lưu vào bộ nhớ cache và sử dụng lại các tham số bên trong môi trường thực thi Lambda. Làm điều này một cách chính xác có thể giúp bạn giảm chi phí và cải thiện hiệu suất của các functions Lambda của bạn.

Có một số dịch vụ để lựa chọn để lưu trữ dữ liệu tham số. Chúng bao gồm DynamoDB, S3, Parameter Store, Secrets Manager, AppConfig và các biến môi trường Lambda. Mỗi loại đi kèm với một số ưu điểm, tùy thuộc vào trường hợp sử dụng. Bài blog này, cùng với tài liệu AWS và Services Quotas, có thể giúp bạn chọn dịch vụ thích hợp nhất cho ứng dụng của mình.

Để biết thêm tài liệu học tập serverless, hãy truy cập Serverless Land.


Bài được dịch từ bài viết trên AWS Blogs, bạn có thể xem bài viết gốc tại đây.

Leave a comment