Terraform kullanırken en iyi uygulamalar [kapalı]


111

Altyapımızı terraform haline getirme sürecindeyim. Terraform dosyalarını ve durumu gerçekten yönetmek için en iyi uygulama nedir? Altyapı olarak kod olduğunun farkındayım ve .tf dosyalarımı git'e kaydedeceğim, ancak tfstate'i de taahhüt ediyorum? Bu S3 gibi bir yerde olmalı mı? Eninde sonunda CI'ın tüm bunları yönetmesini istiyorum, ancak bu çok uzadı ve dosyalar için hareketli parçaları bulmamı gerektiriyor.

Gerçekten sadece insanların bu tür şeyleri üretimde nasıl kullandıklarını görmek istiyorum.

Yanıtlar:


85

Ayrıca mevcut AWS altyapısını Terraform'a geçirme durumundayım, bu nedenle geliştirirken yanıtı güncellemeyi hedefleyeceğim.

Emin olmadığım alanları belirlemek için resmi Terraform örneklerine ve çoklu deneme yanılma yöntemlerine büyük ölçüde güveniyorum .

.tfstate Dosyalar

Terraform yapılandırması, her biri farklı bir duruma sahip olabilen farklı altyapı üzerinde birçok kutu sağlamak için kullanılabilir. O da birden fazla kişi tarafından çalıştırılabilir gibi bu durum (S3) gibi merkezi bir konumda olmalı ama değil git'e.

Bu, Terraform'a bakılarak doğrulanabilir .gitignore.

Geliştirici kontrolü

Amacımız, geliştiricilere altyapının daha fazla kontrolünü sağlarken, tam bir denetim (git log) ve değişiklikleri mantıklı kontrol etme yeteneği (çekme istekleri) sağlamaktır. Bunu göz önünde bulundurarak, hedeflediğim yeni altyapı iş akışı:

  1. Yeniden kullanılabilir modüller içeren ortak AMI'lerin temel temeli, örneğin kukla.
  2. Terraform kullanılarak DevOps tarafından sağlanan çekirdek altyapı.
  3. Geliştiriciler, Git'te Terraform yapılandırmasını gerektiği gibi değiştirir (örnek sayısı; yeni VPC; bölge / kullanılabilirlik bölgesi eklenmesi vb.).
  4. Git yapılandırması itildi ve DevOps ekibinin bir üyesi tarafından akıl sağlığının kontrol edilmesi için bir çekme isteği gönderildi.
  5. Onaylanırsa, oluşturmak ve dağıtmak için webhook'u CI'ye çağırır (şu anda birden fazla ortamı nasıl bölümleyeceğinizden emin değilsiniz)

Düzenleme 1 - Mevcut durumda güncelleme

Bu yanıta başladığımdan beri çok fazla TF kodu yazdım ve durumumuzda kendimi daha rahat hissediyorum. Yol boyunca hatalarımız ve kısıtlamalarımız var, ancak bunun yeni, hızla değişen yazılımları kullanmanın bir özelliği olduğunu kabul ediyorum.

Yerleşim

Her biri birden çok alt ağa sahip birden çok VPC içeren karmaşık bir AWS altyapımız var. Bunu kolayca yönetmenin anahtarı, altyapı kodumuzu (hem terraform hem de kukla) düzenlemek için kullanabileceğimiz bölge, çevre, hizmet ve sahibi kapsayan esnek bir sınıflandırma tanımlamaktı.

Modüller

Sonraki adım, terraform modüllerimizi depolamak için tek bir git deposu oluşturmaktı. Modüller için üst düzey dir yapımız şu şekildedir:

tree -L 1 .

Sonuç:

├── README.md
├── aws-asg
├── aws-ec2
├── aws-elb
├── aws-rds
├── aws-sg
├── aws-vpc
└── templates

Her biri bazı aklı başında varsayılanları ayarlar ancak bunları "yapıştırıcımız" tarafından üzerine yazılabilen değişkenler olarak gösterir.

Tutkal

glueYukarıda bahsedilen modülleri kullanan ikinci bir depomuz var . Sınıflandırma belgemiz doğrultusunda düzenlenmiştir:

.
├── README.md
├── clientA
   ├── eu-west-1
      └── dev
   └── us-east-1
       └── dev
├── clientB
   ├── eu-west-1
      ├── dev
      ├── ec2-keys.tf
      ├── prod
      └── terraform.tfstate
   ├── iam.tf
   ├── terraform.tfstate
   └── terraform.tfstate.backup
└── clientC
    ├── eu-west-1
       ├── aws.tf
       ├── dev
       ├── iam-roles.tf
       ├── ec2-keys.tf
       ├── prod
       ├── stg
       └── terraform.tfstate
    └── iam.tf

İstemci düzeyinde .tf, küresel kaynakları (IAM rolleri gibi) sağlayan AWS hesabına özel dosyalarımız var; ikincisi, EC2 SSH genel anahtarlarının bulunduğu bölge düzeyidir; Nihayet bizim ortamda ( dev, stg, prodvs) bizim VPC kurulumları, örnek oluşturma ve vb bağlantıları saklanır bakan bulunmaktadır.

Yan Not: Gördüğünüz gibi terraform.tfstategitte kalmaya ilişkin kendi tavsiyeme karşı çıkıyorum . Bu, S3'e geçene kadar geçici bir önlem ancak şu anda tek geliştirici olduğum için bana uygun.

Sonraki adımlar

Bu hala manuel bir süreç ve henüz Jenkins'te değil, ancak oldukça büyük, karmaşık bir altyapı taşıyoruz ve şimdiye kadar çok iyi. Dediğim gibi, birkaç böcek ama iyi gidiyor!

Edit 2 - Değişiklikler

Bu ilk cevabı yazalı neredeyse bir yıl oldu ve hem Terraform'un hem de benim durumum önemli ölçüde değişti. Şimdi bir Azure kümesini yönetmek için Terraform kullanarak yeni bir konumdayım ve Terraform şimdi v0.10.7.

Durum

İnsanlar sürekli bana devlet gerektiğini söylediler değil Git gitmek - ve doğrudur. Bunu, geliştirici iletişimine ve disiplinine güvenen iki kişilik bir ekiple geçici bir önlem olarak kullandık. Daha büyük, dağıtılmış bir ekiple artık DynamoDB tarafından sağlanan kilitleme ile S3'te uzak durumdan tamamen yararlanıyoruz . İdeal olarak, bu konsolosluğa taşınacaktır, şimdi çapraz bulut sağlayıcılarını kesmek için v1.0'dır.

Modüller

Önceden dahili modüller oluşturup kullandık. Yine de durum bu, ancak Terraform kayıt defterinin gelişi ve büyümesiyle bunları en azından bir temel olarak kullanmaya çalışıyoruz.

Dosya yapısı

Yeni konum, yalnızca iki infx ortamıyla çok daha basit bir sınıflandırmaya sahiptir - devve prod. Her birinin kendi değişkenleri ve çıktıları vardır ve yukarıda oluşturulan modüllerimizi yeniden kullanırız. remote_stateSağlayıcı ayrıca ortamları arasında yaratılan kaynakların çıktılarını paylaşmak yardımcı olur. Senaryomuz, farklı Azure kaynak gruplarındaki alt etki alanlarından genel olarak yönetilen bir TLD'ye yöneliktir.

├── main.tf
├── dev
   ├── main.tf
   ├── output.tf
   └── variables.tf
└── prod
    ├── main.tf
    ├── output.tf
    └── variables.tf

Planlama

Yine, dağıtılmış bir ekibin ekstra zorluklarıyla, artık terraform plankomut çıktımızı her zaman kaydediyoruz . planVe applyaşama arasında bazı değişiklikler riski olmadan neyin çalıştırılacağını inceleyebilir ve bilebiliriz (kilitlemenin buna yardımcı olmasına rağmen). Olasılıkla düz metin "gizli" değişkenler içerebileceğinden bu plan dosyasını silmeyi unutmayın.

Genel olarak Terraform'dan çok memnunuz ve eklenen yeni özelliklerle öğrenmeye ve geliştirmeye devam ediyoruz.


Bu cevaptan bu yana hiç şansınız / sorununuz oldu mu? Seninki yapmak istediğim şeye çok benziyor, ama sen benden daha ileride olabilirsin.
Marc Young

3
Neden tfstate dosyalarının git'te depolanmaması gerektiğini düşündüğünüzü merak ediyorum? Bu sadece eski devletin kurtarmaya değmediği için mi yoksa başka sorunlar var mı?
agbodike

3
@agbodike - Tek bir geliştirici veya çok küçük bir ekibin parçası olarak çalışırken, tfstate, çatışmaları önlemek için düzenli olarak taahhüt edildiği ve zorlandığı sürece git'te tutulabilir. Bir sonraki adımım, bunu S3'teki uzak durum belgelerine göre ayarlamaktır (bu aynı zamanda: "Birleştirme çatışmalarının sık görülen bir kaynağı olduğu için bir ekipte Terraform ile çalışmayı karmaşık hale getirir. Uzak durum bu sorunları hafifletmeye yardımcı olur.") . İyi bir takım iletişim en hafifletmeye yardımcı olabilir gerçi birçok şey olduğu gibi / bütün meselelerin :-) tutma durumuna taktik Irregardless
Ewan

1
@ the0ther - Korkarım ki ana depom tescillidir, ancak şu anda çok yakın gelecekte halka açık hale getireceğim kişisel bir depo üzerinde çalışıyorum.
Ewan

2
Bir Git repo @Ewan'da şansınız var mı? Ne yaptığını görmek isterim.
David

85

Terraform'u yoğun bir şekilde kullanıyoruz ve önerdiğimiz kurulum şu şekildedir:

Dosya düzeni

Her ortamınız için (örn. Aşama, üretim, qa) Terraform kodunu ayrı şablon kümelerinde (ve dolayısıyla ayrı .tfstatedosyalarda) saklamanızı önemle tavsiye ederiz . Bu, değişiklik yaparken ayrı ortamlarınızın gerçekten birbirinden izole olması için önemlidir. Aksi takdirde, sahnelemede bazı kodlarla uğraşırken, prod'da da bir şeyi havaya uçurmak çok kolaydır. Bkz Terraform, VPC ve neden env başına tfstate dosyasını istediğiniz neden renkli bir tartışma için.

Bu nedenle, tipik dosya düzenimiz şuna benzer:

stage
   main.tf
   vars.tf
   outputs.tf
prod
   main.tf
   vars.tf
   outputs.tf
global
   main.tf
   vars.tf
   outputs.tf

Aşama VPC'si için tüm Terraform kodu stageklasöre gider , üretim VPC'si için tüm kodlar prodklasöre gider ve VPC'nin dışında kalan tüm kodlar (örn. IAM kullanıcıları, SNS konuları, S3 kovaları) globalklasöre gider .

Kural olarak, Terraform kodumuzu genellikle 3 dosyaya böldüğümüzü unutmayın:

  • vars.tf: Giriş değişkenleri.
  • outputs.tf: Çıktı değişkenleri.
  • main.tf: Gerçek kaynaklar.

Modüller

Genellikle altyapımızı iki klasörde tanımlarız:

  1. infrastructure-modules: Bu klasör, küçük, yeniden kullanılabilir, sürümleri belirlenmiş modüller içerir. Her modülü, bir VPC veya veritabanı gibi tek bir altyapı parçasının nasıl oluşturulacağına dair bir plan olarak düşünün.
  2. infrastructure-live: Bu klasör, modülleri içinde birleştirerek oluşturduğu gerçek canlı, çalışan altyapıyı içerir infrastructure-modules. Bu klasördeki kodu, planlarınızdan oluşturduğunuz gerçek evler olarak düşünün.

Bir Terraform modülü , bir klasördeki herhangi bir Terraform şablonu kümesidir. Örneğin, tek bir VPC için tüm yönlendirme tablolarını, alt ağları, ağ geçitlerini, ACL'leri vb. Tanımlayan, vpciçinde çağrılan bir klasörümüz olabilir infrastructure-modules:

infrastructure-modules
   vpc
     main.tf
     vars.tf
     outputs.tf

Daha sonra bu modülünü kullanabilirsiniz infrastructure-live/stageve infrastructure-live/prodsahne ve eşya VPCleri oluşturun. Örneğin, infrastructure-live/stage/main.tfşöyle görünebilir:

module "stage_vpc" {
  source = "git::git@github.com:gruntwork-io/module-vpc.git//modules/vpc-app?ref=v0.0.4"

  vpc_name         = "stage"
  aws_region       = "us-east-1"
  num_nat_gateways = 3
  cidr_block       = "10.2.0.0/18"
}

Bir modülü kullanmak için, modulekaynağı kullanırsınız ve sourcealanını ya sabit sürücünüzdeki yerel bir yola (örn. source = "../infrastructure-modules/vpc") Ya da yukarıdaki örnekte olduğu gibi bir Git URL'sine ( modül kaynaklarına bakın ) yönlendirirsiniz. Git URL'sinin avantajı, belirli bir git sha1 veya tag ( ref=v0.0.4) belirtebilmemizdir . Şimdi, altyapımızı bir grup küçük modül olarak tanımlamakla kalmıyor, aynı zamanda bu modülleri versiyonlayabilir ve gerektiğinde dikkatlice güncelleyebilir veya geri alabiliriz.

VPC'ler, Docker kümeleri, veritabanları vb. Oluşturmak için bir dizi yeniden kullanılabilir, test edilmiş ve belgelenmiş Altyapı Paketi oluşturduk ve temelde çoğu yalnızca sürümlü Terraform modülleri.

Durum

Kaynakları oluşturmak için Terraform'u kullandığınızda (örn. EC2 bulut sunucuları, veritabanları, VPC'ler), bir .tfstatedosyada oluşturduğu bilgilerle ilgili bilgileri kaydeder. Bu kaynaklarda değişiklik yapmak için, ekibinizdeki herkesin bu aynı .tfstatedosyaya erişmesi gerekir, ancak onu Git'e GÖNDERMEMELİSİNİZ ( nedeninin açıklaması için buraya bakın ).

Bunun yerine, Terraform'u her çalıştırdığınızda en son dosyaları otomatik olarak itecek / çekecek olan Terraform Remote State'i.tfstate etkinleştirerek dosyaları S3'te depolamanızı öneririz . En son sürümü bir şekilde bozmanız durumunda eski dosyalara geri dönebilmeniz için S3 klasörünüzde sürüm oluşturmayı etkinleştirdiğinizden emin olun .tfstate. Ancak önemli bir not: Terraform kilitleme sağlamaz . Dolayısıyla, iki ekip üyesi terraform applyaynı .tfstatedosya üzerinde aynı anda çalışırsa , birbirlerinin değişikliklerinin üzerine yazabilirler.

Bu sorunu çözmek için, kilitleme sağlamak için Amazon DynamoDB'yi kullanan (çoğu ekip için tamamen ücretsiz olması gerekir) Terraform için ince bir paketleyici olan Terragrunt adlı açık kaynaklı bir araç oluşturduk . Check out Terragrunt ile terraform Otomatik Uzaktan Devlet Kilitleme ve Yapılandırması ekle daha fazla bilgi için.

daha fazla okuma

Terraform'u gerçek dünyada kullanmak için öğrendiğimiz tüm en iyi uygulamaları ayrıntılı olarak açıklayan Kapsamlı Terraform Rehberi adlı bir dizi blog yazısı başlattık .

Güncelleme: Kapsamlı Terraform Rehberi blog yazısı serisi o kadar popüler oldu ki, onu Terraform: Up & Running adlı bir kitaba genişlettik !


Bunun doğru cevap olduğunu düşünüyorum. Modülleri kullanın, versiyonlayın ve ortamları ayrı tutun.
wrangler

Terragrunt veya başka bir sarmalayıcı kullanmıyorsanız, farklı bir terraform bileşeni / ortamı / modülü / her neyse üzerinde çalışmak istediğiniz her seferde uzaktan yapılandırma adımının yeniden çalıştırılması gerekiyor mu?
jmreicha

@jmreicha: remote configTerraform yapılandırmalarınızı yeni kontrol ettiyseniz veya önceki bir uzaktan yapılandırmayı değiştirmek istiyorsanız çalıştırmanız gerekir . Terraform 0.9, backendspek çok şeyi basitleştirecek olan konseptini tanıtacak . Daha fazla ayrıntı için bu PR'a bakın.
Yevgeniy Brikman

Anlayayım diye - bir çevre 'sahnesinde' çalışıyorum ama sonra 'prod' üzerinde çalışmaya başlıyorum. remote configHazır durumuna işaret etmek için komutu yeniden çalıştırmam gerekecek . Ortam başına farklı durum varsayımı. Bu doğru mu? V0.9'u dört gözle bekliyorum.
jmreicha

Aynı .tfdosya kümesini iki farklı ortama dağıtacak olsaydınız, evet, remote configher geçişinizde çalıştırmanız gerekir . Bu açıkça hataya meyillidir, bu yüzden bu tekniği gerçekten kullanmanızı önermiyorum. Bunun yerine, kontrol Bu blog yayınında tavsiye Terraform dosya düzenini birlikte bu blog yayınında Terraform modüllerini nasıl kullanılacağı .
Yevgeniy Brikman

9

Önceden buna remote configizin veriliyordu ancak artık " arka uçlar " ile değiştirildi , bu nedenle uzaktan kumanda artık kullanılamıyor.

terraform remote config -backend-config="bucket=<s3_bucket_to_store_tfstate>" -backend-config="key=terraform.tfstate" -backend=s3
terraform remote pull
terraform apply
terraform remote push

Ayrıntılar için belgelere bakın.


Farklı bir terraform bileşeni / ortamı / modülü / her neyse üzerinde çalışmak istediğiniz her seferde uzak kaynağın yeniden yapılandırılması gerekiyor mu?
jmreicha

6

@Yevgeny Brikman tarafından daha derinlemesine ele alındı, ancak özellikle OP'nin sorularını yanıtlıyor:

Terraform dosyalarını ve durumu gerçekten yönetmek için en iyi uygulama nedir?

TF dosyaları için git kullanın. Ancak Durum dosyalarını kontrol etmeyin (yani tfstate). Bunun yerine Terragruntdurum dosyalarının S3 ile senkronize edilmesi / kilitlenmesi için kullanın .

ama tfstate'i de taahhüt ediyor muyum?

Hayır.

Bu S3 gibi bir yerde olmalı mı?

Evet


2

Burada pek çok cevap olduğunu biliyorum ama benim yaklaşımım oldukça farklı.

   Modules
   Environment management 
   Separation of duties

Modüller

  1. Mantıksal kaynak koleksiyonları için modüller oluşturun. Örnek: Amacınız bir DB, HA VM'leri, otomatik ölçeklendirme, DNS, PubSub ve nesne depolaması gerektiren bir API dağıtmaksa, bu kaynakların tümü tek bir modülde şablonlanmalıdır.
  2. Tek bir kaynak kullanan modüller oluşturmaktan kaçının. Bu yapılabilir ve yapılmıştır ve kayıt defterindeki birçok modül bunu yapar ancak bu, altyapı düzenlemesinden ziyade kaynak erişilebilirliğine yardımcı olan bir uygulamadır. Örnek: AWS EC2 için bir modül, karmaşık yapılandırmaların çağrılmasını daha basit hale getirerek kullanıcının EC2'ye erişmesine yardımcı olur, ancak 1.'deki örnekteki gibi bir modül, kullanıcıya uygulama, bileşen veya hizmet odaklı altyapıyı düzenlerken yardımcı olur.
    1. Çalışma alanınızda kaynak bildirimlerinden kaçının. Bu daha çok kodunuzu düzenli ve düzenli tutmakla ilgilidir. Modüllerin sürümleri kolayca değiştirildiği için sürümleriniz üzerinde daha fazla kontrole sahip olursunuz.

Çevre yönetimi

IaC, SDLC sürecini altyapı yönetimiyle alakalı hale getirdi ve geliştirme altyapısının yanı sıra geliştirme uygulama ortamlarına sahip olmayı beklemek normal değil.

  1. IaC ortamlarınızı yönetmek için klasörler kullanmayın. Altyapınız için ortak bir şablon olmadığı için bu, sürüklenmeye yol açar.
  2. Ortam özelliklerini kontrol etmek için tek bir çalışma alanı ve değişkenler kullanın. Örnek: Modüllerinizi, ortam değişkenini değiştirdiğinizde (var.stage popülerdir) plan, gereksinimlerinize uyacak şekilde değişecek şekilde yazın. Tipik olarak, ortamlar, genellikle değişken konfigürasyonlar olan miktar, maruziyet ve kapasite ile mümkün olduğunca az değişiklik göstermelidir. Dev, özel topolojide 1 çekirdekli 1 VM ve 1 GB RAM dağıtabilir ancak üretim, 2 çekirdekli 3 VM ve ek genel topolojiye sahip 4 GB RAM olabilir. Elbette daha fazla varyasyona sahip olabilirsiniz: dev, maliyetten tasarruf etmek için veritabanı sürecini uygulama ile aynı sunucu üzerinde çalıştırabilir, ancak üretim özel bir DB örneğine sahip olabilir. Tüm bunlar tek bir değişken, üçlü ifadeler ve enterpolasyon değiştirilerek yönetilebilir.

Görevlerinin ayrılması

Küçük bir kuruluştaysanız veya kişisel altyapı çalıştırıyorsanız, bu gerçekten geçerli değildir, ancak operasyonlarınızı yönetmenize yardımcı olacaktır.

  1. Altyapınızı görevlere, sorumluluklara veya ekiplere göre ayırın. Örnek: Paylaşılan hizmetlerin temelini oluşturan merkezi BT kontrolü (sanal ağlar, alt ağlar, genel IP adresleri, günlük grupları, yönetişim kaynakları, çok kiracılı DB'ler, paylaşılan anahtarlar vb.) API ekibi yalnızca hizmetleri için gereken kaynakları (VM'ler, LB'ler) kontrol ederken , PubSub vb.) Ve veri kaynağı ve uzak durum aramaları aracılığıyla Merkezi BT hizmetlerini kullanır.
    1. Ekip erişimini yönetin. Örnek: Merkezi BT'nin yönetici hakları olabilir, ancak API ekibinin yalnızca sınırlı bir genel bulut API kümesine erişimi olabilir.

Bu aynı zamanda, bazı kaynakların nadiren değişirken bazılarının sürekli değiştiğini fark edeceğiniz için serbest bırakma endişelerine yardımcı olur. Ayrılık, riski ve karmaşıklığı ortadan kaldırır.

Bu strateji, AWS'nin çoklu hesap stratejisiyle paralellikler kurar. Daha fazla bilgi için okuyun.

CI / CD

Bu kendi başına bir konudur ancak Terraform iyi bir boru hattında çok iyi çalışır. Buradaki en yaygın hata, CI'yi sihirli bir değnek olarak ele almaktır. Teknik olarak Terraform, altyapıyı yalnızca bir montaj boru hattının aşamalarında hazırlamalıdır. Bu, şablonların tipik olarak doğrulandığı ve test edildiği CI aşamalarında olanlardan ayrı olacaktır.

NB Cep telefonunda yazılmıştır, bu nedenle lütfen hataları affedin.


0

Cevaplar çok sağlam ve bilgilendirici olmadan önce 2 sentimi buraya eklemeye çalışacağım

Kodu yapılandırmak için genel öneriler

  1. Daha az sayıda kaynakla çalışmak daha kolay ve daha hızlıdır:

    • Cmds terraform planve terraformuygulama, kaynakların durumunu doğrulamak için bulut API çağrıları yapın.
    • Tüm altyapınız tek bir kompozisyonda mevcutsa, bu birkaç dakika sürebilir (aynı klasörde birkaç dosyanız olsa bile).
  2. Daha az kaynakla patlama yarıçapı daha küçüktür:

    • İlişkisiz kaynakları birbirinden ayrı kompozisyonlara (klasörlere) yerleştirerek yalıtmak, bir şeyler ters giderse riski azaltır.
  3. Uzak durumu kullanarak projenizi başlatın:

  4. Tutarlı bir yapı ve adlandırma kuralı uygulamaya çalışın:

    • Prosedürel kod gibi, Terraform kodu da insanların önce okuması için yazılmalıdır, tutarlılık bundan altı ay sonra değişiklikler olduğunda yardımcı olacaktır.
    • Kaynakları Terraform durum dosyasında taşımak mümkündür, ancak tutarsız bir yapıya ve adlandırmaya sahipseniz bunu yapmak daha zor olabilir.
  5. Kaynak modüllerini olabildiğince sade tutun.

  6. Yapma koda değişkenler olarak geçirilen veya veri kaynakları kullanarak tespit edilebilir değerler.

  7. dataKaynakları, terraform_remote_stateözellikle de kompozisyon içindeki altyapı modülleri arasında bir yapıştırıcı olarak kullanın .

( ref makale: https://www.terraform-best-practices.com/code-structure )


Misal:

Daha az sayıda kaynakla çalışmak daha kolay ve daha hızlıdır, bu nedenle aşağıda önerilen bir kod düzeni sunuyoruz.

NOT: Her projenin kendine özgü özellikleri olduğundan kesinlikle takip edilmemesi gereken bir referans gibi

.
├── 1_tf-backend #remote AWS S3 + Dynamo Lock tfstate 
   ├── main.tf
   ├── ...
├── 2_secrets
   ├── main.tf
   ├── ...
├── 3_identities
   ├── account.tf
   ├── roles.tf
   ├── group.tf
   ├── users.tf
   ├── ...
├── 4_security
   ├── awscloudtrail.tf
   ├── awsconfig.tf
   ├── awsinspector.tf
   ├── awsguarduty.tf
   ├── awswaf.tf
   └── ...
├── 5_network
   ├── account.tf
   ├── dns_remote_zone_auth.tf
   ├── dns.tf
   ├── network.tf
   ├── network_vpc_peering_dev.tf
   ├── ...
├── 6_notifications
   ├── ...
├── 7_containers
   ├── account.tf
   ├── container_registry.tf
   ├── ...
├── config
   ├── backend.config
   └── main.config
└── readme.md

0

Altyapıyı düzenlemek için terraform kullanırken izlenmesi gereken birkaç en iyi uygulama olduğuna inanıyorum.

  1. Aynı kodu tekrar yazmayın (Yeniden kullanılabilirlik)
  2. Kolayca korumak için ortam yapılandırmasını ayrı tutun.
  3. Eşzamanlılık kilitlemeyi işlemek için uzak arka uç s3 (şifreli) ve dinamo DB kullanın
  4. Bir modül oluşturun ve bu modülü ana altyapıda birden çok kez kullanın; bu, farklı parametreler geçerek birden çok kez çağrılabilen yeniden kullanılabilir bir işlev gibidir.

Birden çok ortamı yönetin

Çoğu zaman önerilen yol, çoklu ortamları idare etmek için terraform 'çalışma alanını' kullanmaktır, ancak çalışma alanı kullanımının bir kuruluştaki çalışma şekline göre değişebileceğine inanıyorum. Diğeri, ortam durumlarını ayırmak için her ortamınız için (örn. Aşama, üretim, QA) Terraform kodunu depolamaktır. Ancak bu durumda aynı kodu birçok yerde kopyalıyoruz.

├── main.tf
├── dev
   ├── main.tf
   ├── output.tf
   └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf

Çoğu zaman tüm ortamın% 90 aynı olacağına inandığımdan, her ortam klasörünü saklayarak aynı terraform kodunun kopyalanmasını önlemek için farklı bir yaklaşım izledim.

├── deployment
 ├── 01-network.tf
 ├── 02-ecs_cluster.tf
 ├── 03-ecs_service.tf
 ├── 04-eks_infra.tf
 ├── 05-db_infra.tf
 ├── 06-codebuild-k8s.tf
 ├── 07-aws-secret.tf
 ├── backend.tf
 ├── provider.tf
 └── variables.tf
├── env
 ├── dev
  ├── dev.backend.tfvar
  └── dev.variables.tfvar
 └── prod
 ├── prod.backend.tfvar
 └── prod.variables.tfvar
├── modules
 └── aws
 ├── compute
  ├── alb_loadbalancer
  ├── alb_target_grp
  ├── ecs_cluster
  ├── ecs_service
  └── launch_configuration
 ├── database
  ├── db_main
  ├── db_option_group
  ├── db_parameter_group
  └── db_subnet_group
 ├── developertools
 ├── network
  ├── internet_gateway
  ├── nat_gateway
  ├── route_table
  ├── security_group
  ├── subnet
  ├── vpc
 └── security
 ├── iam_role
 └── secret-manager
└── templates

Ortamlarla ilgili yapılandırma

Ortamla ilgili yapılandırmayı ve parametreleri bir değişken dosyada ayrı tutun ve altyapıyı yapılandırmak için bu değeri iletin. örneğin aşağıdaki gibi

  • dev.backend.tfvar

      region = "ap-southeast-2"
      bucket = "dev-samplebackendterraform"
      key = "dev/state.tfstate"
      dynamo_db_lock = "dev-terraform-state-lock"
  • dev.variable.tfvar

    environment                     =   "dev"
    vpc_name                        =   "demo"
    vpc_cidr_block                  =   "10.20.0.0/19"
    private_subnet_1a_cidr_block    =   "10.20.0.0/21"
    private_subnet_1b_cidr_block    =   "10.20.8.0/21"
    public_subnet_1a_cidr_block     =   "10.20.16.0/21"
    public_subnet_1b_cidr_block     =   "10.20.24.0/21"

Altyapı bölümünün koşullu atlanması

Env'e özgü değişken dosyasında bir konfigürasyon oluşturun ve bu değişkene bağlı olarak o parçayı oluşturmaya veya atlamaya karar verin. Bu şekilde ihtiyaca göre altyapının belirli kısımları atlanabilir.

variable vpc_create {
   default = "true"
}

module "vpc" {
  source = "../modules/aws/network/vpc"
  enable = "${var.vpc_create}"
  vpc_cidr_block = "${var.vpc_cidr_block}"
  name = "${var.vpc_name}"
 }

 resource "aws_vpc" "vpc" {
    count                = "${var.enable == "true" ? 1 : 0}"
    cidr_block           = "${var.vpc_cidr_block}"
    enable_dns_support   = "true"
   enable_dns_hostnames = "true"
}

Aşağıdaki komut her ortam için alt değişiklikleri başlatmak ve yürütmek için gereklidir, gerekli ortam klasörüne cd.

  terraform init -var-file=dev.variables.tfvar -backend-config=dev.backend.tfvar ../../deployment/

  terraform apply -var-file=dev.variables.tfvar ../../deployment

Referans için: https://github.com/mattyait/devops_terraform


0

Alt klasör fikrinden hoşlanmıyorum çünkü bu, ortam başına farklı kaynaklarla sonuçlanacak ve bu sürüklenme eğilimi gösteriyor.

Daha iyi yaklaşım, tüm ortamlar için tek bir yığına sahip olmaktır (diyelim ki, dev, preprod ve prod). Tek bir ortamda çalışmak için kullanın terraform workspace.

terraform workspace new dev

Bu yeni bir çalışma alanı yaratır. Bu, adanmış bir durum dosyası ve terraform.workspacekodunuzda kullanabileceğiniz değişkeni içerir .

resource "aws_s3_bucket" "bucket" {
  bucket = "my-tf-test-bucket-${terraform.workspace}"
}

Bu şekilde aranan kovalar alacaksınız

  • benim-tf-testi-kova-dev
  • benim-tf-testi-kova-preprod
  • benim-tf-testi-kova-prod

Yukarıdaki çalışma alanlarına uyguladıktan sonra ( terraform workspace select <WORKSPACE>ortamları değiştirmek için kullanın ). Kodu birden çok bölgeye uygun hale getirmek için şunu yapın:

data "aws_region" "current" {}

resource "aws_s3_bucket" "bucket" {
  bucket = "my-tf-test-bucket-${data.aws_region.current.name}-${terraform.workspace}"
}

almak için (us-doğu-1 bölgesi için)

  • benim-tf-testi-kova-bizi-doğu-1-dev
  • benim-tf-testi-kova-bizi-doğu-1-preprod
  • benim-tf-testi-kova-bizi-doğu-1-prod

0

İzlenecek Terraform En İyi Uygulamaları:

  1. Sert kodlamadan kaçının: Bazen geliştiriciler kaynakları doğrudan manuel olarak oluşturdular. Bu kaynakları işaretlemeniz ve onları kodlara dahil etmek için terraform içe aktarmayı kullanmanız gerekir. Bir örnek:

    account_number = "123456789012" account_alias = "sirketim"

  2. Terraform'u bir docker container'dan çalıştırın: Terraform, hangi sürümü çalıştırabileceğinizi kolayca kontrol etmenizi sağlayan resmi bir Docker kapsayıcısı yayınlar.

Derleme işinizi CI / CD ardışık düzeninde ayarlarken Terraform Docker konteynerini çalıştırmanız önerilir.

TERRAFORM_IMAGE=hashicorp/terraform:0.11.7
TERRAFORM_CMD="docker run -ti --rm -w /app -v ${HOME}/.aws:/root/.aws -v ${HOME}/.ssh:/root/.ssh -v `pwd`:/app $TERRAFORM_IMAGE"

Daha fazlası için lütfen bloguma bakın: https://medium.com/tech-darwinbox/how-darwinbox-manages-infrastructure-at-scale-with-terraform-371e2c5f04d3


0

Bu konuya katkıda bulunmak istiyorum.

  • Terraform Cloud kullanmadığınız sürece bu büyük olasılıkla AWS S3 + DynamoDB olacaktır.
  • Üretim ve üretim dışı arka uçların ayrı altyapısı (ağ + RBAC).
  • Belirtilen bir ağın dışından durum dosyalarına (ağ erişimi ve RBAC) erişimi devre dışı bırakmayı planlayın (örn. Dağıtım aracısı havuzu).
  • Terraform arka uç altyapısını çalışma zamanı ortamında tutmayın. Ayrı bir hesap kullanın.
  • Değişiklikleri ve durum dosyalarını kaybetmemek ve Terraform durum geçmişini korumak için Terraform arka uçlarınızda nesne sürümü oluşturmayı etkinleştirin.

Bazı özel durumlarda, Terraform durum dosyalarına manuel erişim gerekecektir. Yeniden düzenleme, değişiklikleri bozma veya kusurları düzeltme gibi şeyler, operasyon personeli tarafından Terraform durum operasyonlarının yürütülmesini gerektirecektir. Bu tür durumlar için, savunma sunucusu, VPN vb. Kullanarak Terraform durumuna olağanüstü kontrollü erişim planlayın.

Bir kontrol daha uzun iyi uygulamalar blog CI / CD boru hatları için yönergeleri de dahil ayrıntılarda olduğunu kapakları bu.


-1

Hala daha iyi bir çözüm arıyorsanız, farklı ortam klasörü yapısının yerine geçebilecek çalışma alanlarına bir göz atın, çalışma alanına özel değişkenler olabilir.

As Yevgeniy Brikman söz bir modül yapısına sahip olmak daha iyidir.


-1

Yukarıdaki önerilerle birlikte durumları yönetmek ve kaydetmek için terraform bulutu kullanın.

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.