Hướng dẫn run python script in terraform - chạy tập lệnh python trong địa hình

Bao bì và triển khai tập lệnh Python với các phụ thuộc tùy chỉnh là chức năng AWS Lambda với Terraform, không có kịch bản bash hoặc CI

Định nghĩa bài văn

Terraform là một công cụ hoàn hảo để triển khai AWS Lambda và giữ cho trạng thái của nó. Bạn có thể phân chia sự phức tạp của các tập lệnh Python và quá trình phân phối trên ba loại: is a perfect tool for deploying AWS Lambda and keeping it’s state. You can divide the complexity of Python scripts and the process of the delivery on three categories:

  1. một kịch bản nhỏ với các thư viện tiêu chuẩn
  2. một kịch bản nhỏ với các phụ thuộc bên ngoài
  3. Một kịch bản thực sự lớn (tốt, nó đã là ứng dụng, phải không?)

Điểm đầu tiên bạn giải quyết với data.archive_fileresource.aws_lambda_function. Ví dụ, bạn có thể nhận được bài viết này. Cái thứ ba bạn có thể đạt được với quy trình triển khai hỗn hợp nghiêm trọng: Pipelines/hành động GitHub/jenkins/etc + terraform. Nhưng vấn đề lớn nhất là trường hợp thứ hai, khi tập lệnh của bạn có một số thư viện không chuẩn nhưng bạn không muốn xây dựng STARship chỉ để cập nhật đoạn mã của mình.

Cách để giải quyết trường hợp #2

Có một số cách bạn có thể tìm thấy như một giải pháp tốt đẹp:

  • Tải xuống thư viện bằng PIP và đưa chúng vào kho lưu trữ Git của bạn
  • Sử dụng Bash Script để tải xuống các phụ thuộc và bao bì (kiểm tra cái này, cái này và cái này)
  • Vứt bỏ ý tưởng để giữ AWS Lambda của bạn như IAC và cập nhật nó theo cách thủ công (không nên làm điều đó, đọc thêm!)
  • Sử dụng provisioner.local-exec để đóng gói

Xin vui lòng, không giữ .zip hoặc bất kỳ nhị phân nào trong kho Git của bạn! Git không phải là một nền tảng chia sẻ tệp và nó có thể được phiên bản các tệp không phải là văn bản, hãy kiểm tra lời giải thích tốt đẹp này

Terraform Nguồn cung cấp địa phương

Như bạn có thể tìm thấy trong tài liệu chính thức local-exec nên được sử dụng như một giải pháp cuối cùng. Nó là khó chịu, tàn bạo, mãnh liệt nhưng có thể giải quyết các vấn đề với kịch bản trung gian của chúng tôi. Ý tưởng là:

  • cài đặt các phụ thuộc bởi PIP vào thư mục cụ thể
  • Sao chép tập lệnh của bạn vào thư mục này với các phụ thuộc
  • Zip Nội dung thư mục nếu bạn cố gắng thực hiện chỉ bằng provisioner.local-exec, bạn sẽ tìm thấy một vấn đề: archive_file luôn muốn cập nhật zip, ngay cả khi mã hoặc phụ thuộc của bạn không thay đổi! Terraform không thể theo dõi các phụ thuộc rõ ràng như local-exec và bạn nên xây dựng một cây cầu phụ thuộc ngầm có thể bị ràng buộc với archive_file. Hãy xem một triển khai ngắn gọn và một mô -đun nâng cao.

Cấu hình Terraform tích hợp

resource null_resource packaging {
triggers = {
dependencies = join(" ", ["pyfiglet==0.8.post1"])
script_sha1 = sha1(file("~/scripts/files/helloworld.py"))
}
provisioner local-exec {
command = "rm -rf /tmp/python_lambda_package"
}
provisioner local-exec {
command = "mkdir /tmp/python_lambda_package"
}
provisioner local-exec {
command = "pip3 install ${join(" ", ["pyfiglet==0.8.post1"])} --target /tmp/python_lambda_package"
}
provisioner local-exec {
command = "cp ~/scripts/files/helloworld.py /tmp/python_lambda_package/"
}
}
# this resource we need to turn explicit dependencies to implicit
data null_data_source packaging_changes {
inputs = {
null_id = null_resource.packaging.id
package_path = "/tmp/python_lambda_package/package.zip"
}
}
data archive_file package {
type = "zip"
source_dir = "/tmp/python_lambda_package"
output_path = data.null_data_source.packaging_changes.outputs["package_path"]
}

Mô -đun Terraform

Tôi muốn giới thiệu bạn để tạo một mô -đun Terraform cho điều đó, đây là ví dụ và nó thực hiện. Bạn có thể sao chép nó từ GitHub:Github:

Cấu trúc mô -đun:

/tf-aws-lambda-python-with-dependencies/
├── main.tf
├── output.tf
└── vars.tf

Nội dung chính.tf:

đầu ra.tf nội dung

Nội dung vars.tf

Thực hiện mô -đun theo mã Terraform của bạn

Hãy để tôi chỉ cho bạn cách triển khai một kịch bản nhỏ để trình diễn!

module lambda_dep {
source = "git::ssh:///tf-aws-lambda-python-dependencies"
script_path = "${path.module}/files/helloworld.py"
pip_dependencies = ["pyfiglet==0.8.post1"]
}
resource aws_lambda_function test_lambda {
filename = module.lambda_dep.package_path
function_name = "lambda-python-deps"
role = aws_iam_role.lambdas_at_edge.arn
description = "Lambda for testing dependencies"
source_code_hash = module.lambda_dep.package_sha
runtime = "python3.8"
timeout = 120
publish = true
handler = "${module.lambda_dep.handler_file_name}.handler"
}

Kế hoạch Terraform

Terraform áp dụng

Các phụ thuộc tài nguyên Terraform có hoạt động tốt không? Hãy để thử Kế hoạch Terraform một lần nữa!

Hãy để thay đổi kịch bản!

Ngay khi bạn thay đổi tập lệnh hoặc bất kỳ sự phụ thuộc nào, Terraform sẽ thấy các thay đổi và cập nhật tài nguyên với những thay đổi mới nhất.

Màn hình in từ bảng điều khiển chức năng AWS Lambda

Môi trường Lambda

Môi trường chức năng

Lambda thực hiện

Hàm gọi

Sự kết luận

Bây giờ bạn đã biết cách đóng gói các tập lệnh Python của bạn với các phụ thuộc bên ngoài của Terraform mà không có CI phức tạp. Nếu bạn đã tìm thấy bài viết này hữu ích cho bạn - nó thật tuyệt! Happy Terraforming!

Làm cách nào để chạy kịch bản Python trong Terraform?

Bước 1 - Main.tf của bạn cần một định nghĩa tài nguyên như hiển thị bên dưới: (Giả sử bạn đã tạo một thư mục Script có chứa Hello.sh. ....
Bước 2 - Gọi mô -đun từ mô -đun Terraform của bạn "ExecFile" {Source = "../modules/scripts"}.
Bước 3 - Chạy Terraform (sau khi chỉnh sửa cấu hình như được hiển thị ở trên). ....
Summary..

Chúng ta có thể sử dụng Python trong Terraform không?

Cuối cùng, với hỗ trợ CDK, các ngôn ngữ lập trình như Python và TypeScript có thể được sử dụng ngày hôm nay.Hỗ trợ ngôn ngữ bổ sung cho JavaScript, Java và C# có thể được sử dụng trong tương lai.Điều này cho phép Terraform hoạt động như một nền tảng chung để cung cấp cơ sở hạ tầng và quản lý vòng đời.with the CDK support, programming languages such as Python and TypeScript can be used today. Additional language support for Javascript, Java, and C# could be used in the future. This enables Terraform to act as a common platform for infrastructure provisioning and lifecycle management.

Python Terraform là gì?

Python-terraform là một mô-đun Python cung cấp một trình bao bọc của công cụ dòng lệnh Terraform.Terraform là một công cụ được thực hiện bởi Hashicorp, vui lòng tham khảo https://terraform.io/a python module provide a wrapper of terraform command line tool. terraform is a tool made by Hashicorp, please refer to https://terraform.io/

Terraform là gì và nó hoạt động như thế nào?

Terraform là một công cụ IAC, được sử dụng chủ yếu bởi các nhóm DevOps để tự động hóa các nhiệm vụ cơ sở hạ tầng khác nhau.Ví dụ, việc cung cấp tài nguyên đám mây là một trong những trường hợp sử dụng chính của Terraform.Đó là một công cụ cung cấp nguồn mở, không chính đáng được viết bằng ngôn ngữ GO và được tạo bởi Hashicorp.an IAC tool, used primarily by DevOps teams to automate various infrastructure tasks. The provisioning of cloud resources, for instance, is one of the main use cases of Terraform. It's a cloud-agnostic, open-source provisioning tool written in the Go language and created by HashiCorp.