Jika Anda memiliki konfigurasi Terraform yang memiliki tingkat kompleksitas moderat, bagaimana Anda menulis tes di sekitar konfigurasi yang dapat dieksekusi sebagai bagian dari pipeline Integration / Continuous Delivery?
Sebagai contoh, Anda mungkin memiliki konfigurasi multi-cloud yang menentukan kondisi yang diinginkan berikut:
- Layanan Wadah Azure untuk menjadi tuan rumah Docker di Azure
- Penyimpanan Azure Blob
- SQL Azure
- Layanan Kontainer EC2 untuk menjadi tuan rumah Docker di AWS
- Layanan Penyimpanan Amazon S3
- Basis data Amazon RDS SQL Server
Berpotensi terraform apply
dapat membuat yang di atas dari awal, atau transisi dari keadaan yang dikerahkan sebagian ke keadaan yang diinginkan di atas.
Saya sadar bahwa Terraform membagi pekerjaannya ke dalam tahap rencana eksekusi dan fase aplikasi yang benar-benar membuat perubahan pada arsitektur target. Apakah ini dapat digunakan untuk menulis tes terhadap rencana eksekusi, jika demikian apakah ada kerangka kerja untuk membantu menulis ini?
Jawaban:
Saat ini tidak ada solusi lengkap untuk ini diintegrasikan ke dalam Terraform, tetapi ada beberapa blok bangunan yang dapat berguna untuk membantu dalam menulis tes dalam bahasa pemrograman yang terpisah.
Terraform menghasilkan file status dalam format JSON yang pada prinsipnya dapat digunakan oleh program eksternal untuk mengekstrak data tertentu tentang apa yang dibuat Terraform. Walaupun format ini belum dianggap stabil secara resmi, dalam praktiknya jarang terjadi perubahan sehingga orang berhasil mengintegrasikannya, menerima bahwa mereka mungkin perlu melakukan penyesuaian ketika mereka meningkatkan Terraform.
Strategi apa yang tepat di sini akan sangat tergantung pada apa yang ingin Anda uji. Sebagai contoh:
Di lingkungan yang memunculkan server virtual, alat seperti Serverspec dapat digunakan untuk menjalankan tes dari perspektif server ini. Ini dapat dijalankan secara terpisah dari Terraform menggunakan beberapa proses out-of-band, atau sebagai bagian dari Terraform berlaku menggunakan
remote-exec
penyedia . Ini memungkinkan verifikasi pertanyaan seperti "bisakah server mencapai basis data?", Tetapi tidak cocok untuk pertanyaan seperti "apakah grup keamanan instans cukup ketat?", Karena memeriksa dengan kuat yang memerlukan akses data dari luar instance itu sendiri.Dimungkinkan untuk menulis tes menggunakan kerangka uji yang ada (seperti RSpec untuk Ruby,
unittest
untuk Python, dll) yang mengumpulkan id sumber daya yang relevan atau alamat dari file status Terraform dan kemudian menggunakan SDK platform yang relevan untuk mengambil data tentang sumber daya dan menyatakan bahwa mereka diatur seperti yang diharapkan. Ini adalah bentuk yang lebih umum dari ide sebelumnya, menjalankan tes dari perspektif host di luar infrastruktur yang diuji, dan dengan demikian dapat mengumpulkan set data yang lebih luas untuk membuat pernyataan.Untuk kebutuhan yang lebih sederhana, seseorang dapat memilih untuk percaya bahwa keadaan Terraform adalah representasi akurat dari kenyataan (asumsi yang valid dalam banyak kasus) dan hanya menyatakan secara langsung tentang hal itu. Ini paling tepat untuk kasus "mirip-serat" yang sederhana, seperti memverifikasi bahwa skema pemberian tag sumber daya yang benar sedang diikuti untuk tujuan alokasi biaya.
Ada beberapa diskusi lebih lanjut tentang ini dalam masalah Terraform Github yang relevan .
Dalam versi terbaru dari Terraform sangat disarankan untuk menggunakan backend jarak jauh untuk aplikasi non-mainan, tetapi itu berarti bahwa data keadaan tidak langsung tersedia pada disk lokal. Namun, snapshot itu dapat diambil dari backend remote menggunakan
terraform state pull
perintah, yang mencetak data status yang diformat JSON ke stdout sehingga dapat diambil dan diurai oleh program panggilan.sumber
Sebagai pembaruan untuk pertanyaan ini, sekarang ada Kitchen-Terraform yang memungkinkan pengujian file Konfigurasi Terraform tanpa merusak lingkungan produksi. Repositori juga menyertakan beberapa contoh untuk penyedia Terraform yang berbeda.
sumber
Kami baru-baru ini membuka Terratest bersumber , pisau tentara swiss kami untuk menguji kode infrastruktur.
Hari ini, Anda mungkin menguji semua kode infrastruktur Anda secara manual dengan menggunakan, memvalidasi, dan menganggur. Terratest membantu Anda mengotomatiskan proses ini:
Berikut ini contoh uji untuk beberapa kode Terraform:
Ini adalah tes integrasi, dan tergantung pada apa yang Anda uji, dapat memakan waktu 5 - 50 menit. Itu tidak cepat (meskipun menggunakan Docker dan tahap pengujian , Anda dapat mempercepat beberapa hal), dan Anda harus bekerja untuk membuat tes yang dapat diandalkan, tetapi itu layak waktu.
Lihat repo Terratest untuk dokumen dan banyak contoh berbagai jenis kode infrastruktur dan tes yang sesuai untuk mereka.
sumber
Selain semua opsi lain yang disebutkan, saya ingin menyebutkan bahwa InSpec 2.0 menambahkan dukungan untuk API penyedia cloud. Pada dasarnya, Anda dapat terus menulis IaC dengan Terraform, lalu menulis cek kepatuhan dengan InSpec untuk sumber daya cloud Anda. Selain itu, InSpec mendukung tes penulisan untuk masing-masing mesin jika Anda membutuhkannya.
Berikut ini adalah artikel dari Christoph Hartmann (co-pencipta Inspec) tentang cara menggunakan Inspec dengan Terraform: https://lollyrock.com/articles/inspec-terraform/
sumber
Di Aws-Side ada https://github.com/k1LoW/awspec - harus dimungkinkan, untuk memberi makan di terraform.state dan menguji, apakah terraform diterapkan dengan benar.
Tapi saya pikir, di luar pengujian pada alat tingkat rendah, Anda menggunakan, mungkin ide yang lebih baik, untuk berpikir tentang bagaimana menguji seluruh infrastruktur.
Kami sedang mendiskusikan ide ini di sini:
https://github.com/DomainDrivenArchitecture/dda-cloudspec/blob/development/README.md
Untuk menguji invarian di muka, saya tidak tahu solusi siap pakai ...
Kami melakukan beberapa percobaan menggunakan campuran
terraform plan -out=plan.dump
dangrep
tanpa adanya nama elemen. Ada diskusi tentang format rencana yang lebih mudah diakses di sini: github.com/hashicorp/terraform/issues/11883Tetapi saat ini kami sedang menggunakan proses tinjauan rencana manual untuk bagian-bagian penting dari infrastruktur kami.
sumber
Saya melihat, metode teknologi ini elegan rendah untuk terraform tes yang disarankan oleh apparentlymart dalam edisi benang GitHub. Ini tidak sesuai untuk setiap situasi tetapi bagus untuk memverifikasi logika modul.
Buat modul root yang mencakup modul yang sedang diuji dan verifikasi output yang diuji. Berikut adalah contoh sederhana menggunakan dua file:
main.tf
yang akan menjalankan tessimple_module/outputs.tf
yang mewakili modul yang sedang diuji./main.tf
./simple_module/outputs.tf
Jalankan tes
sumber