GitLab과 Terraform 통합 문제 해결
GitLab v19.5요약
Terraform과 GitLab의 통합을 사용할 때 문제 해결이 필요한 이슈가 발생할 수 있습니다. GitLab Terraform 프로바이더는 "권한이 있는 사용자가 API에서 share_with_groups를 가져올 수 없음" 이슈로 인해 기존 gitlab_group_share_group 리소스를 탐지하지 못할 수 있습니다.
Terraform과 GitLab의 통합을 사용할 때 문제 해결이 필요한 이슈가 발생할 수 있습니다.
하위 그룹 상태를 새로 고칠 때 gitlab_group_share_group 리소스가 탐지되지 않음#
GitLab Terraform 프로바이더는 "권한이 있는 사용자가 API에서 share_with_groups를 가져올 수 없음"
이슈로 인해 기존 gitlab_group_share_group 리소스를 탐지하지 못할 수 있습니다.
이 경우 Terraform이 기존 리소스를 다시 만들려고 시도하므로 terraform apply를 실행할 때
오류가 발생합니다.
예를 들어 다음과 같은 그룹/하위 그룹 구성을 가정합니다.
parent-group
├── subgroup-A
└── subgroup-B
각 항목은 다음과 같습니다.
- 사용자
user-1이parent-group,subgroup-A,subgroup-B를 만듭니다. subgroup-A가subgroup-B와 공유되어 있습니다.- 사용자
terraform-user는parent-group의 멤버이며 두 하위 그룹 모두에 대해 상속된owner액세스 권한을 가집니다.
Terraform 상태를 새로 고칠 때 프로바이더가 실행하는 API 쿼리 GET /groups/:subgroup-A_id는
shared_with_groups 배열에 subgroup-B의 세부 정보를 반환하지 않습니다. 이로 인해 오류가 발생합니다.
이 문제를 우회하려면 다음 조건 중 하나를 충족합니다.
terraform-user가 모든 하위 그룹 리소스를 만듭니다.terraform-user사용자에게subgroup-B의 Maintainer 또는 Owner 권한을 부여합니다.terraform-user가subgroup-B에 대한 액세스 권한을 상속받고,subgroup-B에 프로젝트가 하나 이상 포함되어 있습니다.
Terraform 상태 문제 해결#
이전 job의 플랜으로 terraform apply를 실행하는 CI job에서 Terraform 상태 파일을 잠글 수 없음#
terraform init에 -backend-config=를 전달하면 Terraform은 해당 값을 플랜
캐시 파일에 저장합니다. 여기에는 password 값도 포함됩니다.
그 결과 플랜을 만든 뒤 다른 CI job에서 같은 플랜을 사용할 때
-backend-config=password=$CI_JOB_TOKEN을 사용하면 Error: Error acquiring the state lock 오류가 발생할 수 있습니다.
$CI_JOB_TOKEN 값이 현재 job이 실행되는 동안에만 유효하기 때문입니다.
이를 우회하려면 CI job에서 http 백엔드 구성 변수를 사용합니다. 이는 GitLab CI 시작하기 지침을 따를 때 내부적으로 수행되는 동작입니다.
오류: "address": required field is not set#
기본적으로 GitLab은 TF_ADDRESS를 ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/${TF_STATE_NAME}으로 설정합니다.
job에서 TF_STATE_NAME 또는 TF_ADDRESS를 설정하지 않으면 job이 실패하면서
Error: "address": required field is not set 오류 메시지가 표시됩니다.
이를 해결하려면 오류를 반환한 job에서 TF_ADDRESS 또는 TF_STATE_NAME 중 하나에
액세스할 수 있는지 확인합니다.
- 해당 job의 CI/CD 환경 범위를 구성합니다.
- 이전 단계의 환경 범위와 일치하도록 job의 환경을 설정합니다.
상태 새로 고침 오류: HTTP 원격 상태 엔드포인트에 인증 필요#
이를 해결하려면 다음을 확인합니다.
- 사용하는 액세스 토큰에
api범위가 있어야 합니다. TF_HTTP_PASSWORDCI/CD 변수를 설정했다면 다음 중 하나를 수행합니다.TF_PASSWORD와 동일한 값으로 설정합니다.- CI/CD job에서 명시적으로 사용하지 않는다면
TF_HTTP_PASSWORD변수를 제거합니다.
Developer 권한에 파괴적인 명령 액세스 허용#
Developer 권한을 가진 사용자가 파괴적인 명령을 실행하도록 허용하려면 다음 우회 방법이 필요합니다.
api범위로 프로젝트 액세스 토큰을 만듭니다.- CI/CD 변수에
TF_USERNAME과TF_PASSWORD를 추가합니다.TF_USERNAME값을 프로젝트 액세스 토큰의 사용자 이름으로 설정합니다.TF_PASSWORD값을 프로젝트 액세스 토큰의 비밀번호로 설정합니다.- 선택 사항. 변수를 보호하여 보호된 브랜치나 보호된 태그에서 실행되는 파이프라인에서만 사용할 수 있도록 합니다.
상태 이름에 마침표가 포함되면 상태를 찾을 수 없음#
GitLab 15.6 이하에서는 상태 이름에 마침표가 포함된 상태로 Terraform이 상태 잠금을 시도하면 404 오류를 반환했습니다.
Terraform 명령에 -lock=false를 추가해 이 제한을 우회할 수 있었습니다. GitLab 백엔드는
요청을 수락했지만, 내부적으로 마침표와 그 뒤의 문자를 상태 이름에서 제거했습니다.
예를 들어 foo.bar라는 상태는 foo로 저장되었습니다. 다만 이 우회 방법은 권장되지 않으며,
상태 이름 충돌을 일으킬 수도 있습니다.
GitLab 15.7 이상에서는 마침표가 포함된 상태 이름을 지원합니다. -lock=false 우회 방법을 사용하다가 GitLab 15.7 이상으로 업그레이드하면
job이 실패할 수 있습니다. GitLab 백엔드가 전체 상태 이름으로 새 상태를 저장하면서 기존 상태 이름과 달라지기 때문입니다.
실패하는 job을 고치려면 상태 이름에서 마침표와 그 뒤의 문자를 제거하도록 이름을 변경합니다.
TF_HTTP_ADDRESS, TF_HTTP_LOCK_ADDRESS, TF_HTTP_UNLOCK_ADDRESS가 설정되어 있다면
그곳의 상태 이름도 함께 업데이트합니다.
또는 OpenTofu 상태를 마이그레이션할 수 있습니다.
상태 저장 오류: HTTP error: 404#
이 오류는 상태 이름에 슬래시(/) 문자가 포함된 경우 발생할 수 있습니다.
이를 해결하려면 상태 이름에 슬래시(/) 문자가 포함되지 않았는지
확인합니다.