Sử dụng Secrets Manager tương tác với Fargate
Bạn cần phải hoàn thành phần RDS Phase trước khi có thể tiếp tục nội dung dưới đây.
Ở phần này, chúng ta sẽ học cách sử dụng dịch vụ Secrets Manager với AWS Fargate.
AWS Fargate là một compute engine
được sử dụng cho dịch vụ Amazon ECS (Elastic Container Service) cho phép chúng ta khởi tạo các Containers mà không cần phải quản lý các tài nguyên về tính toán hay phải cấu hình các VMs. Đây là một bước tiến giúp chúng ta giảm tải trong việc cân nhắc loại EC2 Instance Type nào là phù hợp để chạy ứng dụng của mình cũng như đưa ra các quyết định về Scaling. Khi đó, chúng ta sẽ tập trung hơn về thiết kế và xây dựng ứng dụng hiện tại.
CloudFormation Template được dùng cho bài thực hành này đã chuẩn bị cho chúng ta các shell scripts cần thiết để xây dựng Docker Image và Amazon ECR (Elastic Container Registry). Bài thực hành sẽ tập trung về Secrets Manager hơn là về Docker, Amazon ECS hay Amazon ECR.
Về mô hình kiến trúc, các tài nguyên AWS được chuẩn bị sẽ có liên kết như sau:
Contents
Truy cập vào Bastion Host với Session Manager
Start Session
.Start Session
.Trước khi chạy các scripts, chúng ta cần đảm bảo tài khoản được sử dụng là ec2-user
.
Tiến hành chuyển qua tài khoản ec2-user
bằng câu lệnh sau:
sudo su - ec2-user
Dựng Docker Image
Chúng ta tiến hành dựng Docker Image bằng shell script dockerbuild.sh
. Đoạn mã này sẽ tiến hành tạo ra Docker Image dựa trên Dockerfile
được chuẩn bị sẵn (bởi CloudFormation).
./dockerbuild.sh
Quá trình dựng Docker Image sẽ mất một vài phút để hoàn thành.
Sau khi quá trình hoàn tất, chúng ta kiểm tra Docker Image có tên với định dạng -ecrre-
bằng câu lệnh sau:
docker images
Sau khi đã xác nhận, chúng ta tiến hành đẩy Docker Image này đến Amazon ECR bằng shell script dockertagandpush.sh
.
./dockertagandpush.sh
Quá trình đẩy Docker Image đến Amazon ECR sẽ mất một vài phút để hoàn thành.
Sau khi quá trình hoàn tất, chúng ta tiến hành cấu hình AWS Fargate dựa trên Amazon ECR.
Để cấu hình AWS Fargate, trước tiên chúng ta cần cấu hình Task Definition.
-ECSCluster-
.-TaskDefinition-
.Create new revision
.Configure via JSON
.SECRETNAME
với Secret mà chúng ta đã tạo ở phần trước.Save
.Create
để tiến hành khởi tạo.Actions
, chọn Run Task
.Launch Type
: FargateCluster VPC
: Chọn VPC đã được chuẩn bị sẵn với CIDR là 10.200.0.0/16
.Subnets
: Chọn tất cả.Security Group
: Chọn tên có định dạng sau -BastionSG-
.Run Task
.Sau khi các Tasks đều ở trạng thái RUNNING, chúng ta tiến hành truy cập đến Fargate Container. Trước hết, chúng ta cần phải ghi chú lại địa chỉ IP address của một Fargate Container.
Từ Bastion Host, tiến hành truy cập vào Fargate Container. Khi bị hỏi mật khẩu, chúng ta sử dụng giá trị EC2UserPassword.
ssh <FARGATE_TASK_PRIVATE_IP>
Ở phần này, chúng ta sẽ sử dụng cách mới thông qua shell script mysql.newway.sh
.
mysql.newway.sh
để truy cập vào RDS Database.
./mysql.newway.sh smdemo
use smdemo;
show tables;
select * from bookinfo;
quit;
Sau khi truy cập thành công vào RDS Database từ Fargate Container, chúng ta cần phải hiểu rõ rằng có nhiều cách để truy cập vào RDS Database, tuy nhiên, phương án nào là bảo mật và phù hợp với ứng dụng của chúng ta mới là điều quan trọng.
Đối với việc truy cập từ Bastion Host, chúng ta thấy được lợi ích khi sử dụng shell script để truy cập vào RDS Database, nếu như chúng ta sử dụng cách thức cũ là hard-coded password
thì sau khi thực hiện quá trình Secret Rotation, cách thức này sẽ không đáp ứng được.
Đối với việc truy cập từ Fargate Container:
Đầu tiên, chúng ta sử dụng Secrets Manager ARN với vai trò là Environment Variable
trong Task Definition, khi đó các Fargate Container có thể dễ dàng biết và thực hiện truy cập đến Secret đã tạo trước đó.
Về phía Docker Image, Dockerfile được sử dụng có vai trò kích hoạt shell script startprocesses.sh
. Đoạn mã này sẽ tiến hành truyền các tham số Environment Variable
vào bên trong Fargate Container.
Khi đó các Fargate Container có thể sử dụng giá trị thu được từ tham số Environment Variable
là TASKDEF_SECRET
để thực hiện truy cập đến RDS Database.
Sau đây là nội dung đoạn mã của startprocesses.sh
.
touch /etc/profile.d/ecs.sh
chmod 644 /etc/profile.d/ecs.sh
env | \
grep "^TASKDEF_" | \
awk -F= '{printf "export %s=%c%s%c\n", $1, 39, $2, 39 }' \
>> /etc/profile.d/ecs.sh
Envionment Variable
được định nghĩa của Fargate Container.Environment Variable
với lệnh sau:env|grep TASKDEF_SECRET
TASKDEF_SECRET={
"username": "<DBUser>",
"password": "<DBPassword>",
"engine": "mysql",
"host": "<RDS_ENDPOINT>",
"port": 3306,
"dbname": "<RDS_DATABASE>",
"dbInstanceIdentifier": "<RDS_ID>"
}