Terraform: Memilih kredensial untuk file status jauh

10

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 configurepengaturan yang masuk ~/.aws/credentialsseperti saya dalam deklarasi variabel Terraform di atas.

Semuanya berfungsi dengan baik selama kredibilitas ada ~/.aws/credentialstetapi 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/credentialsdengan menjalankannya aws configureakan berfungsi dengan baik lagi.

Saya tidak mengerti - jika providerpengaturan 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.

emmdee
sumber
Hrm ... hanya dugaan. Pastikan bahwa variabel lingkungan AWS_PROFILEatau AWS_DEFAULT_PROFILEtidak ditetapkan karena mereka adalah petunjuk untuk AWS SDK bahwa itu harus terlihat dalam file kredensial.
Erik Osterman
Terima kasih. Balasan terlambat tetapi saya meninjau kembali ini. Sayangnya saya sudah memeriksa env vars tidak ada. Benar-benar akan menyenangkan jika bisa meminta kredit saat runtime seperti paket lain yang tidak menggunakan backend jarak jauh. Terima kasih.
emmdee

Jawaban:

10

Pertanyaan pertama anda

jika pengaturan penyedia saya secara eksplisit mendeklarasikan kredensial untuk digunakan di dalam kode sumber Terraform, mengapa konfigurasi AWS tingkat OS sama sekali?

Pesan kesalahan "Gagal memuat backend: Kesalahan mengonfigurasi backend" s3 "" mengacu pada konfigurasi Backend S3 Anda.

Lihat di file ./.terraform/terraform.tfstatedan 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.tfstatefile.

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:

  1. Variabel lingkungan AWS_ACCESS_KEY_ID dan AWS_SECRET_ACCESS_KEY
  2. File kredensial bersama AWS, nilai default adalah "~ / .aws / kredensial".

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.

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
  }
}

Pertanyaan kedua anda,

Bagaimana saya bisa membuat Terraform hanya menggunakan kredit yang ditentukan dalam konfigurasi Terraform saya dan mengabaikan apa yang ada di profil pengguna OS saya?

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

terraform {
  backend "s3" {
    bucket = "example_tf_states"
    key    = "global/vpc/us_east_1/example_state.tfstate"
    encrypt = true
    region     = "us-east-1"
    access_key = ${var.access_key}
    secret_key = ${var.secret_key}
  }
}

Jika Anda ingin menentukan kredensial AWS saat menjalankan, terraform initAnda 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.tfstatefile:

{
    "version": 3,
    "serial": 1,
    "lineage": "bd737d2d-1181-ed64-db57-467d14d2155a",
    "backend": {
        "type": "s3",
        "config": {
            "access_key": "your_access_key",
            "secret_key": "your_secret_key"
        },
        "hash": 9345827190033900985
    },

Sekali lagi, kredensial S3 Backend dikonfigurasikan secara terpisah dari kredensial Penyedia AWS Anda.

Jalankan kembali terraform initdan tentukan kredensial pada baris perintah sebagai --backend-configopsi untuk memperbaiki kesalahan Anda.

Mike Marseglia
sumber
Terima kasih. Respons yang sangat terperinci dan saya mengerti masalahnya sekarang. Dalam kasus penggunaan saya, saya akhirnya menggunakan shared_credentials_fileopsi 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.
emmdee
3

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_keyopsi konfigurasi yang jika Anda tidak menggunakan ~/.aws/credentialsAnda perlu mengkonfigurasi secara eksplisit.

Bodgit
sumber
1

Anda lebih baik mengatur profil di ~/.aws/credentialsfile Anda suka

[profile1]
aws_access_key_id = xxxx
aws_secret_access_key = xxxxx
region = us-east-1

[profile2]
aws_access_key_id = xxxx
aws_secret_access_key = xxxx
region = us-west-2

Kemudian di penyedia Anda, Anda dapat menentukan profil mana yang digunakan

provider "aws" {
  profile = "profile2"
  region = "${var.region}"
}

Ini akan menjaga kunci keluar dari file terraform Anda yang merupakan hal yang baik jika Anda ingin menempatkannya dalam kontrol sumber.

Mike
sumber
Terima kasih atas masukannya. Saya sangat menyadari profil kredensial, namun saya mencari solusi untuk pertanyaan spesifik daripada metode alternatif atau solusi. Kred harus dalam variabel untuk ruang lingkup pertanyaan ini. Sangat dihargai.
emmdee