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.