Terraform: Chọn thông tin đăng nhập cho tệp trạng thái từ xa


10

Tôi có cơ sở hạ tầng hiện có trong Terraform và đã sử dụng nó được một thời gian. Gần đây tôi đã trao đổi thông tin đăng nhập AWS của máy tính xách tay địa phương của tôi (tín dụng được lưu trữ ~/.aws/credentials) và nó đã ngừng hoạt động cho đến khi tôi đặt lại các thông tin đăng nhập đó.

Vấn đề là tôi đang tuyên bố các khoản tín dụng trong chính nguồn gốc Terraform nhưng dường như hoàn toàn không sử dụng chúng.

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"
}

Các quyền truy cập ID là 100% tốt. Tôi đang sử dụng cùng một ID tài khoản và khóa bí mật cho cả các aws configurecài đặt đi vào ~/.aws/credentialstrong phần khai báo biến Terraform ở trên.

Mọi thứ đều hoạt động tốt miễn là có các khoản tín dụng ~/.aws/credentialsnhưng ngay sau khi thông tin cấp độ hệ điều hành không còn nữa (nghĩa là rm ~/.aws/credentials) tôi nhận được những điều sau khi cố gắng chạy các hoạt động của Terraform, chẳng hạn như 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".

Nếu tôi nhập lại ~/.aws/credentialsbằng cách chạy aws configurenó sẽ hoạt động tốt trở lại.

Tôi không hiểu - nếu providercài đặt của tôi tuyên bố rõ ràng thông tin đăng nhập sẽ sử dụng bên trong mã nguồn Terraform, tại sao cấu hình AWS cấp hệ điều hành của tôi lại có vấn đề?

Làm cách nào tôi có thể làm cho Terraform chỉ sử dụng các khoản tín dụng được xác định trong cấu hình Terraform của tôi và bỏ qua những gì trong hồ sơ người dùng hệ điều hành của tôi?

Chỉnh sửa, nó Terraform v0.11.7

Chỉnh sửa: Xin lưu ý rằng tôi đang cố gắng giải quyết vấn đề tại sao các khoản tín dụng được khai báo tĩnh không được sử dụng trong tuyên bố của nhà cung cấp. Không tìm kiếm các phương pháp thay thế hoặc giải pháp thay thế. Cảm ơn.


Hrm ... chỉ là một linh cảm. Đảm bảo rằng AWS_PROFILEhoặc AWS_DEFAULT_PROFILEcác biến môi trường không được đặt vì đó là một gợi ý cho AWS SDK mà nó sẽ tìm trong tệp thông tin đăng nhập.
Erik Osterman

Cảm ơn. Trả lời muộn nhưng tôi đang xem lại điều này. Thật không may, tôi đã kiểm tra các lọ env không có mặt. Thực sự sẽ rất tuyệt nếu nó có thể nhắc nhở các khoản tín dụng trong thời gian chạy như các gói khác không sử dụng phụ trợ từ xa. Dù sao cũng cảm ơn.
emmdee

Câu trả lời:


10

Câu hỏi đầu tiên của bạn

nếu cài đặt nhà cung cấp của tôi tuyên bố rõ ràng thông tin đăng nhập sẽ sử dụng bên trong mã nguồn Terraform, tại sao cấu hình AWS cấp hệ điều hành của tôi lại có vấn đề?

Thông báo lỗi "Không thể tải phụ trợ: Lỗi khi định cấu hình phụ trợ" s3 "" đang đề cập đến cấu hình Backend S3 của bạn.

Nhìn vào tập tin ./.terraform/terraform.tfstatevà bạn sẽ thấy cấu hình của Phần cuối S3.

Phần cuối của Terraform S3 khác với Nhà cung cấp AWS của Terraform. Thông báo lỗi "Không tìm thấy nguồn thông tin hợp lệ cho Nhà cung cấp AWS." là sai lệch. Nó ngụ ý rằng cấu hình Nhà cung cấp AWS được sử dụng, đó là sai. Thông tin xác thực cuối cùng S3 được cấu hình riêng biệt và được lưu trữ trong terraform.tfstatetệp.

Cấu hình AWS cấp hệ điều hành của bạn có vấn đề vì nếu không có thông tin xác thực phụ trợ S3 nào được chỉ định, như được ghi lại ở đây https://www.terraform.io/docs/backends/types/s3.html , thì Terraform mặc định sử dụng các mục sau:

  1. Biến môi trường AWS_ACCESS_KEY_ID và AWS_SECRET_ACCESS_KEY
  2. AWS Tệp thông tin đăng nhập được chia sẻ, giá trị mặc định là "~ / .aws / thông tin đăng nhập".

Bạn đã không chỉ định bất kỳ thông tin xác thực nào trong cấu hình Cuối cùng S3 của mình để terraform được mặc định là Tệp Thông tin xác thực được chia sẻ AWS.

Cấu hình cuối cùng S3 của bạn không chứa thông tin xác thực.

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

Câu hỏi thứ hai của bạn,

Làm cách nào tôi có thể làm cho Terraform chỉ sử dụng các khoản tín dụng được xác định trong cấu hình Terraform của tôi và bỏ qua những gì trong hồ sơ người dùng hệ điều hành của tôi?

Đầu tiên, Phần cuối không thể chứa nội suy, hãy xem https://www.terraform.io/docs/backends/config.html . Vì vậy, bạn không thể sử dụng bất kỳ biến nào trong cấu hình Backend. ví dụ: cấu hình này không hợp lệ

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}
  }
}

Nếu bạn muốn chỉ định thông tin đăng nhập AWS khi chạy, terraform initbạn chỉ định cấu hình phụ trợ làm tùy chọn.

terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"

Điều này tạo ra một cấu hình Cuối cùng S3 trông như thế này, được lưu trữ trong ./.terraform/terraform.tfstatetệp:

{
    "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
    },

Một lần nữa, thông tin xác thực cuối cùng S3 được cấu hình riêng biệt với thông tin đăng nhập Nhà cung cấp AWS của bạn.

Chạy lại terraform initvà chỉ định thông tin đăng nhập trên dòng lệnh dưới dạng --backend-configtùy chọn để sửa lỗi của bạn.


Cảm ơn. Phản ứng rất chi tiết và tôi hiểu vấn đề bây giờ. Trong trường hợp sử dụng của tôi, tôi đã kết thúc bằng cách sử dụng shared_credentials_filetùy chọn rằng tất cả các phụ trợ và nhà cung cấp của tôi sẽ thu hoạch và sử dụng. Có vẻ như đang hoạt động tốt và không có gì bị khóa trong thông tin đăng nhập của máy trạm hệ điều hành.
emmdee

3

Lỗi bạn gặp phải đặc biệt liên quan đến việc định cấu hình phụ trợ S3, mà AFAIK không kế thừa các cài đặt từ cấu hình nhà cung cấp AWS; Nó cũng có các tùy chọn access_key& secret_keycấu hình mà nếu bạn không sử dụng, ~/.aws/credentialsbạn sẽ cần phải cấu hình rõ ràng.


1

Bạn nên thiết lập hồ sơ trong các ~/.aws/credentialstập tin của bạn như

[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

Sau đó, trong nhà cung cấp của bạn, bạn có thể cho nó biết hồ sơ nào sẽ sử dụng

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

Nó sẽ giữ các khóa trong các tệp terraform của bạn, đó là một điều tốt nếu bạn muốn đặt chúng vào kiểm soát nguồn.


Cảm ơn các đầu vào. Tôi biết rất nhiều về hồ sơ thông tin xác thực, tuy nhiên tôi đang tìm kiếm một giải pháp cho câu hỏi cụ thể hơn là một phương pháp thay thế hoặc giải pháp thay thế. Các khoản tín dụng cần phải có trong các biến cho phạm vi của câu hỏi này. Nhiều đánh giá cao bất kể.
emmdee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.