Saya juga dalam keadaan memigrasi infrastruktur AWS yang ada ke Terraform jadi saya akan berupaya untuk memperbarui jawabannya saat saya mengembangkan.
Saya sangat mengandalkan contoh resmi Terraform dan berbagai trial and error untuk menyempurnakan area yang saya tidak yakin.
.tfstate
file
Konfigurasi Terraform dapat digunakan untuk menyediakan banyak kotak pada infrastruktur yang berbeda, yang masing-masing dapat memiliki status berbeda. Karena juga dapat dijalankan oleh banyak orang, status ini harus berada di lokasi terpusat (seperti S3) tetapi tidak git.
Ini dapat dikonfirmasi dengan melihat Terraform .gitignore
.
Kontrol pengembang
Tujuan kami adalah untuk memberikan lebih banyak kontrol infrastruktur kepada pengembang sambil mempertahankan audit penuh (git log) dan kemampuan untuk memeriksa perubahan kewarasan (permintaan tarik). Dengan pemikiran tersebut, alur kerja infrastruktur baru yang saya tuju adalah:
- Fondasi dasar AMI umum yang mencakup modul yang dapat digunakan kembali misalnya boneka.
- Infrastruktur inti yang disediakan oleh DevOps menggunakan Terraform.
- Pengembang mengubah konfigurasi Terraform di Git sesuai kebutuhan (jumlah instance; VPC baru; penambahan wilayah / zona ketersediaan, dll.).
- Konfigurasi Git didorong dan permintaan penarikan dikirimkan untuk diperiksa kewarasannya oleh anggota regu DevOps.
- Jika disetujui, panggil webhook ke CI untuk membangun dan menerapkan (tidak yakin cara mempartisi beberapa lingkungan saat ini)
Edit 1 - Perbarui status saat ini
Sejak memulai jawaban ini saya telah menulis banyak kode TF dan merasa lebih nyaman dengan keadaan kita. Kami telah menemukan bug dan batasan di sepanjang jalan, tetapi saya menerima ini adalah karakteristik menggunakan perangkat lunak baru yang berubah dengan cepat.
Tata Letak
Kami memiliki infrastruktur AWS yang rumit dengan beberapa VPC, masing-masing dengan beberapa subnet. Kunci untuk mengelola ini dengan mudah adalah dengan mendefinisikan taksonomi fleksibel yang mencakup wilayah, lingkungan, layanan, dan pemilik yang dapat kita gunakan untuk mengatur kode infrastruktur kita (baik terraform maupun boneka).
Modul
Langkah selanjutnya adalah membuat repositori git tunggal untuk menyimpan modul terraform kami. Struktur direktori tingkat atas kami untuk modul terlihat seperti ini:
tree -L 1 .
Hasil:
├── README.md
├── aws-asg
├── aws-ec2
├── aws-elb
├── aws-rds
├── aws-sg
├── aws-vpc
└── templates
Masing-masing menetapkan beberapa default yang waras tetapi memaparkannya sebagai variabel yang dapat ditimpa oleh "perekat" kami.
Lem
Kami memiliki repositori kedua dengan kami glue
yang menggunakan modul yang disebutkan di atas. Ini diatur sesuai dengan dokumen taksonomi kami:
.
├── 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
Di dalam tingkat klien kami memiliki .tf
file khusus akun AWS yang menyediakan sumber daya global (seperti peran IAM); berikutnya adalah level wilayah dengan kunci publik EC2 SSH; Akhirnya di lingkungan kita ( dev
, stg
, prod
dll) adalah setup VPC, misalnya penciptaan dan mengintip koneksi dll disimpan kami.
Catatan Samping: Seperti yang Anda lihat, saya bertentangan dengan saran saya sendiri di atas dengan tetap terraform.tfstate
menggunakan git. Ini adalah tindakan sementara sampai saya pindah ke S3 tetapi cocok untuk saya karena saat ini saya satu-satunya pengembang.
Langkah selanjutnya
Ini masih proses manual dan belum ada di Jenkins tetapi kami mem-porting infrastruktur yang agak besar dan rumit dan sejauh ini bagus. Seperti yang saya katakan, sedikit bug tetapi berjalan dengan baik!
Edit 2 - Perubahan
Sudah hampir setahun sejak saya menulis jawaban awal ini dan status Terraform dan saya sendiri telah berubah secara signifikan. Saya sekarang berada di posisi baru menggunakan Terraform untuk mengelola cluster Azure dan Terraform sekarang v0.10.7
.
Negara
Orang-orang berulang kali mengatakan kepada saya bahwa negara bagian tidak boleh menggunakan Git - dan mereka benar. Kami menggunakan ini sebagai tindakan sementara dengan tim dua orang yang mengandalkan komunikasi dan disiplin pengembang. Dengan tim terdistribusi yang lebih besar, kami sekarang sepenuhnya memanfaatkan status jarak jauh di S3 dengan penguncian yang disediakan oleh DynamoDB. Idealnya ini akan dipindahkan ke konsul sekarang menjadi v1.0 untuk memotong penyedia lintas cloud.
Modul
Sebelumnya kami membuat dan menggunakan modul internal. Ini masih terjadi tetapi dengan munculnya dan pertumbuhan registri Terraform kami mencoba menggunakan ini setidaknya sebagai basis.
Struktur file
Posisi baru memiliki taksonomi yang jauh lebih sederhana dengan hanya dua lingkungan infx - dev
dan prod
. Masing-masing memiliki variabel dan keluarannya sendiri, menggunakan kembali modul yang kami buat di atas. The remote_state
penyedia juga membantu dalam berbagi output dari sumber dibuat antara lingkungan. Skenario kami adalah subdomain dalam grup sumber daya Azure yang berbeda ke TLD yang dikelola secara global.
├── main.tf
├── dev
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf
Perencanaan
Sekali lagi dengan tantangan ekstra dari tim terdistribusi, kami sekarang selalu menyimpan output dari terraform plan
perintah kami. Kami dapat memeriksa dan mengetahui apa yang akan dijalankan tanpa risiko beberapa perubahan antara panggung plan
dan apply
(meskipun penguncian membantu dalam hal ini). Ingatlah untuk menghapus file rencana ini karena berpotensi berisi variabel "rahasia" teks biasa.
Secara keseluruhan kami sangat senang dengan Terraform dan terus belajar dan meningkatkan dengan fitur baru yang ditambahkan.
Kami banyak menggunakan Terraform dan penyiapan yang kami rekomendasikan adalah sebagai berikut:
Tata letak file
Kami sangat menyarankan untuk menyimpan kode Terraform untuk setiap lingkungan Anda (misalnya stage, prod, qa) dalam set template terpisah (dan karenanya,
.tfstate
file terpisah ). Ini penting agar lingkungan Anda yang terpisah benar-benar terisolasi satu sama lain saat membuat perubahan. Jika tidak, saat mengotak-atik beberapa kode dalam pementasan, terlalu mudah untuk meledakkan sesuatu juga. Lihat Terraform, VPC, dan mengapa Anda menginginkan file tfstate per env untuk diskusi penuh warna tentang alasannya.Oleh karena itu, tata letak file khas kami terlihat seperti ini:
Semua kode Terraform untuk VPC tahap masuk ke
stage
folder, semua kode untuk VPC prod masuk keprod
folder, dan semua kode yang berada di luar VPC (misalnya pengguna IAM, topik SNS, bucket S3) masuk keglobal
folder .Perhatikan bahwa, berdasarkan kesepakatan, kami biasanya memecah kode Terraform kami menjadi 3 file:
vars.tf
: Variabel masukan.outputs.tf
: Variabel keluaran.main.tf
: Sumber daya yang sebenarnya.Modul
Biasanya, kami mendefinisikan infrastruktur kami dalam dua folder:
infrastructure-modules
: Folder ini berisi modul kecil, dapat digunakan kembali, berversi. Pikirkan setiap modul sebagai cetak biru tentang cara membuat satu bagian infrastruktur, seperti VPC atau database.infrastructure-live
: Folder ini berisi infrastruktur yang sedang berjalan dan aktif, yang dibuat dengan menggabungkan modul diinfrastructure-modules
. Pikirkan kode di folder ini sebagai rumah sebenarnya yang Anda bangun dari cetak biru Anda.Sebuah terraform modul hanya setiap set terraform template dalam folder. Sebagai contoh, kita mungkin memiliki folder bernama
vpc
dalaminfrastructure-modules
mendefinisikan bahwa semua tabel rute, subnet, gateway, ACL, dll untuk VPC tunggal:Kemudian kita dapat menggunakan modul itu dalam
infrastructure-live/stage
daninfrastructure-live/prod
untuk membuat VPC panggung dan prod. Misalnya, berikutinfrastructure-live/stage/main.tf
tampilannya:Untuk menggunakan modul, Anda menggunakan
module
sumber daya dan mengarahkansource
bidangnya ke jalur lokal pada hard drive Anda (misalnyasource = "../infrastructure-modules/vpc"
) atau, seperti dalam contoh di atas, URL Git (lihat sumber modul ). Keuntungan dari Git URL adalah kita dapat menentukan git sha1 atau tag (ref=v0.0.4
) tertentu. Sekarang, kami tidak hanya mendefinisikan infrastruktur kami sebagai sekumpulan modul kecil, tetapi kami dapat membuat versi modul tersebut dan memperbarui atau mengembalikannya secara hati-hati sesuai kebutuhan.Kami telah membuat sejumlah Paket Infrastruktur yang dapat digunakan kembali, diuji, dan didokumentasikan untuk membuat VPC, kluster Docker, database, dan seterusnya, dan di balik terpal, kebanyakan dari mereka hanyalah modul Terraform berversi.
Negara
Saat Anda menggunakan Terraform untuk membuat sumber daya (misalnya instans EC2, database, VPC), Terraform mencatat informasi tentang apa yang dibuatnya dalam sebuah
.tfstate
file. Untuk membuat perubahan pada sumber daya tersebut, setiap orang di tim Anda memerlukan akses ke.tfstate
file yang sama ini , tetapi Anda TIDAK harus memeriksanya ke Git (lihat di sini untuk penjelasan mengapa ).Sebagai gantinya, kami merekomendasikan untuk menyimpan
.tfstate
file di S3 dengan mengaktifkan Terraform Remote State , yang secara otomatis akan mendorong / menarik file terbaru setiap kali Anda menjalankan Terraform. Pastikan untuk mengaktifkan pembuatan versi di bucket S3 Anda sehingga Anda dapat memutar kembali ke.tfstate
file lama seandainya Anda merusak versi terbaru. Namun, catatan penting: Terraform tidak menyediakan penguncian . Jadi jika dua anggota tim berjalanterraform apply
pada waktu yang sama di.tfstate
file yang sama , mereka mungkin akan saling menimpa perubahan satu sama lain.Untuk mengatasi masalah ini, kami membuat alat sumber terbuka yang disebut Terragrunt , yang merupakan pembungkus tipis untuk Terraform yang menggunakan Amazon DynamoDB untuk menyediakan penguncian (yang seharusnya gratis untuk sebagian besar tim). Lihat Tambahkan Penguncian dan Konfigurasi Status Jarak Jauh Otomatis ke Terraform dengan Terragrunt untuk info lebih lanjut.
Bacaan lebih lanjut
Kami baru saja memulai serangkaian posting blog yang disebut Panduan Komprehensif untuk Terraform yang menjelaskan secara detail semua praktik terbaik yang telah kami pelajari untuk menggunakan Terraform di dunia nyata.
Pembaruan: Seri posting blog Panduan Komprehensif Terraform menjadi begitu populer sehingga kami mengembangkannya menjadi sebuah buku berjudul Terraform: Up & Running !
sumber
remote config
jika Anda baru saja memeriksa konfigurasi Terraform Anda atau jika Anda ingin mengubah konfigurasi jarak jauh sebelumnya. Terraform 0.9 akan memperkenalkan konsepbackends
, yang akan menyederhanakan banyak hal. Lihat PR ini untuk lebih jelasnya.remote config
perintah untuk menunjuk ke status prod. Dengan asumsi keadaan berbeda per lingkungan. Apakah itu benar? Saya berharap untuk v0.9..tf
file yang sama persis ke dua lingkungan yang berbeda, ya, Anda harus menjalankannyaremote config
setiap kali Anda beralih. Ini jelas sangat rawan kesalahan, jadi saya tidak merekomendasikan benar-benar menggunakan teknik ini. Sebagai gantinya, lihat tata letak file Terraform yang direkomendasikan di postingan blog ini bersama dengan cara menggunakan modul Terraform di postingan blog ini .Sebelumnya
remote config
diperbolehkan ini tetapi sekarang telah diganti dengan " backends ", jadi terraform remote tidak lagi tersedia.Lihat dokumen untuk detailnya.
sumber
Dicakup lebih dalam oleh @Yevgeny Brikman tetapi secara khusus menjawab pertanyaan OP:
Gunakan git untuk file TF. Tapi jangan centang file Status di (yaitu tfstate). Sebagai gantinya gunakan
Terragrunt
untuk sinkronisasi / penguncian file status ke S3.Tidak.
Iya
sumber
Saya tahu ada banyak jawaban di sini tetapi pendekatan saya sangat berbeda.
Modul
Pengelolaan lingkungan
IaC telah membuat proses SDLC relevan dengan manajemen infrastruktur dan tidak normal mengharapkan infrastruktur pengembangan serta lingkungan aplikasi pengembangan.
Pemisahan tugas
Jika Anda berada dalam organisasi kecil atau menjalankan infrastruktur pribadi, ini tidak benar-benar berlaku tetapi akan membantu Anda mengelola operasi Anda.
Ini juga membantu dengan masalah rilis karena Anda akan menemukan beberapa sumber daya jarang berubah sementara yang lain berubah sepanjang waktu. Pemisahan menghilangkan risiko dan kompleksitas.
Strategi ini paralel dengan strategi multi akun AWS. Baca untuk info lebih lanjut.
CI / CD
Ini adalah topik tersendiri tetapi Terraform bekerja dengan sangat baik dalam pipeline yang baik. Kesalahan paling umum di sini adalah memperlakukan CI sebagai peluru perak. Secara teknis Terraform seharusnya hanya menyediakan infrastruktur selama tahapan pipeline perakitan. Ini akan terpisah dari apa yang terjadi dalam tahapan CI di mana seseorang biasanya memvalidasi dan menguji template.
NB Ditulis di ponsel jadi mohon maaf jika ada kesalahan.
sumber
Rekomendasi umum untuk menyusun kode
Lebih mudah dan lebih cepat untuk bekerja dengan sumber daya yang lebih sedikit:
terraform plan
danterraform
terapkan keduanya melakukan panggilan API cloud untuk memverifikasi status sumber daya.Radius ledakan lebih kecil dengan sumber daya yang lebih sedikit:
Mulai proyek Anda menggunakan status jarak jauh:
tfstate
file di git adalah mimpi buruk.Cobalah untuk mempraktikkan struktur yang konsisten dan konvensi penamaan:
Jaga modul sumber daya sejelas mungkin.
Jangan nilai hard-code yang dapat diteruskan sebagai variabel atau ditemukan menggunakan sumber data.
Gunakan
data
sumber danterraform_remote_state
secara khusus sebagai perekat antara modul infrastruktur dalam komposisi.( artikel ref: https://www.terraform-best-practices.com/code-structure )
Contoh:
CATATAN: hanya sebagai referensi untuk tidak diikuti secara ketat karena setiap proyek memiliki karakteristik spesifiknya sendiri
sumber
Saya yakin ada beberapa praktik terbaik yang perlu diikuti saat menggunakan terraform untuk mengatur infrastruktur
Tangani banyak lingkungan
Sebagian besar waktu yang disarankan adalah menggunakan 'ruang kerja' terraform untuk menangani berbagai lingkungan, tetapi saya yakin penggunaan ruang kerja dapat bervariasi berdasarkan cara kerja dalam suatu organisasi. Yang lainnya adalah menyimpan kode Terraform untuk setiap lingkungan Anda (misalnya stage, prod, QA) untuk memisahkan status lingkungan. Namun, dalam kasus ini kami hanya menyalin kode yang sama di banyak tempat.
Saya mengikuti beberapa pendekatan berbeda untuk menangani dan menghindari duplikasi kode terraform yang sama dengan menyimpannya di setiap folder lingkungan karena saya percaya sebagian besar waktu semua lingkungan akan 90% sama.
Konfigurasi yang terkait dengan lingkungan
Pisahkan konfigurasi dan parameter terkait lingkungan dalam file variabel dan teruskan nilai tersebut untuk mengonfigurasi infrastruktur. misal seperti dibawah ini
dev.backend.tfvar
dev.variable.tfvar
Melewati bagian infrastruktur bersyarat
Buat konfigurasi di file variabel spesifik env dan berdasarkan variabel tersebut putuskan untuk membuat atau melewatkan bagian itu. Dengan cara ini berdasarkan kebutuhan, bagian tertentu dari infrastruktur dapat dilewati.
perintah di bawah ini diperlukan untuk menginisialisasi dan menjalankan infra perubahan untuk setiap lingkungan, cd ke folder lingkungan yang diperlukan.
sumber
Saya tidak suka ide subfolder karena ini akan menghasilkan sumber yang berbeda per lingkungan dan ini cenderung melayang.
Pendekatan yang lebih baik adalah memiliki satu tumpukan untuk semua lingkungan (katakanlah dev, preprod dan prod). Untuk bekerja pada penggunaan lingkungan tunggal
terraform workspace
.Ini menciptakan ruang kerja baru. Ini termasuk file status khusus dan variabel
terraform.workspace
yang dapat Anda gunakan dalam kode Anda.Dengan cara ini Anda akan mendapatkan panggilan ember
setelah menerapkan ke ruang kerja di atas (gunakan
terraform workspace select <WORKSPACE>
untuk mengubah lingkungan). Untuk membuat kode tersebut bahkan multi-region-proof, lakukan seperti ini:untuk mendapatkan (untuk wilayah us-east-1)
sumber
Beberapa Praktik Terbaik Terraform untuk Diikuti:
Hindari pengkodean keras: Terkadang pengembang membuat sumber daya secara manual secara langsung. Anda perlu menandai sumber daya ini dan menggunakan impor terraform untuk memasukkannya ke dalam kode. Sebuah sampel:
account_number = “123456789012" account_alias = "perusahaan saya"
Jalankan Terraform dari container docker: Terraform merilis container Docker resmi yang memungkinkan Anda mengontrol dengan mudah versi mana yang dapat Anda jalankan.
Direkomendasikan untuk menjalankan container Terraform Docker saat Anda menyetel pekerjaan build Anda di pipeline CI / CD.
Untuk lebih lanjut, silakan merujuk ke blog saya: https://medium.com/tech-darwinbox/how-darwinbox-manages-infrastructure-at-scale-with-terraform-371e2c5f04d3
sumber
Saya ingin berkontribusi pada utas ini.
Dalam beberapa kasus khusus, akses manual ke file status Terraform akan diperlukan. Hal-hal seperti pemfaktoran ulang, pemutusan perubahan, atau perbaikan kerusakan akan memerlukan pengoperasian status Terraform oleh personel operasi. Untuk kesempatan seperti itu, rencanakan akses terkontrol yang luar biasa ke status Terraform menggunakan bastion host, VPN, dll.
Lihat blog praktik terbaik yang lebih panjang yang membahasnya secara detail termasuk pedoman untuk pipeline CI / CD.
sumber
Jika Anda masih mencari solusi yang lebih baik, lihat ruang kerja yang dapat menggantikan mempertahankan struktur folder lingkungan yang berbeda dapat memiliki variabel khusus ruang kerja.
Seperti yang disebutkan Yevgeniy Brikman , lebih baik memiliki struktur modul.
sumber
Gunakan cloud terraform untuk mengelola dan menyimpan status, bersama dengan saran di atas.
sumber