GitLab과 Terraform 통합 문제 해결
Terraform과 GitLab의 통합을 사용할 때 문제 해결이 필요한 이슈가 발생할 수 있습니다. "권한이 있는 사용자가 API에서 share_with_groups를 검색할 수 없음" 이슈로 인해 GitLab Terraform 프로바이더가 기존 gitlab_group_share_group 리소스를 감지하지 못할 수 있습니다.
Terraform과 GitLab의 통합을 사용할 때 문제 해결이 필요한 이슈가 발생할 수 있습니다.
하위 그룹 상태가 새로 고침될 때 gitlab_group_share_group 리소스가 탐지되지 않음#
"권한이 있는 사용자가 API에서 share_with_groups를 검색할 수 없음" 이슈로 인해 GitLab Terraform 프로바이더가 기존 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가 두 하위 그룹 모두에 대한 상속된owner액세스 권한으로parent-group의 멤버입니다.
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를 설정하지 않으면 Error: "address": required field is not set 오류 메시지와 함께 job이 실패합니다.
이를 해결하려면 오류를 반환한 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 오류: 404#
이 오류는 상태 이름에 슬래시(/) 문자가 포함된 경우 발생할 수 있습니다.
이를 해결하려면 상태 이름에 슬래시(/) 문자가 포함되지 않는지 확인합니다.
