Saya memiliki infrastruktur yang ada di Terraform dan telah menggunakannya untuk sementara waktu. Baru-baru ini saya menukar kredensial AWS laptop lokal saya (kredit yang disimpan ~/.aws/credentials
) dan berhenti bekerja sampai saya mengatur kembali kredensial tersebut.
Masalahnya adalah bahwa saya mendeklarasikan kredit dalam sumber Terraform itu sendiri tetapi tampaknya tidak menggunakannya sama sekali.
terraform {
backend "s3" {
bucket = "example_tf_states"
key = "global/vpc/us_east_1/example_state.tfstate"
encrypt = true
region = "us-east-1"
}
}
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
variable "access_key" {
default = "<hidden_for_stack_exchange_post>"
}
variable "secret_key" {
default = "<hidden_for_stack_exchange_post>"
}
variable "region" {
default = "us-east-1"
}
Izin ID akses 100% baik. Saya menggunakan ID akun yang sama dan kunci rahasia baik untuk aws configure
pengaturan yang masuk ~/.aws/credentials
seperti saya dalam deklarasi variabel Terraform di atas.
Semuanya berfungsi dengan baik selama kredibilitas ada ~/.aws/credentials
tetapi segera setelah kredensial tingkat OS hilang (yaitu rm ~/.aws/credentials
) saya mendapatkan yang berikut ketika mencoba menjalankan operasi Terraform, seperti terraform plan
:
Failed to load backend:
Error configuring the backend "s3": No valid credential sources found for AWS Provider.
Please see https://terraform.io/docs/providers/aws/index.html for more information on
providing credentials for the AWS Provider
Please update the configuration in your Terraform files to fix this error.
If you'd like to update the configuration interactively without storing
the values in your configuration, run "terraform init".
Jika saya mengisi kembali ~/.aws/credentials
dengan menjalankannya aws configure
akan berfungsi dengan baik lagi.
Saya tidak mengerti - jika provider
pengaturan saya secara eksplisit mendeklarasikan kredensial untuk digunakan di dalam kode sumber Terraform, mengapa konfigurasi AWS tingkat OS sama sekali?
Bagaimana saya bisa membuat Terraform hanya menggunakan kredit yang ditentukan dalam konfigurasi Terraform saya dan mengabaikan apa yang ada di profil pengguna OS saya?
Edit, ini Terraform v0.11.7
Sunting: Harap dicatat bahwa saya mencoba menyelesaikan masalah tentang mengapa kredit yang dinyatakan secara statis tidak digunakan dalam deklarasi penyedia. Tidak mencari metode atau solusi alternatif. Terima kasih.
AWS_PROFILE
atauAWS_DEFAULT_PROFILE
tidak ditetapkan karena mereka adalah petunjuk untuk AWS SDK bahwa itu harus terlihat dalam file kredensial.Jawaban:
Pertanyaan pertama anda
Pesan kesalahan "Gagal memuat backend: Kesalahan mengonfigurasi backend" s3 "" mengacu pada konfigurasi Backend S3 Anda.
Lihat di file
./.terraform/terraform.tfstate
dan Anda akan melihat konfigurasi S3 Backend.Terraform S3 Backend berbeda dari Terraform AWS Provider. Pesan kesalahan "Tidak ditemukan sumber kredensial yang valid untuk Penyedia AWS." menyesatkan. Ini menyiratkan bahwa konfigurasi Penyedia AWS digunakan, yang salah. Kredensial S3 Backend dikonfigurasi secara terpisah dan disimpan dalam
terraform.tfstate
file.Konfigurasi AWS tingkat OS Anda penting karena jika tidak ada kredensial S3 Backend yang ditentukan, seperti yang didokumentasikan di sini https://www.terraform.io/docs/backends/types/s3.html , maka Terraform default untuk menggunakan yang berikut, secara berurutan:
Anda tidak menentukan kredensial apa pun dalam konfigurasi S3 Backend Anda sehingga terraform default ke File Kredensial Bersama AWS.
Konfigurasi S3 Backend Anda tidak mengandung kredensial.
Pertanyaan kedua anda,
Pertama, Backends tidak dapat berisi interpolasi, lihat https://www.terraform.io/docs/backends/config.html . Jadi, Anda tidak dapat menggunakan variabel apa pun di konfigurasi Backend. mis. konfigurasi ini tidak valid
Jika Anda ingin menentukan kredensial AWS saat menjalankan,
terraform init
Anda menentukan konfigurasi backend sebagai opsi.terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"
Ini menghasilkan konfigurasi S3 Backend yang terlihat seperti ini, disimpan dalam
./.terraform/terraform.tfstate
file:Sekali lagi, kredensial S3 Backend dikonfigurasikan secara terpisah dari kredensial Penyedia AWS Anda.
Jalankan kembali
terraform init
dan tentukan kredensial pada baris perintah sebagai--backend-config
opsi untuk memperbaiki kesalahan Anda.sumber
shared_credentials_file
opsi bahwa semua backend dan penyedia saya akan memanen dan menggunakan. Tampaknya berfungsi dengan baik dan tidak ada yang terkunci ke dalam OS workstation dan kredensial.Kesalahan yang Anda dapatkan secara khusus mengacu pada mengonfigurasi backend S3, yang AFAIK tidak mewarisi pengaturan dari konfigurasi penyedia AWS; juga memiliki
access_key
&secret_key
opsi konfigurasi yang jika Anda tidak menggunakan~/.aws/credentials
Anda perlu mengkonfigurasi secara eksplisit.sumber
Anda lebih baik mengatur profil di
~/.aws/credentials
file Anda sukaKemudian di penyedia Anda, Anda dapat menentukan profil mana yang digunakan
Ini akan menjaga kunci keluar dari file terraform Anda yang merupakan hal yang baik jika Anda ingin menempatkannya dalam kontrol sumber.
sumber