SSM Parameter Store
SSM Parameter Store là một dịch vụ lưu trữ an toàn cho cấu hình và bí mật trong hệ thống AWS. Nó cung cấp khả năng mã hóa dữ liệu lưu trữ thông qua KMS để đảm bảo tính bảo mật của thông tin. SSM Parameter Store không yêu cầu máy chủ và được thiết kế để có khả năng mở rộng, độ bền cao, dễ sử dụng thông qua SDK. Phiên bản của các thông tin được lưu trữ trong SSM Parameter Store được theo dõi và quản lý để có thể phục hồi lại bất kỳ phiên bản nào. Bảo mật của Parameter Store được thực hiện thông qua IAM để kiểm soát quyền truy cập và sử dụng dữ liệu. SSM Parameter Store còn cung cấp các tính năng như thông báo với Amazon EventBridge và tích hợp với CloudFormation để quản lý các thông tin của Parameter Store như một tài nguyên được quản lý.
SSM Parameter Store Hierarchy
Đây là một ví dụ về cấu trúc thư mục của SSM Parameter Store. Thư mục gốc là “/”. Trong ví dụ này, có hai phòng ban: “my-department” và “other-department”. Phòng ban “my-department” có hai ứng dụng: “my-app” và “other-app”. Mỗi ứng dụng có hai môi trường: “dev” và “prod”. Trong mỗi môi trường, có hai tham số: “db-url” và “db-password”.
Ngoài ra, trong ví dụ này còn có hai tham số đặc biệt:
- “/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager”: đây là tham số sử dụng để lấy giá trị của một bí mật trong Secrets Manager.
- “/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2”: đây là tham số sử dụng để lấy ID của AMI (Amazon Machine Image) của hệ điều hành Amazon Linux phiên bản mới nhất.
Standard and advanced parameter tiers
SSM Parameter Store cung cấp hai tùy chọn cho khách hàng khi lưu trữ thông tin đó là standard và advanced parameter tiers.
- Standard tier: là dịch vụ miễn phí cung cấp khả năng lưu trữ lên đến 10,000 thông tin (parameter) mỗi tháng. Mỗi thông tin có thể lưu trữ lên đến 4KB dữ liệu. Nếu khách hàng sử dụng nhiều hơn 10,000 thông tin hoặc mỗi thông tin có dung lượng lớn hơn 4KB thì sẽ bị tính phí.
- Advanced tier: là dịch vụ tính phí cho phép khách hàng lưu trữ và quản lý số lượng lớn các thông tin, đồng thời cung cấp nhiều tính năng bảo mật và quản lý hơn so với standard tier. Mỗi thông tin trong advanced tier có thể lưu trữ lên đến 8KB dữ liệu. Ngoài ra, advanced tier cũng cung cấp tính năng versioning, audit logging và khả năng kiểm soát quyền truy cập thông qua IAM. Giá cả của dịch vụ advanced tier phụ thuộc vào số lượng thông tin được lưu trữ và tần suất truy cập vào các thông tin đó.
Parameters Policies (for advanced parameters)
Parameters Policies là tính năng của SSM Parameter Store cho phép đặt các chính sách (policies) trên các advanced parameters để quản lý các thông tin nhạy cảm như mật khẩu, khóa truy cập, chứng chỉ SSL,… Với Parameters Policies, bạn có thể thiết lập thời gian sống (TTL) của một thông số cụ thể, tức là đặt ngày hết hạn cho thông tin đó. Khi đến ngày hết hạn, thông tin sẽ tự động được cập nhật hoặc xóa để đảm bảo an toàn thông tin. Bên cạnh đó, Parameters Policies còn cho phép gán nhiều chính sách cho một parameter cùng lúc để quản lý đa dạng các thông tin nhạy cảm.
Đoạn json dưới là một JSON object, và được sử dụng để thiết lập chính sách hết hạn cho một tham số trong AWS Systems Manager Parameter Store.
Cụ thể, nó định nghĩa một loại chính sách (Type) là Expiration, có phiên bản (Version) là 1.0, và bao gồm một thuộc tính (Attributes) là một timestamp (Timestamp) cho biết thời điểm khi tham số sẽ hết hạn.
Khi được áp dụng cho một tham số, chính sách này sẽ đảm bảo rằng tham số đó sẽ tự động bị xóa hoặc cập nhật vào thời điểm được chỉ định, tuân theo quy định của chính sách hết hạn được thiết lập.
Expiration (to delete a parameter)
Ví dụ dưới là một mẫu thông báo hết hạn cho các thông số của SSM Parameter Store. Cụ thể:
- “Type”: “ExpirationNotification” – đây là kiểu thông báo hết hạn, cho biết rằng đây là một thông báo để cảnh báo về việc sắp hết hạn.
- “Version”:”1.0″ – phiên bản của thông báo
- “Attributes”: – thuộc tính của thông báo, bao gồm:
- “Before”:”15″ – số lượng đơn vị thời gian trước khi thông báo hết hạn sẽ được gửi (ở đây là 15 đơn vị).
- “Unit”: “Days” – đơn vị thời gian sẽ được sử dụng (ở đây là ngày). Tùy thuộc vào tình huống, có thể sử dụng đơn vị thời gian khác như giờ, tuần, tháng,…
ExpirationNotification (EventBridge)
Đoạn này là một cấu trúc JSON mô tả một chính sách parameter, được đặt tên là “NoChangeNotification”. Các thuộc tính bao gồm:
- Type: loại chính sách, ở đây là “NoChangeNotification” để chỉ định rằng không có thông báo nào được gửi khi giá trị của parameter không thay đổi.
- Version: phiên bản của chính sách, ở đây là “1.0”.
- Attributes: các thuộc tính bổ sung của chính sách. Ở đây, chúng ta có hai thuộc tính:
- After: chỉ định thời gian đợi trước khi không gửi thông báo cho các giá trị parameter không thay đổi. Trong trường hợp này, nó là 20 ngày.
- Unit: chỉ định đơn vị thời gian của thuộc tính After, ở đây là ngày.
NoChangeNotification (EventBridge)
SSM Parameter Store Hands On (CLI)
Bạn vào AWS Systems Manager › Parameter store › Create parameter đặt tên cho nó. Bạn sẽ gặp các tham số sau:
- Parameter type: string: Đây là kiểu dữ liệu cho các thông số cấu hình được lưu trữ trong AWS SSM Parameter Store. Giá trị của thông số cấu hình có thể là bất kỳ chuỗi nào.
- Parameter type: stringlist: Đây là kiểu dữ liệu cho các thông số cấu hình là một danh sách các chuỗi. Ví dụ: danh sách các URL.
- Parameter type: SecureString: Đây là kiểu dữ liệu cho các thông số cấu hình chứa các giá trị nhạy cảm như mật khẩu hoặc khóa. Giá trị được lưu trữ dưới dạng mã hóa và chỉ có thể truy xuất thông qua các API AWS SSM hỗ trợ giải mã giá trị.
- Value: Đây là giá trị của một thông số cấu hình được lưu trữ trong AWS SSM Parameter Store.
Chúng ta sẽ có 1 Parameter store đầu tiên.
Tiếp tục mình sẽ tạo /my-app/dev/db-password.
Tiếp theo là /my-app/prod/db-url.
Và cuối cùng là /my-app/prod/db-password.
Bạn sẽ có các Parameters như dưới.
Sáu đây chúng ta sẽ demo các Parameters bằng CLI bằng cách chạy lệnh sau:
aws ssm get-parameters -names /my-app/dev/db-url /my-app/dev/db-password
Đoạn lệnh trên là câu lệnh trong AWS Command Line Interface (CLI) để lấy thông tin các tham số trong AWS System Manager Parameter Store. Cụ thể là lấy thông tin của hai tham số: /my-app/dev/db-url
và /my-app/dev/db-password
.
Khi chạy lệnh này, AWS CLI sẽ gửi yêu cầu lấy thông tin các tham số tương ứng đến AWS System Manager Parameter Store, và trả về kết quả dưới dạng JSON. Trong JSON này, thông tin của từng tham số được lưu trữ dưới dạng các key-value pairs, bao gồm:
Name
: Tên của tham sốType
: Loại của tham số, có thể làString
,StringList
,SecureString
Value
: Giá trị của tham số (nếu tham số là kiểuString
hoặcSecureString
)Version
: Phiên bản của tham sốLastModifiedDate
: Thời điểm tham số được sửa đổi lần cuốiARN
: Amazon Resource Name của tham số
Nếu tham số là kiểu SecureString
, giá trị của nó sẽ được mã hóa và chỉ có thể xem được khi sử dụng option --with-decryption
.
Kết quả trả về là thông tin của hai thông số. Cụ thể:
- “/my-app/dev/db-url”: là một thông số kiểu “String” và có giá trị là “dev.database.stephanetheteacher.com:3306”.
- “/my-app/dev/db-password”: là một thông số kiểu “SecureString” và có giá trị là một chuỗi ký tự được mã hóa bảo mật.
Cả hai thông số đều có phiên bản số 1 và được lưu trữ ở khu vực EU-West-3 của tài khoản AWS có ID là 387124123361.
aws ssm get-parameters -names /my-app/dev/db-url /my-app/dev/db-password--with-defryption
Đoạn lệnh này có tác dụng gọi tới dịch vụ AWS Systems Manager Parameter Store và yêu cầu lấy thông tin các tham số có tên /my-app/dev/db-url
và /my-app/dev/db-password--with-defryption
. Tham số /my-app/dev/db-url
có kiểu dữ liệu là String
và giá trị là dev.database.stephanetheteacher.com:3306
, trong khi tham số /my-app/dev/db-password--with-defryption
có kiểu dữ liệu là SecureString
và giá trị là chuỗi được mã hóa bảo mật. Thêm vào đó, tùy chọn --with-defryption
được sử dụng để yêu cầu giải mã giá trị của tham số kiểu SecureString
.
Kết quả trả về bao gồm:
- Giá trị của parameter có tên là
/my-app/dev/db-password
, loại làSecureString
, giá trị làthisisthedevpassword
, phiên bản là 1, ngày chỉnh sửa cuối cùng là 1538992096.483 và ARN làarn:aws:ssm:eu-west-3:387124123361:parameter/my-app/dev/db-password
. - Giá trị của parameter có tên là
/my-app/dev/db-url
, loại làString
, giá trị làdev.database. stephanetheteacher.com:3306
, phiên bản là 1, ngày chỉnh sửa cuối cùng là 1538991987.623 và ARN làarn:aws:ssm:eu-west-3:387124123361:parameter/my-app/dev/db-url
. InvalidParameters
là một mảng rỗng, không có parameter nào bị lỗi.- Các tham số được truy vấn đều được lấy ra, tuy nhiên, trong tham số
/my-app/dev/db-password-with-defryption
, thông sốWithDecryption
của lệnhget-parameters
đã được sử dụng để giải mã giá trịSecureString
.
Lệnh aws ssm get-parameters-by-path -path /my-app/dev/
được sử dụng để lấy các thông tin về tất cả các tham số được lưu trữ trong Parameter Store của AWS Systems Manager (SSM) bắt đầu với tiền tố /my-app/dev/
.
Điều này cho phép bạn lấy danh sách các tham số và giá trị của chúng dựa trên đường dẫn chung. Ví dụ, nếu bạn có nhiều hơn một tham số trong Parameter Store, thì việc sử dụng lệnh này sẽ giúp bạn dễ dàng quản lý và tìm kiếm các tham số liên quan đến ứng dụng của bạn.
Kết quả trả về bao gồm hai parameters:
- /my-app/dev/db-password: Là một SecureString parameter chứa giá trị được mã hóa của mật khẩu để truy cập vào database.
- /my-app/dev/db-url: Là một String parameter chứa địa chỉ và cổng của database.
Mỗi parameter được định nghĩa bao gồm các thuộc tính như tên (Name), kiểu dữ liệu (Type), giá trị (Value), phiên bản (Version), thời gian chỉnh sửa cuối cùng (LastModifiedDate) và ARN (Amazon Resource Name) của parameter. ARN là một chuỗi định danh duy nhất để xác định một resource trong AWS.
Lệnh AWS SSM “get-parameters-by-path” được sử dụng để lấy thông tin của tất cả các tham số theo đường dẫn được chỉ định bắt đầu từ đường dẫn được cung cấp và các thư mục con của nó (nếu có). Thông tin bao gồm tên, giá trị và các thuộc tính khác của các tham số. Cờ “–recursive” được sử dụng để yêu cầu lấy thông tin của tất cả các tham số trong đường dẫn, bao gồm các tham số trong các thư mục con của đường dẫn.
aws ssm get-parameters-by-path -path /my-app/ --recursive
SSM Parameter Store Hands On (AWS Lambda)
Đầu tiên bạn hãy tạo 1 hàm Lambda bằng cách vào Create function.
Mình sẽ tạo hàm tên hello-world-ssm sử dụng tuỳ chọn là Author from scratch.
Thông báo “Successfully created the function hello-world-ssm. You can now change its code and configuration…. cho biết bạn đã tạo hàm Lambda thành công.
Mình sửa lại nội dung code như dưới. Đoạn code này là một ví dụ về hàm Lambda trên AWS, được viết bằng Python, sử dụng Boto3 để giao tiếp với AWS Systems Manager (SSM). Hàm này lấy giá trị của hai thông số (parameters) trong SSM và in chúng ra màn hình. Các thông số đó là “/my-app/dev/db-url” và “/my-app/dev/db-password”. Sau khi in các giá trị này ra màn hình, hàm trả về một chuỗi “worked!”.
Bấm vào Save bạn sẽ nhận được bảng cài đặt Configure test event như dưới, hãy đặt tên cho nó và bấm Create.
Hãy bấm test nhé.
Bạn sẽ nhận được thông báo lỗi có nội dung tựa tựa như dưới. Đây là một thông báo lỗi mà hệ thống AWS trả về khi người dùng không có đủ quyền truy cập vào tài nguyên đó.
Chúng ta sẽ cấp quyền cho nó bằng cách vào Roles và tìm đến role hello-world-ssm-role-zc820.
Nhấn vào nó ta được bảng dưới, bấm vào Add Inline policy.
Tìm service có tên Systems Manager và tại phần Read bạn nhấp vào đó.
Chọn 2 tuỳ chọn GetParameters, GetParametersByPath.
Tiếp theo bạn kéo xuống phần dưới, bấm You chose actions that recoire the parameter resource type.
Tại Resources chọn Specific và tại parameter chọn Add ARN.
Phần Region và Account để chọn tất cả, còn phần Fully qualified parameter name mình chỉ đến parameter có tên my-app.
Sau khi config xong, bấm vào Review policy.
Đặt tên policy và bấm Create policy.
Bạn sẽ có 1 chính sách mới như dưới.
Bây giờ bạn có thể bấm vào test và bạn sẽ có kết quả.
Bây giờ chúng ta chỉnh sửa lại nội dung code như sau. Đây là một đoạn code Python trong AWS Lambda Function để lấy giá trị của hai tham số được lưu trữ trong AWS System Manager Parameter Store.
Đầu tiên, đoạn code sử dụng module boto3 để tạo một client của SSM (System Manager) service trong AWS, với khu vực (region) là “eu-west-3”.
Tiếp theo, trong hàm lambda_handler, đoạn code sử dụng phương thức get_parameters() của client SSM để lấy giá trị của hai tham số là “/my-app/dev/db-url” và “/my-app/dev/db-password”. Tham số đầu vào của phương thức này là một danh sách tên tham số (Names), và mặc định phương thức chỉ trả về giá trị của các tham số có kiểu dữ liệu là “String”.
Sau đó, đoạn code sử dụng hàm print để in ra giá trị của hai tham số được lấy về. Để lấy giá trị của tham số có kiểu dữ liệu là “SecureString”, ta cần thiết lập tham số WithDecryption=True khi gọi phương thức get_parameters().
Cuối cùng, hàm lambda_handler trả về chuỗi “worked!”.
Thông báo dưới cho ta biết lỗi “AccessDeniedException” xảy ra khi gọi thực hiện hoạt động “GetParameters”. Lỗi này có thể do ciphertext (dữ liệu mã hóa) đề cập đến một khóa chính khách hàng không tồn tại, không tồn tại trong khu vực này hoặc bạn không được phép truy cập. Lỗi này có mã trạng thái 400 và mã lỗi “AccessDeniedException” và yêu cầu ID là “671-afc8-4c79-a213-9b3197f9aa6a”. Lỗi này có thể liên quan đến việc không đủ quyền truy cập hoặc không đúng quyền truy cập được cấp cho người dùng hoặc vai trò của họ.
Chúng ta cần thêm chính sách mới cho lỗi ở trên, hãy bấm vào Add inline policy.
Chọn Service là KMS và tích vào Write và chọn Decrypt.
Tiếp tục bấm vào You chose actions that require the key resource type.
Chúng ta lấy key id của IAM của tutorial.
Dán nó vào Key id như dưới, phần Region và Account lựa chọn là any.
Đặt tên cho chính sách và bấm Create policy.
Bạn sẽ có 1 chính sách mới như dưới.
Quay lại hàm Lambda và bấm vào test.
Bạn nhận được kết quả như dưới.
Chúng ta tiếp tục chỉnh sửa xíu về đoạn code, đoạn code này sử dụng AWS SDK để truy vấn các giá trị của thông số lưu trữ được quản lý bởi AWS Systems Manager Parameter Store. Trong đó, thông số “db-url” và “db-password” của ứng dụng “my-app” được truy vấn theo môi trường là “dev” hoặc “prod”, được lấy từ biến môi trường “DEV_OR_PROD”. Nếu thông số “db-password” được truy vấn thành công, giá trị được giải mã vì đã được lưu trữ dưới dạng SecureString. Kết quả cuối cùng là xuất ra console là “worked!”.
Bây giờ kéo xuống dưới phần Environment variables, chúng ta sẽ nhập key là DEV OR PROD và value là dev.
Kết quả khi bấm test chúng ta nhận được kết quả trả về của dev.
Tương tự nếu chúng ta chỉnh value thành prod.
Chúng ta sẽ nhận được kết quả là thông tin của prod.