bởi Eric Johnson | ngày 05 tháng 9 2023 | trong AWS Lambda, AWS Serverless Application Model, Serverless | Permalink | Share
Trong tháng 9/2022, AWS công bố preview công khai của AWS Serverless Application Model (AWS SAM) hỗ trợ cho HashiCorp Terraform. Bảng preview công khai giới thiệu một loạt tính năng giúp người dùng Terraform kiểm tra các ứng dụng serverless một cách cục bộ. Hôm nay, AWS thông báo có sẵn rộng rãi của việc hỗ trợ Terraform trong AWS SAM. GA này phát hành mở rộng tính năng của AWS SAM để tăng cường phát triển nội bộ cho các ứng dụng serverless.
Terraform và AWS SAM đều là các framework mã nguồn mở cho phép nhà phát triển định nghĩa hạ tầng dạng mã (IaC). Các nhà phát triển có thể phiên bản và chia sẻ các định nghĩa về cơ sở hạ tầng giống như cách họ chia sẻ code. Tuy nhiên, vì AWS SAM được thiết kế riêng cho serverless nên nó bao gồm giao diện dòng lệnh (CLI) được thiết kế để phát triển serverless. CLI cho phép các nhà phát triển tạo, gỡ lỗi và triển khai các ứng dụng serverless bằng trình mô phỏng cục bộ cùng với các công cụ xây dựng và triển khai. Trong bản phát hành này, AWS SAM cũng đang tạo một tập hợp con các công cụ đó cho người dùng Terraform.
Hỗ trợ Terraform
Bài blog preview công khai này chứng tỏ hỗ trợ ban đầu cho Terraform. Blog này trình bày bộ tính năng mở rộng của AWS SAM dành cho hoạt động phát triển cục bộ. Blog cũng đơn giản hóa việc triển khai bằng cách sử dụng các mô-đun Serverless.tf cho các hàm và layer AWS Lambda thay vì các tài nguyên Terraform gốc.
Các mô-đun có thể xây dựng các cấu phần phần mềm triển khai cho các hàm và lớp Lambda. Ngoài ra, mô-đun này còn tự động tạo metadata theo yêu cầu của AWS SAM để giao tiếp với tài nguyên Terraform. Để sử dụng tài nguyên Terraform gốc, hãy tham khảo preview blog để biết cấu hình siêu dữ liệu.
Tải source code
Để khám phá AWS SAM hôc trợ cho Terraform, ghé aws-sam-terraform-examples repository. Sao chép repository và thay đổi thư mục ga để bắt đầu:
| git clone https://github.com/aws-samples/aws-sam-terraform-examples cd ga |
Trong thư mục này có hai ứng dụng demo. Cả hai ứng dụng đều giống hệt nhau ngoại trừ api_gateway_v1 sử dụng API REST của Amazon API Gateway (v1) và api_gateway_v2 sử dụng API HTTP của Amazon API Gateway (v2). Chọn một và thay đổi thư mục tf-resources trong thư mục đó.
| cd api_gateway_v1/tf-resources |
Trừ khi có quy định khác, các ví dụ trong bài đăng này đề cập đến ứng dụng api_gateway_v1.
Cáu trúc code
Terraform hỗ trợ trải rộng IaC trên nhiều tệp. Do đó, các nhà phát triển thường thu thập tất cả các tệp Terraform trong một thư mục duy nhất và giữ các tệp tài nguyên ở nơi khác. Các ứng dụng ví dụ được cấu hình theo cách này.
Mọi lệnh Terraform hoặc AWS SAM đều phải chạy từ vị trí của tệp main.tf, trong trường hợp này là thư mục tf-resources. Vì các lệnh AWS SAM thường được chạy từ thư mục gốc của dự án nên AWS SAM có lệnh hỗ trợ các cấu trúc lồng nhau. Nếu chạy lệnh sam build từ một thư mục lồng nhau, hãy chuyển cờ terraform-project-root-path bằng đường dẫn tương đối hoặc tuyệt đối đến thư mục gốc của dự án.
Thực thi nội bộ
Phiên bản preview của Terraform đã hỗ trợ lệnh gọi cục bộ nhưng nhóm đã đơn giản hóa trải nghiệm bằng cách hỗ trợ Serverless.tf. Các ứng dụng trình diễn có hai chức năng trong đó. Hàm phản hồi là phần tích hợp cho API Gateway endpoint và hàm Auth là trình ủy quyền tùy chỉnh. TÌm các định nghĩa cả 2 mô-đun trong tệp functions.tf.
Hàm phản hồi
| module “lambda_function_responder” { source = “terraform-aws-modules/lambda/aws” version = “~> 6.0” timeout = 300 source_path = “${path.module}/src/responder/” function_name = “responder” handler = “app.open_handler” runtime = “python3.9” create_sam_metadata = true publish = true allowed_triggers = { APIGatewayAny = { service = “apigateway” source_arn = “${aws_api_gateway_rest_api.api.execution_arn}/*/*” } } } |
Có hai thông số quan trọng:
- source_path, trỏ đến một thư mục cục bộ. Vì đây không phải là tệp zip nên Serverless.tf sẽ xây dựng các artifact nếu cần.
- create_sam_data, tạo ra metadata cần thiết cho AWS SAM để định vị các tệp và mô-đun cần thiết.
Để gọi hàm cục bộ, hãy chạy các lệnh sau:
- Chạy bản dựng để chạy bất kỳ tập lệnh bản dựng nào
sam build –hook-name terraform –terraform-project-root-path ../
- Chạy lệnh gọi cục bộ để gọi hàm Lambda mong muốn
| sam local invoke –hook-name terraform –terraform-project-root-path ../’module.lambda_function_responder.aws_lambda_function.this[0]’ |
Vì dự án là Terraform nên cần phải có tham số hook-name với giá trị terraform để cho AWS SAM biết cách tiến hành. Tên hàm là sự kết hợp giữa tên mô-đun và loại tài nguyên mà nó trở thành. Nếu bạn không chắc chắn về tên, hãy chạy lệnh không có tên:
| sam local invoke –hook-name terraform |
AWS SAM đánh giá mẫu. Nếu chỉ có một hàm, AWS SAM sẽ tiến hành gọi hàm đó. Nếu có nhiều hơn một, như trường hợp ở đây, AWS SAM sẽ hỏi bạn cái nào và cung cấp danh sách các tùy chọn.
Hàm Auth
Hàm ủy quyền yêu cầu một số dữ liệu đầu vào dưới dạng sự kiện mô phỏng. Để tạo một sự kiện mô phỏng cho dự án api_gateway_v1:
| sam local generate-event apigateway authorizer |
Đối với dự án api_gateway_v2, hãy sử dụng:
| sam local generate-event apigateway request-authorizer |
Các sự kiện kết quả là khác nhau vì API Gateway REST và API HTTP có thể xử lý các trình ủy quyền tùy chỉnh khác nhau. Trong các ví dụ này, REST sử dụng token authorizer tiêu chuẩn và trả về AWS Identity and Access Management (IAM) thích hợp. Ví dụ HTTP API dùng một tùy chọn simple pass or fail.
Mỗi ví dụ đều có sẵn sự kiện được định dạng phù hợp để thử nghiệm tại events/auth.json. Để gọi hàm Auth, hãy chạy như sau:
| sam local invoke –hook-name terraform ‘module.lambda_function_auth.aws_lambda_function.this[0]’ -e events/auth.json |
Không cần phải chạy lại lệnh sam build vì ứng dụng không có gì thay đổi.
Start-api nội bộ
Giờ đây, bạn có thể mô phỏng phiên bản cục bộ của API Gateway với bản phát hành có sẵn rộng rãi. Mỗi ví dụ này có hai endpoint. Một endpoint được mở và một người ủy quyền tùy chỉnh sẽ bảo vệ endpoint kia.Cả hai đều trả về cùng một phản hồi:
| { “message”: “Hello TF World”, “location”: “ip address” } |
Để khởi động trình mô phỏng cục bộ, hãy chạy như sau:
| sam local start-api -hook-name terraform |
AWS SAM khởi động trình mô phỏng và hiển thị hai endpoint để thử nghiệm cục bộ.
Mở endpoint
Dùng curl, kiểm tra endpoint đã mở:
| curl –location http://localhost:3000/open |
Trình mô phỏng cục bộ xử lý yêu cầu và cung cấp phản hồi trong cửa sổ terminal. Trình mô phỏng cũng bao gồm log từ hàm Lambda.
Auth endpoint
Kiểm tra endpoint an toàn và chuyển tiêu đề bắt buộc bổ sung, myheader:
| curl -v –location http://localhost:3000/secure –header ‘myheader: 123456789’ |
Điểm cuối trả về phản hồi được ủy quyền với thông báo “Hello TF World”. Hãy thử lại điểm cuối với giá trị tiêu đề không hợp lệ:
| curl –location http://localhost:3000/secure –header ‘myheader: IamInvalid’ |
Điểm cuối trả về một phản hồi không được xác thực.
Các thông số
Có một số tùy chọn khi sử dụng AWS SAM với Terraform:
- Hook-name: bắt buộc đối với mọi lệnh khi làm việc với Terraform. Điều này thông báo cho AWS SAM rằng dự án là một ứng dụng Terraform.
- Skip-prepare-infra: AWS SAM sử dụng lệnh terraform plan để xác định và xử lý tất cả các tạo phẩm cần thiết. Tuy nhiên, nó chỉ nên chạy khi tài nguyên mới được thêm hoặc sửa đổi. Tùy chọn này ngăn AWS SAM chạy lệnh terraform plan. Nếu cờ này được thông qua và kế hoạch không tồn tại, AWS SAM sẽ bỏ qua cờ này và vẫn chạy lệnh terraform plan.
- Prepare-infra: buộc AWS SAM chạy lệnh terraform plan.
- Terraform-project-root-path: ghi đè thư mục hiện tại làm thư mục gốc của dự án. Bạn có thể sử dụng đường dẫn tuyệt đối (/path/to/project/root) hoặc đường dẫn tương đối (../ hoặc ../../).
- Terraform-plan-file: cho phép nhà phát triển chỉ định một tệp kế hoạch Terraform cụ thể. Lệnh này cũng cho phép người dùng Terraform sử dụng các lệnh cục bộ.
Kết hợp các tùy chọn này có thể tạo ra các lệnh dài:
| sam build –hook-name terraform –terraform-project-root-path ../ |
Hoặc
| sam local invoke -hook-name terraform -skip-prepare-infra ‘module.lambda_function_responder.aws_lambda_function.this[0]’ |
Bạn có thể sử dụng tệp samconfig để đặt mặc định, rút ngắn lệnh và tối ưu hóa quá trình phát triển. Sử dụng hỗ trợ samconfig YAML mới, tệp trông như thế này:
| version: 0.1 default: global: parameters: hook_name: terraform skip_prepare_infra: true build: parameters: terraform_project_root_path: ../ |
Bằng cách đặt các giá trị mặc định này, lệnh giờ đây ngắn hơn:
| sam local invoke ‘module.lambda_function_responder.aws_lambda_function.this[0]’ |
AWS SAM biết đây là dự án Terraform và bỏ qua nhiệm vụ chuẩn bị trừ khi thiếu kế hoạch Terraform. Nếu cần làm mới gói, hãy thêm cờ –prepare-infra để ghi đè cài đặt mặc định.
Triển khai và gỡ lỗi từ xa
Các ứng dụng trong các dự án này là các ứng dụng Terraform thông thường. Triển khai chúng như bất kỳ dự án Terraform nào khác.
| terraform plan terraform apply |
Hiện tại, AWS SAM tăng tốc không hỗ trợ các dự án Terraform. Tuy nhiên, vì Terraform triển khai bằng phương pháp API nên các ứng dụng serverless sẽ triển khai nhanh chóng. Sử dụng xem xét bên thứ ba và lệnh terraform apply –auto-approve để ước tính trải nghiệm này.
Với logging, hãy tận dụng lệnh sam logs. Tham khảo kết quả triển khai của các dự án để biết ví dụ về việc điều chỉnh nhật ký cho một hoặc tất cả các tài nguyên.
Nền tảng đám mây HashiCorp
Nền tảng đám mây HashiCorp cho phép các nhà phát triển triển khai bằng cách sử dụng một vị trí tập trung để duy trì trạng thái và bảo mật. Khi các nhà phát triển chạy các bản dựng trên đám mây, tệp kế hoạch cục bộ sẽ không có sẵn để AWS SAM sử dụng trong quá trình thử nghiệm và gỡ lỗi cục bộ. Tuy nhiên, các nhà phát triển có thể tạo kế hoạch trên đám mây và sử dụng kế hoạch đó cục bộ để phát triển. Để biết hướng dẫn, hãy tham khảo tài liệu.
Kết luận
HashiCorp Terraform là IaC framework phổ biến để xây dựng ứng dụng trên Đám mây AWS. AWS SAM là một IaC framework và CLI được thiết kế đặc biệt để giúp các nhà phát triển xây dựng các ứng dụng serverless.
Blog này đề cập đến tính năng hỗ trợ AWS SAM mới dành cho Terraform và cách các nhà phát triển có thể sử dụng chúng cùng nhau để tối đa hóa trải nghiệm phát triển. Blog này đề cập đến việc gọi cục bộ một hàm duy nhất, mô phỏng cục bộ các điểm cuối API Gateway và thử nghiệm trình ủy quyền Lambda cục bộ trước khi triển khai. Cuối cùng, blog triển khai ứng dụng và sử dụng AWS SAM để giám sát các tài nguyên đã triển khai.
Để biết thêm tài nguyên học tập serverless, hãy truy cập Serverless Land.