Làm cách nào để gỡ lỗi nhanh chóng và hiệu quả các mẫu CloudFormation?


82

CloudFormation là một lời đề nghị AWS mạnh mẽ cho phép việc tạo ra chương trình của ngăn xếp nguồn AWS, chẳng hạn như các tầng web của một ứng dụng, một cụm máy tính hiệu suất cao, hoặc một ứng dụng toàn bộ stack, với một cuộc gọi API duy nhất. Nó là vô cùng mạnh mẽ. Sử dụng nó chắc chắn được coi là một phương pháp AWS tốt, đặc biệt khi nó được kết hợp với Chef, Puppet hoặc cloud-init. Gỡ lỗi nó đẩy tôi đến phó.

Lấy ví dụ về sản xuất: Các mẫu cụm mongodb cổ phiếu sẽ không hoạt động với tôi. Tôi đặc biệt không biết tại sao. Tôi chắc rằng nó là một cái gì đó đơn giản như nó hầu như luôn luôn như vậy. Vấn đề của tôi không phải là tôi không thể tìm ra điều gì sai. Đó là việc ngăn xếp mất từ ​​20 đến 30 phút để không thành công, và sau đó ba hoặc bốn phút nữa để xóa, giả sử nó xóa các tài nguyên đúng cách.

Tôi đang thiếu gì? Tôi biết về --disable-rollbacklá cờ và sử dụng nó như bình dưỡng khí. Từ lâu, tôi đã học cách gói các thông điệp thoát cfn-signalvà ném chúng như dằn tàu khỏi một con tàu đang chìm. Làm cách nào tôi có thể làm cho quá trình gỡ lỗi mẫu nhanh hơn hoặc tôi mãi mãi không nhận ra lỗi của mình nửa giờ sau khi tôi mắc phải?


3
Ngay cả lỗi chính tả trong JSON đôi khi cũng không mắc phải cho đến hơn 10 phút trong quá trình xây dựng vì nó không nhận thấy rằng một loại tài nguyên cụ thể không có tên thuộc tính cụ thể cho đến khi nó cố gắng khởi động tài nguyên đó.
Eric Hammond

1
Mục yêu thích của tôi không theo thứ tự cụ thể: khi bạn chuyển đổi bối cảnh tài nguyên và gặp phải các thuộc tính gần như nhưng không hoàn toàn giống nhau, quên thêm dấu ngoặc kép bên trong khai báo tập lệnh người dùng và bất kỳ điều gì liên quan đến VolumeAttachments, vì chúng đôi khi không thành công không có lý do gì cả.
Christopher

1
1 đề cập đến "vô hiệu hóa tính năng tự động rollback" - điều này thật tuyệt vời để nhận các thông báo lỗi tốt hơn cho substacks
izikandrw

1
Tôi nhận thấy rằng những sai lầm trong các phân đoạn chính sách sẽ khiến những thứ như BucketPolicy bị mắc kẹt trong giai đoạn CREATE mãi mãi - nếu điều gì đó gặp khó khăn trong CREATE, hãy bắt đầu từ đó.
Eric Nord

Câu trả lời:


46

Sử dụng aws cloudformation validate-templatelệnh trong công cụ AWS CLI. Nó chỉ xác thực xem mẫu của bạn là JSON hay YAML hợp lệ, chứ không phải liệu các khóa và giá trị của bạn có chính xác hay không (ví dụ: không kiểm tra lỗi chính tả trong khóa)


1
Điều này cũng có sẵn trong cli docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
mp3foley

7
Nhân tiện, điều này nằm aws cloudformation validate-templatetrong các công cụ AWS CLI mới.
Christopher

8
Đối với bất kỳ ai gặp câu hỏi này trong năm 2017+, đây là bây giờ aws cloudformation validate-templatevà nó chỉ xác thực xem mẫu của bạn là JSON hay YAML hợp lệ, chứ không phải liệu các khóa và giá trị của bạn có chính xác hay không (ví dụ: không kiểm tra lỗi chính tả trong khóa).
Daniel Kats

1
Vì một số lý do, nó dường như bỏ qua độ dài dòng, ví dụ Property validation failure: [Length of value {XYZ} for property {/RepositoryDescription} is greater than maximum allowed length {100}]. Theo validate-templatelệnh, đây không phải là vấn đề, nhưng giao diện người dùng trả về lỗi này.
030

2
Nếu công cụ này chỉ xác thực định dạng tệp thì không; jsonlint hoặc yamllint đủ đủ? Ngoài ra, công cụ này có giới hạn về kích thước tệp là 51.200 byte.
Siva Senthil

23

Một tùy chọn khác, một năm sau đó, là trừu tượng hóa các mẫu này sang thư viện của bên thứ 3, chẳng hạn như tầng đối lưu . Thư viện đó xây dựng tải trọng JSON cho bạn và thực hiện rất nhiều xác thực trong suốt quá trình. Điều này cũng giải quyết vấn đề "Wow quản lý tệp JSON 1000 dòng chắc chắn là điều đáng buồn" .


3
"Wow quản lý một tệp JSON 1000 dòng chắc thật là buồn" - chắc chắn đây là lý do tại sao các ngăn xếp lồng nhau được tạo ra? ;-) Mặc dù tôi đồng tình - Troposphere là aws-some!
YFP

10

Làm cách nào tôi có thể làm cho quá trình gỡ lỗi mẫu nhanh hơn hoặc tôi mãi mãi không nhận ra lỗi của mình nửa giờ sau khi tôi mắc phải?

Dưới đây là một số đề xuất thực tiễn tốt nhất, đặc biệt tập trung vào việc cải thiện tốc độ lặp lại của quá trình phát triển mẫu CloudFormation phức tạp:

Sử dụng các công cụ CloudFormation để xác thực các mẫu và ngăn xếp các bản cập nhật

AWS đã nêu những điều này trong tài liệu Các phương pháp hay nhất của riêng mình , vì vậy tôi sẽ không lặp lại chúng:

Mục đích của bước này là bắt lỗi cú pháp hoặc lỗi logic rõ ràng trước khi thực sự thực hiện việc tạo / cập nhật ngăn xếp.

Kiểm tra tài nguyên riêng biệt

Trước khi sử dụng bất kỳ Tài nguyên CloudFormation riêng lẻ nào trong một Ngăn xếp phức tạp, hãy đảm bảo bạn hiểu kỹ toàn bộ mức độ đầy đủ của hành vi tạo / cập nhật / xóa của Tài nguyên đó, bao gồm bất kỳ giới hạn nào về việc sử dụng và thời gian khởi động / gỡ bỏ điển hình, bằng cách kiểm tra hành vi của chúng trong các Ngăn xếp độc lập, nhỏ hơn Đầu tiên.

  • Nếu bạn đang phát triển hoặc sử dụng bất kỳ Tài nguyên tùy chỉnh nào của bên thứ ba, hãy viết các bài kiểm tra đơn vị bằng cách sử dụng các thư viện thích hợp cho nền tảng ngôn ngữ, để đảm bảo logic ứng dụng hoạt động như mong đợi trong tất cả các trường hợp sử dụng.
  • Lưu ý rằng lượng thời gian để một Tài nguyên riêng lẻ tạo / cập nhật / xóa có thể rất khác nhau giữa các Loại tài nguyên, tùy thuộc vào hành vi của các lệnh gọi API cơ bản. Ví dụ: một AWS::CloudFront::Distributiontài nguyên phức tạp đôi khi có thể mất 30-60 phút để tạo / cập nhật / xóa, trong khiAWS::EC2::SecurityGroup cập nhật chỉ trong vài giây.
  • Các Tài nguyên Cá nhân có thể có lỗi / vấn đề / hạn chế trong quá trình triển khai của chúng, điều này dễ dàng hơn nhiều để gỡ lỗi và phát triển các giải pháp thay thế khi được kiểm tra riêng lẻ, thay vì trong một Ngăn xếp lớn hơn nhiều. Hãy ghi nhớ các giới hạn như Giới hạn dịch vụ AWS tùy thuộc vào cài đặt Tài khoản AWS cá nhân của bạn hoặc Khu vực sẵn có của dịch vụ tùy thuộc vào Khu vực mà bạn tạo Ngăn xếp của mình.

Xây dựng các ngăn xếp phức tạp theo từng bước nhỏ

Khi thực hiện tạo / cập nhật Ngăn xếp, lỗi trong bất kỳ Tài nguyên đơn lẻ nào sẽ khiến Ngăn xếp khôi phục toàn bộ tập hợp các thay đổi Tài nguyên, điều này có thể phá hủy các Tài nguyên được tạo thành công khác một cách không cần thiết và mất nhiều thời gian khi xây dựng một ngăn xếp phức tạp với thời gian dài biểu đồ phụ thuộc của các Tài nguyên liên quan.

Giải pháp cho điều này là xây dựng Ngăn xếp của bạn tăng dần theo các lô Cập nhật nhỏ hơn, thêm Tài nguyên một (hoặc một vài) tại một thời điểm. Bằng cách này, nếu / khi lỗi xảy ra trong quá trình tạo / cập nhật tài nguyên, thì việc khôi phục không làm cho toàn bộ tài nguyên của Stack của bạn bị phá hủy, chỉ là tập hợp Tài nguyên được thay đổi trong Bản cập nhật mới nhất.

Theo dõi tiến trình cập nhật ngăn xếp

Đảm bảo Giám sát Tiến độ Cập nhật Ngăn xếp của bạn bằng cách xem các sự kiện của ngăn xếp trong khi tạo / cập nhật được thực hiện. Đây sẽ là điểm khởi đầu để gỡ lỗi các vấn đề khác với các tài nguyên riêng lẻ.


Về CloudFront và phải mất bao lâu, bạn có biết anyway để có ngăn xếp được ở trạng thái hoàn thành, mà không cần chờ đợi, tôi muốn để có được những kết quả đầu ra, nhưng không cần phải chờ đợi cho việc phân phối sẽ được triển khai trong trường hợp của tôi
mcfedr


5

Đến bữa tiệc muộn nhưng tôi cũng có thể nói thêm rằng việc dành một chút thời gian để định cấu hình và tìm hiểu trình soạn thảo của bạn là điều đáng giá. Tôi biết câu trả lời nghe có vẻ cơ bản đến nực cười nhưng hãy thử nó.

Trong trường hợp của tôi, với vim, tôi hoạt động tốt hơn nhiều khi tôi dành một chút thời gian cài đặt các plugin cú pháp json và (cuối cùng) cũng hiểu các kỹ thuật gấp để điều hướng các tệp CF lớn một cách dễ dàng. Giờ đây, tôi đề xuất lỗi chính tả (dấu phẩy ở những nơi không nên mắc phải, v.v.) và tô sáng màu tiết kiệm rất nhiều thời gian mang lại manh mối trực quan rõ ràng.

Điều này có thể giúp giảm thiểu các lỗi cú pháp, nhưng các lỗi logic trong mẫu được sửa tốt hơn bằng các công cụ khác. Hi vọng một ngày không xa sẽ có chế độ "xem trước" trên CF.


1
Không phải là một gợi ý buồn cười chút nào. Tôi không chắc mình có thể viết mã mà không đánh dấu cú pháp.
Christopher

2
có một bản xem trước cho CFN hiển thị tất cả các tài nguyên bạn sắp tạo và nó cũng sẽ cho bạn biết chi phí ngăn xếp của bạn là bao nhiêu. Tôi đang sử dụng Java API, vì vậy tôi không chắc chắn rằng nó có sẵn trên CLI, nhưng cố gắng này: link
iGili

4

Đối với IDE JetBrains (IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion Gogland DataGrip Rider Android Studio), có plugin AWS CloudFormation hỗ trợ kiểm tra sâu các mẫu JSON và YAML CFN


4

Các AWS CloudFormation Linter cung cấp thêm tĩnh phân tích ngoàiaws cloudformation validate-template

Nó sẽ thông báo cho bạn biết loại tài nguyên và loại phiên bản nào không có sẵn ở một số vùng nhất định, xác thực giá trị thuộc tính so với các giá trị được phép, bắt các phụ thuộc tài nguyên vòng tròn, lỗi cú pháp, giới hạn mẫu, v.v.

Ngoài CLI, một trong những cơ chế phổ biến nhất cần nhớ để chạy linter là cài đặt một plugin trình chỉnh sửa như tiện ích mở rộng Visual Studio Code chạy trên mỗi lần lưu tệp

Các cơ chế khác như móc Git cam kết trước được mô tả ở đây

Ảnh chụp màn hình ví dụ về tiện ích mở rộng Visual Studio Code


2

Nếu bạn đang xử lý các máy EC2, thì tôi khuyên bạn nên đăng nhập vào máy EC2 và chỉnh sửa tệp boot.log (/var/log/boot.log trong RHEL6 / Centos). Tệp này được cập nhật với tất cả các hoạt động shell của bạn (các hoạt động như: cài đặt, tải xuống tệp, sao chép tệp, v.v.).

Ngoài ra, hãy sử dụng các trình chỉnh sửa như http://www.jsoneditoronline.org/ để có được bản trình bày TREE cho JSON của bạn. Điều này giúp bạn kiểm tra thứ tự của các phần tử JSON.

Và khi bạn cập nhật tệp, hãy luôn sử dụng các công cụ như http://www.git-tower.com/blog/diff-tools-mac/ hoặc hệ thống kiểm soát phiên bản thực tế để đảm bảo rằng bạn không vô tình thay đổi điều gì đó có thể làm hỏng tập lệnh của bạn.



1

Một tính năng mới gần đây được thêm vào Cloudformation vào tháng 12 vừa qua là việc bổ sung các Loại thông số bổ sung . Các Loại mới này cho phép các mẫu của bạn thực hiện kiểm tra dữ liệu mạnh mẽ hơn và cũng có thể "không nhanh" khi tạo tài nguyên và các ngăn xếp Thông tin đám mây lồng nhau. Bạn cũng có khả năng cung cấp thông báo lỗi tùy chỉnh đẹp hơn mà con người có thể đọc được khi các giá trị không hợp lệ được chuyển bằng cách sử dụng thuộc tính ConstraintDescription mới .

Các kiểu mới đặc biệt hữu ích khi xử lý các tài nguyên VPC khác nhau. Bạn có thể đảm bảo rằng các Tham số cho mẫu của mình là loại chính xác và rõ ràng về việc mong đợi một giá trị duy nhất so với một Danh sách.

Ví dụ:

"Parameters" : {
  "SingleGroup": { "Type": "AWS::EC2::SecurityGroup::Id", ...},
  "GroupList": {"Type": "List<AWS::EC2::SecurityGroup::Id>", ...}
}

1

Vui lòng kiểm tra trình xác thực thông tin đám mây của tôi tại https://pypi.org/project/cloudformation-validator/

Điều này sẽ xác thực lược đồ và sau đó xác thực lại một danh sách các quy tắc và cho phép các quy tắc tùy chỉnh. Tôi cũng cho phép tích hợp dễ dàng với các công cụ triển khai.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.