CloudFormation şablonlarında hızlı ve etkili bir şekilde nasıl hata ayıklayabilirim?


83

CloudFormation gibi AWS kaynak yığınlarından programatik oluşturulmasını sağlayan güçlü AWS sunan bir uygulama web katmanı, bir yüksek performanslı işlem kümesinin, ya da , tüm uygulama yığını tek API çağrısıyla. Son derece güçlüdür. Özellikle Chef, Puppet veya cloud-init ile birleştirildiğinde, onu kullanmak kesinlikle iyi bir AWS uygulaması olarak kabul edilir . Hata ayıklamak beni ahlaksızlığa itiyor.

Bir üretim örneğini ele alalım: Stok mongodb küme şablonları benim için çalışmayacak. Nedenini özellikle bilmiyorum. Eminim neredeyse her zaman olduğu gibi basit bir şeydir. Benim sorunum neyin yanlış olduğunu anlayamamak değil. Yığının başarısız olması 20 ila 30 dakika sürüyor ve ardından kaynakları düzgün bir şekilde sildiğini varsayarak silmek için üç veya dört dakika daha alıyor.

Neyi kaçırıyorum? --disable-rollbackBayrağı biliyorum ve onu oksijen gibi kullanıyorum. Uzun zaman önce çıkış mesajlarını sarmayı cfn-signalve batmakta olan bir geminin balastı gibi atmayı öğrendim . Şablon hata ayıklama sürecini nasıl daha hızlı hale getirebilirim, yoksa hatalarımı yaptıktan yarım saat sonra sonsuza dek fark edecek miyim?


3
JSON'daki yazım hataları bile bazen, belirli bir kaynak türünün o kaynağı başlatmaya çalışana kadar belirli bir öznitelik adına sahip olmadığını fark etmediğinden, derleme işleminde 10 dakikadan uzun süre geçene kadar yakalanmaz.
Eric Hammond

1
Benim favorilerim belirli bir sırada değil: kaynak bağlamlarını değiştirdiğinizde ve neredeyse ama tamamen aynı olmayan özniteliklerle karşılaştığınızda, bir kullanıcı komut dosyası bildirimine kaçan bir tırnak işareti eklemeyi unutmak ve VolumeAttachments ile ilgili herhangi bir şey, bazen hiçbir sebep yok.
Christopher

1
"Otomatik geri almanın devre dışı bırakılmasından" bahsettiği için +1 - bu, alt paketler için daha iyi hata mesajları almak için harikaydı
izikandrw

1
Politika segmentlerindeki hataların, BucketPolicy gibi şeylerin sonsuza kadar CREATE aşamasında takılıp kalmasına neden olacağını buldum - eğer CREATE'de bir şey takılı kalırsa, orada başlayın.
Eric Nord

Yanıtlar:


46

aws cloudformation validate-templateAWS CLI aracındaki komutu kullanın . Anahtarlarınızın ve değerlerinizin doğru olup olmadığını değil, yalnızca şablonunuzun geçerli JSON veya YAML olup olmadığını doğrular (örneğin, anahtarlarda yazım hatalarını kontrol etmez)



7
Bu arada, bu aws cloudformation validate-templateyeni AWS CLI araçlarında.
Christopher

8
2017 ve sonrasında bu soruyla karşılaşan herkes için bu artık aws cloudformation validate-templategeçerli ve yalnızca şablonunuzun geçerli JSON veya YAML olup olmadığını doğrular, anahtarlarınızın ve değerlerin doğru olup olmadığını değil (örneğin, anahtarlarda yazım hatalarını kontrol etmez).
Daniel Kats

1
Bazı nedenlerden dolayı satır uzunluğunu göz ardı ediyor gibi görünüyor, örneğin Property validation failure: [Length of value {XYZ} for property {/RepositoryDescription} is greater than maximum allowed length {100}]. validate-templateKomuta göre bu bir sorun değildi, ancak kullanıcı arayüzü bu hatayı döndürüyor.
030

2
Bu araç sadece dosya formatı doğrulaması yapıyorsa; jsonlint veya yamllint yeterli mi? Ayrıca bu araç, 51.200 baytlık dosya boyutu sınırlamasına sahiptir.
Siva Senthil

23

Bir yıl sonra başka bir seçenek, bu şablonları troposfer gibi 3. taraf bir kitaplığa soyutlamaktır . Bu kütüphane JSON yükünü sizin için oluşturur ve yol boyunca pek çok doğrulama yapar. Bu aynı zamanda "1000 satırlık JSON dosyasını yönetmek gerçekten üzücü" sorununu da çözer .


3
"1000 satırlık JSON dosyasını yönetmek gerçekten üzücü" - kesinlikle bu yüzden iç içe yığınlar oluşturuldu? ;-) Yine de hemfikir olsam da - Troposfer harika!
YFP

11

Şablon hata ayıklama sürecini nasıl daha hızlı hale getirebilirim yoksa hatalarımı yaptıktan yarım saat sonra sonsuza dek fark edecek miyim?

Aşağıda, özellikle karmaşık CloudFormation şablonu geliştirmenin yineleme hızını artırmaya odaklanan birkaç en iyi uygulama önerisi verilmiştir:

Şablonları ve yığın güncellemelerini doğrulamak için CloudFormation araçlarını kullanın

AWS bunları kendi En İyi Uygulamalar belgesinde zaten özetledi , bu yüzden bunları tekrar etmeyeceğim:

Bu adımın amacı, gerçekte bir Yığın oluşturma / güncelleme gerçekleştirmeden önce açık sözdizimi veya mantıksal hataları yakalamaktır.

Kaynakları tek tek test edin

Karmaşık bir Yığın içinde herhangi bir bağımsız CloudFormation Kaynağını kullanmadan önce, davranışlarını daha küçük, bağımsız Yığınlarda test ederek, bu Kaynağın kullanım sınırlamaları ve tipik başlatma / sökme süreleri dahil olmak üzere bu Kaynağın oluşturma / güncelleme / silme davranışını tam olarak anladığınızdan emin olun. ilk.

  • Herhangi bir üçüncü taraf Özel Kaynağını geliştiriyor veya kullanıyorsanız, uygulama mantığının tüm kullanım durumlarında beklendiği gibi davrandığından emin olmak için dil platformu için uygun kitaplıkları kullanarak birim testleri yazın.
  • Tek bir Kaynağın yaratma / güncelleme / silme süresinin, temel API çağrılarının davranışına bağlı olarak Kaynak Türleri arasında büyük ölçüde değişebileceğini unutmayın. Örneğin, karmaşık bir AWS::CloudFront::Distributionkaynağın oluşturulması / güncellenmesi / silinmesi bazen 30-60 dakika sürebilirken ,AWS::EC2::SecurityGroup , saniyeler içinde güncelleme olabilir.
  • Bireysel Kaynakların uygulamalarında hatalar / sorunlar / sınırlamalar olabilir; bu, hata ayıklaması ve çok daha büyük bir Yığın içinde test edildiğinde geçici çözümler geliştirmesi çok daha kolaydır. Bireysel AWS Hesabı ayarlarınıza bağlı olarak AWS Hizmet Sınırları veya Yığını oluşturduğunuz Bölgeye bağlı olarak hizmetlerin Bölge Kullanılabilirliği gibi sınırlamaları aklınızda bulundurun .

Küçük artışlarla karmaşık yığınlar oluşturun

Bir Yığın oluşturma / güncelleme gerçekleştirirken, herhangi bir tek Kaynaktaki bir başarısızlık Yığının tüm Kaynak değişiklikleri kümesini geri almasına neden olur, bu da diğer başarıyla oluşturulmuş Kaynakları gereksiz yere yok edebilir ve uzun bir yığınla karmaşık bir yığın oluştururken çok uzun zaman alabilir. ilişkili Kaynakların bağımlılık grafiği.

Bunun çözümü, Yığınınızı artımlı olarak daha küçük Güncelleme grupları halinde oluşturmak ve her seferinde bir (veya birkaç) Kaynak eklemek. Bu şekilde, bir kaynak oluşturma / güncellemede bir hata meydana gelirse / meydana gelirse, geri alma işlemi tüm Yığının kaynaklarının yok edilmesine neden olmaz, yalnızca en son Güncellemede değiştirilen Kaynaklar kümesi.

Yığın güncellemelerinin ilerlemesini izleyin

Bir oluşturma / güncelleme gerçekleştirilirken yığının olaylarını görüntüleyerek Yığın Güncellemenizin İlerlemesini İzlediğinizden emin olun . Bu, tek tek kaynaklarla ilgili diğer sorunları ayıklamak için başlangıç ​​noktası olacaktır.


CloudFront ve ne kadar sürdüğü hakkında, yığının beklemeden tamamlanmış durumda olmasının farkında mısınız, çıktıları almak istiyorum, ancak benim durumumda dağıtımın konuşlandırılmasını beklememe gerek yok
mcfedr

9

Eclipse için AWS Toolkit'te bulunan AWS CloudFormation Şablon Düzenleyicisine baktınız mı? Sözdizimi vurgulama, ifade tamamlama ve AWS CloudFormation'a dağıtım içerir.


7
"AWS Toolkit for Visual Studio" benim için vazgeçilmez oldu.
Ed Norris

5

Partiye geç kaldım ama, editörünüzü yapılandırmak ve öğrenmek için biraz zaman harcamaya değer olduğunu da ekleyebilirim. Bunun bir cevap olarak gülünç derecede basit olduğunu biliyorum ama deneyin.

Benim durumumda, json sözdizimi eklentilerini kurarken biraz zaman ayırdıktan sonra çok daha iyi performans gösterdim ve (sonunda) büyük CF dosyalarında kolayca gezinmek için katlama tekniklerini anladım. Mine artık yazım hatalarını (olmaması gereken yerde virgül vb.) Öneriyor ve renk vurgulama, net görsel ipuçları vererek çok zaman kazandırıyor.

Bu, sözdizimi hatalarının azaltılmasına yardımcı olabilir, ancak şablon içi mantıksal hatalar diğer araçlar tarafından daha iyi düzeltilebilir. Umarım bir gün CF'de bir "ön izleme" modu olur.


1
Hiç de gülünç bir öneri değil. Sözdizimi vurgulamadan kodlayabileceğimden emin değilim.
Christopher

2
CFN için oluşturmak üzere olduğunuz tüm kaynakları gösteren ve ayrıca yığınınızın ne kadara mal olacağını söyleyen bir önizleme var. Java API kullanıyorum, bu yüzden
CLI'de

5

AWS CloudFormation linter ek statik analiz ötesinde, sağlaraws cloudformation validate-template

Belirli bölgelerde hangi kaynak türlerinin ve örnek türlerinin kullanılamayacağını size bildirir, izin verilen değerlere göre özellik değerlerini doğrular, döngüsel kaynak bağımlılıklarını yakalar, söz dizimi hataları, şablon sınırları ve çok daha fazlası

CLI'ye ek olarak, linter'ı çalıştırmayı hatırlamak için en popüler mekanizmalardan biri , her dosya kaydında çalışan Visual Studio Code uzantısı gibi bir düzenleyici eklentisi kurmaktır.

Git kancalarını önceden işleme gibi diğer mekanizmalar burada açıklanmıştır

Visual Studio Code uzantısı örnek ekran görüntüsü


4

JetBrains IDE'leri (IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion Gogland DataGrip Rider Android Studio) için, JSON ve YAML CFN şablonlarının derinlemesine kontrolünü destekleyen AWS CloudFormation eklentisi mevcuttur.


2

EC2 makineleri ile uğraşıyorsanız, EC2 makinesine giriş yapmanızı ve boot.log dosyasını (RHEL6 / Centos'ta /var/log/boot.log) hazırlamanızı tavsiye ederim. Bu dosya, tüm kabuk etkinliklerinizle (yükleme, dosya indirme, dosya kopyalama vb. Etkinlikler) güncellenir.

Ayrıca, JSON'nuzun TREE temsilini almak için http://www.jsoneditoronline.org/ gibi editörleri kullanın . Bu, JSON öğelerinin sırasını kontrol etmenize yardımcı olur.

Dosyaları güncellediğinizde her zaman aşağıdaki gibi araçlar kullanın , komut dosyanızı bozabilecek bir şeyi yanlışlıkla değiştirmediğinizden emin olmak için http://www.git-tower.com/blog/diff-tools-mac/ veya gerçek bir sürüm kontrol sistemi .



1

Geçtiğimiz Aralık ayında Cloudformation'a eklenen yeni bir özellik, ek Parametre Türlerinin eklenmesiydi . Bu yeni Türler, şablonlarınızın daha güçlü veri denetimi yapmasına olanak tanır ve ayrıca kaynaklar ve iç içe geçmiş Cloudformation yığınları oluştururken "hızlı hata yapabilir". Ayrıca, yeni ConstraintDescription özelliği kullanılarak geçersiz değerler iletildiğinde daha güzel, insan tarafından okunabilir özel hata mesajları sağlayabilirsiniz. .

Yeni türler özellikle çeşitli VPC kaynakları ile uğraşırken faydalıdır. Şablonlarınız için Parametrelerin doğru türde olduğundan ve Liste yerine tek bir değer beklemede açık olduğundan emin olabilirsiniz.

Örneğin:

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.