지형 : 원격 상태 파일의 자격 증명 선택


10

Terraform에 기존 인프라가 있으며 한동안 사용하고 있습니다. 최근에 로컬 랩톱의 AWS 자격 증명 (에 저장된 자격 증명)을 교체했으며 자격 증명을 ~/.aws/credentials다시 설정할 때까지 작동이 중지되었습니다.

문제는 Terraform 소스 자체에서 cred를 선언하고 있지만 전혀 사용하지 않는 것입니다.

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

액세스 ID 권한이 100 % 양호합니다. 나는 모두 동일한 계정 ID와 비밀 키를 사용하고 aws configure들어갈 설정 ~/.aws/credentialsI 위 Terraform 변수 선언에 나처럼.

cred가있는 한 모든 것이 잘 작동~/.aws/credentials 하지만 OS 레벨 자격 증명이 사라지면 (예 rm ~/.aws/credentials:) Terraform 작업을 실행할 때 다음과 같은 결과가 나타납니다 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".

나는 경우를 다시 채울 ~/.aws/credentials실행하여 aws configure다시 잘 작동합니다.

이해하지 못합니다. 설정에서 Terraform 소스 코드 내에서 사용할 자격 증명을 명시 적으로 선언하는 경우 providerOS 수준 AWS 구성이 왜 중요한가요?

Terraform이 내 Terraform 구성에 정의 된 cred 만 사용하도록하고 OS 사용자 프로파일의 내용을 무시하도록하려면 어떻게해야합니까?

편집하다 Terraform v0.11.7

편집 : 정적으로 선언 된 creds가 공급자 선언에 사용되지 않는 이유에 대한 문제를 해결하려고합니다. 대체 방법이나 해결 방법을 찾지 않습니다. 감사.


흠 ... 그냥 직감. 자격 증명 파일에서 찾아야하는 AWS SDK에 대한 힌트 이므로 AWS_PROFILE또는 AWS_DEFAULT_PROFILE환경 변수가 설정되어 있지 않은지 확인하십시오 .
Erik Osterman 5

감사. 늦은 답변이지만 이것을 다시 방문하고 있습니다. 불행히도 환경 변수가 존재하지 않는지 확인했습니다. 원격 백엔드를 사용하지 않는 다른 계획과 마찬가지로 런타임에 creds를 얻을 수 있다면 정말 좋을 것입니다. 어쨌든 고마워.
emmdee

답변:


10

첫 번째 질문

제공자 설정이 Terraform 소스 코드 내에서 사용할 자격 증명을 명시 적으로 선언하는 경우 왜 OS 수준 AWS 구성이 중요한가요?

"백엔드로드 실패 : 백엔드"s3 "구성 오류"오류 메시지가 백엔드 S3 구성을 나타냅니다.

파일 ./.terraform/terraform.tfstate을 보면 S3 백엔드 구성이 표시됩니다.

Terraform S3 백엔드는 Terraform AWS Provider와 다릅니다. 오류 메시지 "AWS Provider에 유효한 자격 증명 소스가 없습니다." 오해의 소지가 있습니다. 이는 AWS Provider 구성이 사용되었음을 의미하며 이는 거짓입니다. S3 백엔드 자격 증명은 별도로 구성되어 terraform.tfstate파일에 저장 됩니다.

https://www.terraform.io/docs/backends/types/s3.html에 설명 된대로 S3 백엔드 자격 증명이 지정되지 않은 경우 Terraform은 다음을 순서대로 사용 하므로 OS 수준 AWS 구성이 중요합니다 .

  1. 환경 변수 AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY
  2. AWS 공유 자격 증명 파일, 기본값은 "~ / .aws / credentials"입니다.

S3 백엔드 구성에서 자격 증명을 지정하지 않았으므로 terraform은 기본적으로 AWS 공유 자격 증명 파일로 설정됩니다.

S3 백엔드 구성에는 자격 증명이 없습니다.

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

두 번째 질문

Terraform이 내 Terraform 구성에 정의 된 cred 만 사용하도록하고 OS 사용자 프로파일의 내용을 무시하도록하려면 어떻게해야합니까?

먼저 백엔드는 보간을 포함 할 수 없습니다 ( https://www.terraform.io/docs/backends/config.html 참조) . 따라서 백엔드 구성에서 변수를 사용할 수 없습니다. 예를 들어이 설정은 유효하지 않습니다

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

실행시 AWS 자격 증명 terraform init을 지정하려면 백엔드 구성을 옵션으로 지정하십시오.

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

./.terraform/terraform.tfstate파일에 저장된 다음과 같은 S3 백엔드 구성이 생성 됩니다.

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

또한 S3 백엔드 자격 증명은 AWS Provider 자격 증명과 별도로 구성됩니다.

terraform init명령 행에서 신임 정보를 다시 실행 하고 --backend-config오류 수정 옵션으로 지정하십시오 .


감사. 매우 상세한 답변과 지금 문제를 이해하고 있습니다. 유스 케이스 shared_credentials_file에서 모든 백엔드와 공급자가 수확하고 사용할 수 있는 옵션을 사용했습니다. 잘 작동하는 것 같고 OS 워크 스테이션 aws 자격 증명에 아무것도 잠겨 있지 않습니다.
emmdee

3

오류는 구체적으로 S3 백엔드 구성과 관련이 있으며, AFAIK는 AWS 제공자 구성의 설정을 상속하지 않습니다. 너무 가지고 access_keysecret_key사용하지 않는 경우 구성 옵션을 ~/.aws/credentials명시 적으로 구성해야합니다.


1

~/.aws/credentials파일 에서 프로파일을 설정하는 것이 좋습니다.

[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

그런 다음 공급자에서 사용할 프로필을 알려줄 수 있습니다

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

키를 테라 폼 파일에 보관하지 않으므로 소스 제어에 넣고 싶을 때 좋습니다.


입력 해 주셔서 감사합니다. 자격 증명 프로필을 잘 알고 있지만 다른 방법이나 해결 방법이 아닌 특정 질문에 대한 해결책을 찾고 있습니다. 이 질문의 범위 내에서 creds는 변수에 있어야합니다. 상관없이 감사합니다.
emmdee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.