Bài đăng này được viết bởi Pal Patel, Solutions Architect, và Saud ul Khalid, Sr. Cloud Support Engineer.
Các ứng dụng Serverless thường phụ thuộc vào AWS Systems Manager Parameter Store hoặc AWS Secrets Manager để lưu trữ dữ liệu cấu hình, mật khẩu được mã hóa hoặc chi tiết kết nối cho cơ sở dữ liệu hoặc dịch vụ API.
Trước đây, bạn phải thực hiện cuộc gọi API thời gian chạy đến Parameter Store hoặc AWS Secrets Manager của AWS mỗi khi bạn muốn lấy thông số hoặc bí mật bên trong môi trường thực thi của một hàm AWS Lambda. Điều này bao gồm cấu hình và khởi tạo khách hàng AWS SDK và quản lý khi nào để lưu trữ giá trị trong bộ nhớ để tối ưu hóa thời gian chạy hàm và tránh sự trễ và chi phí không cần thiết.
Phần mở rộng Lambda Parameters và Secrets mới cung cấp bộ nhớ cache tham số và bí mật được quản lý cho các hàm Lambda. Phần mở rộng được phân phối dưới dạng lớp Lambda cung cấp bộ nhớ cache trong bộ nhớ cho tham số và bí mật. Nó cho phép các hàm lưu trữ giá trị thông qua vòng đời thực thi Lambda và cung cấp một cài đặt thời gian sống cấu hình được.
Khi bạn yêu cầu một tham số hoặc bí mật trong mã hàm Lambda của mình, phần mở rộng lấy dữ liệu từ bộ nhớ cache trong bộ nhớ cục bộ, nếu có sẵn. Nếu dữ liệu không có trong bộ nhớ cache hoặc đã lỗi thời, phần mở rộng truy xuất thông số hoặc bí mật được yêu cầu từ dịch vụ tương ứng. Điều này giúp giảm số lượng cuộc gọi API bên ngoài, từ đó cải thiện hiệu suất ứng dụng và giảm chi phí. Bài đăng này cho thấy cách sử dụng phần mở rộng này.
Tổng quan
Sơ đồ sau đây cung cấp một cái nhìn tổng quan về các thành phần liên quan.

Phần mở rộng có thể được thêm vào Lambda mới hoặc hiện có. Nó hoạt động bằng cách mở một điểm cuối HTTP cục bộ đến môi trường Lambda, cung cấp bộ nhớ cache trong bộ nhớ cho các tham số và bí mật. Khi truy xuất một tham số hoặc bí mật, phần mở rộng trước tiên truy vấn cache để tìm mục nhập liên quan. Nếu một mục nhập tồn tại, truy vấn sẽ kiểm tra đã bao lâu kể từ khi mục nhập được đưa vào cache lần đầu tiên và trả lại mục nhập nếu thời gian kể từ đó ít hơn TTL cache được cấu hình. Nếu mục nhập đã lỗi thời, nó sẽ bị vô hiệu hóa và dữ liệu mới sẽ được lấy từ Parameter Store hoặc Secrets Manager.
Phần mở rộng sử dụng cùng quyền thực thi IAM Lambda để truy cập vào Parameter Store và Secrets Manager, do đó, bạn phải đảm bảo rằng chính sách IAM được cấu hình với quyền truy cập phù hợp. Quyền có thể cần thiết cho AWS Key Management Service (AWS KMS) nếu bạn đang sử dụng dịch vụ này. Bạn có thể tìm thấy một chính sách ví dụ trong AWS SAM template của ví dụ.
Ví dụ hướng dẫn
Xem xét một ứng dụng serverless cơ bản với một hàm Lambda kết nối đến dịch vụ Cơ sở dữ liệu Amazon RDS (Amazon RDS). Ứng dụng tải cấu hình được lưu trữ trong Parameter Store và kết nối đến cơ sở dữ liệu. Chuỗi kết nối cơ sở dữ liệu (bao gồm tên người dùng và mật khẩu) được lưu trữ trong Secrets Manager.
Hướng dẫn ví dụ này bao gồm:
- Một hàm Lambda.
- Một ảo hóa Mạng riêng ảo Amazon (VPC).
- Một trường hợp Amazon RDS đa khu vực chạy MySQL.
- Bí mật cơ sở dữ liệu AWS Secrets Manager giữ kết nối cơ sở dữ liệu.
- Tham số Parameter Store của AWS Systems Manager giữ cấu hình ứng dụng.
- Một vai trò IAM AWS Identity and Access Management (IAM) mà hàm Lambda sử dụng.
Hàm Lambda
Mã Python sau đây cho thấy cách lấy các bí mật và tham số sử dụng tiện ích mở rộng.
Python
import pymysql
import urllib3
import os
import json
### Load in Lambda environment variables
port = os.environ[‘PARAMETERS_SECRETS_EXTENSION_HTTP_PORT’]
aws_session_token = os.environ[‘AWS_SESSION_TOKEN’]
env = os.environ[‘ENV’]
app_config_path = os.environ[‘APP_CONFIG_PATH’]
creds_path = os.environ[‘CREDS_PATH’]
full_config_path = ‘/’ + env + ‘/’ + app_config_path
http = urllib3.PoolManager()
Python
### Define function to retrieve values from extension local HTTP server cachce
def retrieve_extension_value(url):
url = (‘http://localhost:’ + port + url)
headers = { “X-Aws-Parameters-Secrets-Token”: os.environ.get(‘AWS_SESSION_TOKEN’) }
response = http.request(“GET”, url, headers=headers)
response = json.loads(response.data)
return response
def lambda_handler(event, context):
### Load Parameter Store values from extension
print(“Loading AWS Systems Manager Parameter Store values from ” + full_config_path)
parameter_url = (‘/systemsmanager/parameters/get/?name=’ + full_config_path)
config_values = retrieve_extension_value(parameter_url)[‘Parameter’][‘Value’]
print(“Found config values: ” + json.dumps(config_values))
### Load Secrets Manager values from extension
print(“Loading AWS Secrets Manager values from ” + creds_path)
secrets_url = (‘/secretsmanager/get?secretId=’ + creds_path)
secret_string = json.loads(retrieve_extension_value(secrets_url)[‘SecretString’])
#print(“Found secret values: ” + json.dumps(secret_string))
rds_host = secret_string[‘host’]
rds_db_name = secret_string[‘dbname’]
rds_username = secret_string[‘username’]
rds_password = secret_string[‘password’]
### Connect to RDS MySQL database
try:
conn = pymysql.connect(host=rds_host, user=rds_username, passwd=rds_password, db=rds_db_name, connect_timeout=5)
except:
raise Exception(“An error occurred when connecting to the database!”)
return “DemoApp sucessfully loaded config ” + config_values + ” and connected to RDS database ” + rds_db_name + “!”
Ở phạm vi toàn cầu, biến môi trường PARAMETERS_SECRETS_EXTENSION_HTTP_PORT được lấy, đó xác định cổng mà máy chủ HTTP của tiện ích mở rộng đang chạy trên. Giá trị mặc định là 2773.
Hàm retrieve_extension_value gọi máy chủ HTTP cục bộ của tiện ích mở rộng, truyền X-Aws-Parameters-Secrets-Token như một tiêu đề. Đây là một tiêu đề bắt buộc sử dụng giá trị AWS_SESSION_TOKEN, có sẵn trong môi trường thực thi của Lambda theo mặc định.
Mã xử lý Lambda sử dụng bộ nhớ cache mở rộng trong mỗi lần gọi Lambda để lấy dữ liệu cấu hình từ Parameter Store và dữ liệu bí mật từ Secrets Manager. Dữ liệu này được sử dụng để kết nối đến cơ sở dữ liệu RDS MySQL.
Yêu cầu tiên quyết
- Đã cài đặt Git
- Phiên bản AWS SAM CLI 1.58.0 hoặc cao hơn.
Triển khai các tài nguyên
- Sao chép kho lưu trữ và điều hướng đến thư mục giải pháp
Bash
git clone https://github.com/aws-samples/parameters-secrets-lambda-extension-
sample.git
- Xây dựng và triển khai ứng dụng bằng lệnh sau:
Bash
sam build
sam deploy –guided
Template này có các tham số sau:
- pVpcCIDR – Phạm vi địa chỉ IP (dạng CIDR) cho VPC. Giá trị mặc định là 172.31.0.0/16.
- pPublicSubnetCIDR – Phạm vi địa chỉ IP (dạng CIDR) cho subnet công cộng. Giá trị mặc định là 172.31.3.0/24.
- pPrivateSubnetACIDR – Phạm vi địa chỉ IP (dạng CIDR) cho subnet riêng tư A. Giá trị mặc định là 172.31.2.0/24.
- pPrivateSubnetBCIDR – Phạm vi địa chỉ IP (dạng CIDR) cho subnet riêng tư B, mặc định là 172.31.1.0/24.
- pDatabaseName – Tên cơ sở dữ liệu cho môi trường DEV, mặc định là devDB.
- pDatabaseUsername – Tên người dùng cơ sở dữ liệu cho môi trường DEV, mặc định là myadmin.
- pDBEngineVersion – Số phiên bản của động cơ cơ sở dữ liệu SQL sử dụng (mặc định là 5.7).
Thêm phần mở rộng Parameter Store và Secrets Manager Lambda
Để thêm phần mở rộng:
- Truy cập vào bảng điều khiển Lambda và mở hàm Lambda bạn đã tạo.
- Trong bảng Tổng quan chức năng, chọn Lớp, sau đó chọn Thêm lớp.
- Trong bảng Chọn một lớp, giữ giá trị mặc định của lớp AWS và trong danh sách thả xuống chọn Phần mở rộng Lambda Parameters và Secrets của AWS.
- Chọn phiên bản mới nhất có sẵn và chọn Thêm (add).
Phần mở rộng hỗ trợ nhiều tùy chọn có thể cấu hình được thiết lập dưới dạng các biến môi trường Lambda.
Ví dụ này cụ thể thiết lập một cổng mở rộng và giá trị TTL của phần mở rộng:

Kiểm thử ứng dụng ví dụ
Để kiểm thử:
- Truy cập vào hàm được tạo trong bảng điều khiển Lambda và chọn tab Test.
- Đặt tên cho sự kiện kiểm thử, giữ các giá trị mặc định và chọn Create.
- Chọn Test. Hàm chạy thành công.

Để đánh giá hiệu quả về hiệu suất của bộ nhớ đệm tiện ích Lambda extension, đã thực hiện ba bài kiểm tra bằng cách sử dụng công cụ mã nguồn mở Artillery để kiểm thử hàm Lambda. Điều này có thể sử dụng URL của Lambda để gọi hàm. Đoạn mã Artillery cấu hình cho thấy thời gian và số yêu cầu mỗi giây cho kiểm thử:
YAML
config:
target: “https://lambda.us-east-1.amazonaws.com”
phases:
–
duration: 60
arrivalRate: 10
rampTo: 40
scenarios:
–
flow:
–
post:
url: “https://abcdefghijjklmnopqrst.lambda-url.us-east-1.on.aws/“
- Kiểm thử 1: Bộ nhớ cache mở rộng bị tắt bằng cách thiết lập biến môi trường TTL thành 0. Kết quả là có 1650 lệnh API GetParameter được gọi đến Parameter Store trong vòng 60 giây.
- Kiểm thử 2: Bộ nhớ cache mở rộng được bật với TTL là 1 giây. Kết quả là có 106 lệnh API GetParameter được gọi đến Parameter Store trong vòng 60 giây.
- Kiểm thử 3: Bộ nhớ cache mở rộng được bật với giá trị TTL là 300 giây. Kết quả chỉ có 18 lệnh API GetParameter được gọi đến Parameter Store trong vòng 60 giây.
Trong kiểm thử 3, giá trị TTL dài hơn thời gian kiểm thử. 18 lệnh GetParameter tương ứng với số lượng môi trường thực thi Lambda được tạo ra bởi Lambda để chạy các yêu cầu song song. Mỗi môi trường thực thi có bộ nhớ cache trong bộ nhớ và do đó mỗi môi trường cần thực hiện lệnh API GetParameter.
Trong kiểm thử này, việc sử dụng bộ mở rộng đã giảm số lượng lệnh API gọi tới hơn 98%. Số lượng lệnh API giảm dẫn đến thời gian thực thi hàm giảm, và do đó giảm chi phí.
Dọn dẹp
Sau khi bạn đã thử nghiệm ví dụ này, hãy xóa các tài nguyên được tạo bởi mẫu bằng cách sử dụng các lệnh sau từ cùng thư mục dự án để tránh tiếp tục tính phí cho tài khoản của bạn.
Bash
sam delete
Kết luận
Lưu trữ dữ liệu được truy xuất từ các dịch vụ bên ngoài là một cách hiệu quả để cải thiện hiệu suất của chức năng Lambda của bạn và giảm chi phí. Việc thực hiện một lớp lưu trữ cache đã được đơn giản hóa với phần mở rộng Lambda do AWS quản lý này.
Để biết thêm thông tin về Parameter Store, Secrets Manager và Lambda extensions, xem:
- Sử dụng các tham số Parameter Store trong các chức năng AWS Lambda
- Sử dụng các bí mật AWS Secrets Manager trong các chức năng AWS Lambda
- Giới thiệu AWS Lambda Extensions
- Lưu trữ dữ liệu và thiết lập cấu hình bằng các phần mở rộng AWS Lambda
Để biết thêm tài nguyên học tập về serverless, truy cập Serverless Land.