Terraform S3 백엔드를 구성하는 동안 오류가 발생했습니다
나는 AWS용 테라폼을 통해 S3 백엔드를 구성하고 있다.
terraform {
backend "s3" {}
}
"terraform init" 명령 실행 시 (S3 백엔드) 버킷 이름, 키 및 영역에 대한 값을 제공하면 다음 오류가 발생합니다
""
나는 providers.tf에서 access & secret key를 변수로 선언했다. "terraform init" 명령을 실행하는 동안 어떤 액세스 키나 비밀 키도 묻지 않았습니다.
이 문제를 해결하는 방법은 무엇입니까?
를 실행할 때 자격 증명(aws 키)에 대한 옵션을 추가해야 합니다. 따라서 명령은 다음과 같아야 합니다:
terraform init -backend-config="access_key=<your access key>" -backend-config="secret_key=<your secret key>"
하지 않음 - 암호에 대한 변수를 추가합니다. 그것은 정말로 정말 나쁜 관행이고 불필요하다.
Terraform은 기본 AWS 프로파일을 선택하거나 AWS_PROFILE을 설정한 모든 AWS 프로파일을 사용합니다. AWS의 경우 인스턴스 프로파일을 사용해야 합니다. 역할도 할 수 있어요.
프로파일을 tf 코드에 하드코딩하는 경우 이 스크립트를 실행하고 실행되는 모든 다른 계정에 대해 변경할 때마다 동일한 프로파일 이름을 가져야 합니다.
래퍼 스크립트나 입력을 좋아하지 않는 한 이 모든 cmdline 작업을 수행하지 마십시오. 작업 - 다음과 같이 보이는 자신을 추가합니다
terraform {
backend "s3" {
bucket = "WHAT-YOU-CALLED-YOUR-STATEBUCKET"
key = "mykey/terraform.tfstate"
region = "eu-west-1"
}
}
이제 당신의 테라폼이 들어가면:
백엔드를 초기화하는 중...
백엔드 "s3"를 구성했습니다! Terraform은 백엔드 구성이 변경되지 않는 한 이 백엔드를 자동으로 사용합니다.
공급자의 값은 remote_state에 대한 perm과 관련이 없으며 다른 AWS 계정(또는 다른 클라우드 제공자)일 수도 있습니다.
나도 같은 문제가 있었는데, 이 문제를 해결하는 방법은 AWS 프로파일을 구성하는 것이다. 프로젝트에서 AWS_PROFILE을 제대로 언급했더라도, .
문제는 아래와 같이 프로젝트에 AWS 공급자를 이미 설정하여 정상적으로 작동하고 있다는 것입니다.
provider "aws" {
region = "${var.AWS_REGION}"
profile = "${var.AWS_PROFILE}"
}
S3 백엔드 구성 파일을 구성하려고 했던 프로젝트가 종료되었습니다. 따라서 명령을 실행했고 동일한 오류 메시지도 받았습니다.
Error: error configuring S3 Backend: no valid credential sources for S3 Backend found.
Terraform 백엔드 구성에는 충분하지 않습니다. 백엔드 파일에서도 를 언급해야 합니다.
- 완전한 솔루션
나는 지금 테라폼 최신 버전을 사용하고 있다. v0.13.5입니다.
를 참조하십시오
provider "aws" {
region = "${var.AWS_REGION}"
profile = "${var.AWS_PROFILE}" # lets say profile is my-profile
}
예를 들어 AWS_PROFILE은 아래와 같아야 합니다.
terraform {
backend "s3" {
bucket = "my-terraform--bucket"
encrypt = true
key = "state.tfstate"
region = "ap-southeast-2"
profile = "my-profile" # you have to give the profile name here. not the variable("${var.AWS_PROFILE}")
}
}
그런 다음 실행합니다
AWS 자격 증명 파일에서 프로필 이름을 변경할 때 비슷한 문제가 발생했습니다. 폴더를 삭제하고 다시 실행하면 문제가 해결되었습니다.
같은 문제가 있었고 나는 항상 그랬던 것처럼 사용하고 있었다. 나는 내 자격증이 맞는지 확인했다.
다시 실행하면 어떤 이유로 수정됩니다.
누군가 로컬 스택을 사용하는 경우, 나는 이 팁만 사용했다
backend "s3" {
bucket = "curso-terraform"
key = "terraform.tfstate"
region = "us-east-1"
endpoint = "http://localhost:4566"
skip_credentials_validation = true
skip_metadata_api_check = true
force_path_style = true
dynamodb_table = "terraform_state"
dynamodb_endpoint = "http://localhost:4566"
encrypt = true
}
공급자에 끝점을 추가하는 것도 잊지 마십시오:
provider "aws" {
region = "us-east-1"
skip_credentials_validation = true
skip_requesting_account_id = true
skip_metadata_api_check = true
s3_force_path_style = true
endpoints {
ec2 = "http://localhost:4566"
s3 = "http://localhost:4566"
dynamodb = "http://localhost:4566"
}
}
사용자 지정 aws 프로파일을 이미 설정한 경우 아래 옵션을 사용하십시오.
terraform init -traform-config="profile=your-profile-name"
사용자 지정 프로필이 없는 경우 기본 프로필에 access_key와 secret_key를 추가하고 시도하십시오.
내 자격 증명 파일에 두 개의 프로필 이름이 차례로 있어서 오류가 발생했습니다. 두 번째 프로필 이름을 제거하면 이 문제가 해결되었습니다.
저도 같은 문제가 있었고 아래는 제 사용 사례입니다.
AWS 계정 1: 관리 계정(여기서 생성된 IAM 사용자와 이 사용자가 Dev 및 Prod 계정에 대한 역할을 맡음)
AWS 계정 2: Dev environment 계정(이 경우 신뢰할 수 있는 계정에 대한 역할은 여기서 생성됨Management 계정 사용자)
AWS 계정 3: 제품 환경 계정(이 경우 신뢰할 수 있는 계정에 대한 역할은 여기서 생성됨 관리 계정 사용자)
그래서 아래 내용으로 a와 파일을 만들었습니다.
dev-backend.conf 및 prod-backend.conf 파일에서 아래 내용 정의
bucket = "<your bucket name>"
key = "< your key path>"
region = "<region>"
dynamodb_table = "<db name>"
encrypt = true
profile = "< your profile>" # this profile has access key and secret key of the IAM user created in Management account
role_arn = "arn:aws:iam::<dev/prod account id>:role/<dev/prod role name >"
로컬 상태에서 s3 상태로 devs3 버킷 구성을 사용한 테라폼 초기화
$ terraform init -reconfigure -backend-config="dev-backend.conf"
개발 환경 변수 파일을 사용하여 테라폼 적용
$ terraform apply --var-file="dev-app.tfvars"
devs3 버킷에서 prods3 버킷 상태로 prods3 버킷 구성으로 테라폼 초기화
$ terraform init -reconfigure -backend-config="prod-backend.conf"
prod 환경 변수 파일을 사용하여 테라폼 적용
$ terraform apply --var-file="prod-app.tfvars"
나는 이 문제에 대해 많은 다른 주제들이 있기 때문에 이 문제를 완전히 끝내기로 결정했다. 이 문제는 주로 CI/CD 파이프라인을 실행할 때와 로컬로 개발할 때 사용되는 인증 형식이 다르기 때문에 발생합니다. 사람들은 우선순위를 고려하지 않고 서로 다른 인증 옵션을 함께 사용하는 경향이 있습니다.
로컬에서 실행할 때는 빌드를 실행할 때마다 액세스 키를 설정할 필요가 없기 때문에 awscli를 사용해야 합니다. 로컬에서 여러 계정을 사용하는 경우 awscli에 프로파일을 전환하도록 지시할 수 있습니다:
export AWS_PROFILE=my-profile
CI/CD 파이프라인(예: Github Actions, CircleCI)에서 동일한 코드를 실행하려면 빌드 파이프라인 내에서 필요한 환경 변수를 내보내기만 하면 됩니다:
export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export AWS_REGION="eu-central-1"
이 기능은 공급자 블록 내에서 하드 코딩된 구성을 설정한 경우에만 작동합니다. AWS Terape 제공자 문서는 인증 순서를 학습하기 때문입니다. 공급자 구성의 매개 변수가 먼저 평가된 다음 환경 변수가 됩니다.
예:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
provider "aws" {}
terraform {
backend "s3" {}
}
이를 계획하거나 적용하기 전에 백엔드를 초기화해야 합니다:
terraform init \
-backend-config="bucket=${TFSTATE_BUCKET}" \
-backend-config="key=${TFSTATE_KEY}" \
-backend-config="region=${TFSTATE_REGION}"
모범 사례:
- 로컬로 실행할 때 aWS cli를 사용하여 인증합니다. 빌드 파이프라인에서 실행하는 경우 환경 변수를 사용하여 인증합니다.
- Terraform 구성을 가능한 한 깨끗하게 유지하십시오. 따라서 동적으로 인증할 수 있도록 하드 코딩된 설정을 피하고 공급자 블록을 비워 두십시오.
- 또한 s3 백엔드 구성을 비워두고 환경 변수 또는 구성 파일에서 이 구성을 초기화하는 것이 좋습니다.
- Terraform 설명서에서는 코드 검토를 통해 외부 종속성에 대한 잠재적인 변경 사항을 논의할 수 있도록 버전 컨트롤에 .terraform.lock.hcl을 포함할 것을 권장합니다.
- 빌드 파이프라인에 설정하는 것은 기본적으로 쓸모가 없습니다. 대부분의 경우 런타임 중에 awscli가 설치되지 않습니다. 만약 당신이 이것이 어떻게든 필요하다면, 당신은 아마도 이것을 별도의 빌드 파이프라인으로 분할하는 것을 생각해야 할 것이다.
- 개인적으로, 나는 테라포름 주변의 포장지로 테라그런트를 사용하는 것을 좋아한다. 주요 이유 중 하나는 백엔드 구성을 동적으로 설정할 수 있기 때문입니다. 이것은 평범한 테라폼에서는 불가능하다.
기존 프로젝트에 Terraform 변경 사항을 적용하려고 할 때 이 문제가 발생했습니다. 테라폼 명령은 잘 작동하고 있었고, 문제가 시작되기 몇 시간 전에 프로젝트를 실행하기도 했습니다.
다음 오류가 발생했습니다:
◦ 테라폼 init 모듈 초기화 중...
백엔드를 초기화하는 중... ╷ ◦ 오류: S3 백엔드 구성 오류: IAM 역할(arn:aws:iam:950456587296:role/MyRole)은 가정할 수 없습니다. │ ◦ 여기에는 여러 가지 원인이 있을 수 있습니다. 가장 일반적인 원인은 다음과 같습니다. ◦ * 역할을 가정하는 데 사용되는 자격 증명이 잘못되었습니다 │ * 자격 증명에 역할을 가정할 수 있는 적절한 권한이 없습니다 │ 오류: 자격 증명 공급자: 체인에 유효한 제공자가 없습니다. 사용되지 않습니다. │ 자세한 메시지는 waws를 참조하십시오.Config.CredentialsChainVerbose오류
Terraform 명령을 실행할 때 조직 VPN을 켰고, 이로 인해 명령이 실패했습니다.
내가 고친 방법은 이렇다
VPN이 문제를 일으켰기 때문에 모든 사용자에게 적용되지 않을 수 있습니다.
내 VPN을 끄면 고쳐졌다.
'개발하자' 카테고리의 다른 글
스벨테 앱을 도커 컨테이너에 넣는 방법은? (0) | 2023.02.12 |
---|---|
Terraform GCP 서비스 계정에 IAM 역할 할당 (0) | 2023.02.11 |
Svelte - 스크롤에 네비게이션 숨기기 및 표시 (0) | 2023.02.10 |
웹 어셈블리 바이너리가 JavaScript/TypeScript 번들보다 작습니까? (0) | 2023.02.09 |
빌드하는 동안 플러터 공급자 setState() 또는 MarkNeedsBuild() 호출됨 (0) | 2023.02.09 |