InfoGrab DocsInfoGrab Docs

GitLab과 Terraform 통합 문제 해결

요약

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의 세부 정보를 반환하지 않습니다. 이로 인해 오류가 발생합니다.

이 문제를 우회하려면 다음 조건 중 하나를 충족합니다.

  1. terraform-user가 모든 하위 그룹 리소스를 만듭니다.
  2. terraform-user 사용자에게 subgroup-B의 Maintainer 또는 Owner 권한을 부여합니다.
  3. 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 중 하나에 액세스할 수 있는지 확인합니다.

  1. 해당 job의 CI/CD 환경 범위를 구성합니다.
  2. 이전 단계의 환경 범위와 일치하도록 job의 환경을 설정합니다.

상태 새로 고침 오류: HTTP 원격 상태 엔드포인트에 인증 필요#

이를 해결하려면 다음을 확인합니다.

  • 사용하는 액세스 토큰에 api 범위가 있어야 합니다.
  • TF_HTTP_PASSWORD CI/CD 변수를 설정했다면 다음 중 하나를 수행합니다.
    • TF_PASSWORD와 동일한 값으로 설정합니다.
    • CI/CD job에서 명시적으로 사용하지 않는다면 TF_HTTP_PASSWORD 변수를 제거합니다.

Developer 권한에 파괴적인 명령 액세스 허용#

Developer 권한을 가진 사용자가 파괴적인 명령을 실행하도록 허용하려면 다음 우회 방법이 필요합니다.

  1. api 범위로 프로젝트 액세스 토큰을 만듭니다.
  2. CI/CD 변수에 TF_USERNAME과 TF_PASSWORD를 추가합니다.
    1. TF_USERNAME 값을 프로젝트 액세스 토큰의 사용자 이름으로 설정합니다.
    2. TF_PASSWORD 값을 프로젝트 액세스 토큰의 비밀번호로 설정합니다.
    3. 선택 사항. 변수를 보호하여 보호된 브랜치나 보호된 태그에서 실행되는 파이프라인에서만 사용할 수 있도록 합니다.

상태 이름에 마침표가 포함되면 상태를 찾을 수 없음#

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#

이 오류는 상태 이름에 슬래시(/) 문자가 포함된 경우 발생할 수 있습니다. 이를 해결하려면 상태 이름에 슬래시(/) 문자가 포함되지 않았는지 확인합니다.

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의 세부 정보를 반환하지 않습니다. 이로 인해 오류가 발생합니다.

이 문제를 우회하려면 다음 조건 중 하나를 충족합니다.

  1. terraform-user가 모든 하위 그룹 리소스를 만듭니다.
  2. terraform-user 사용자에게 subgroup-B의 Maintainer 또는 Owner 권한을 부여합니다.
  3. 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 중 하나에 액세스할 수 있는지 확인합니다.

  1. 해당 job의 CI/CD 환경 범위를 구성합니다.
  2. 이전 단계의 환경 범위와 일치하도록 job의 환경을 설정합니다.

상태 새로 고침 오류: HTTP 원격 상태 엔드포인트에 인증 필요#

이를 해결하려면 다음을 확인합니다.

  • 사용하는 액세스 토큰에 api 범위가 있어야 합니다.
  • TF_HTTP_PASSWORD CI/CD 변수를 설정했다면 다음 중 하나를 수행합니다.
    • TF_PASSWORD와 동일한 값으로 설정합니다.
    • CI/CD job에서 명시적으로 사용하지 않는다면 TF_HTTP_PASSWORD 변수를 제거합니다.

Developer 권한에 파괴적인 명령 액세스 허용#

Developer 권한을 가진 사용자가 파괴적인 명령을 실행하도록 허용하려면 다음 우회 방법이 필요합니다.

  1. api 범위로 프로젝트 액세스 토큰을 만듭니다.
  2. CI/CD 변수에 TF_USERNAME과 TF_PASSWORD를 추가합니다.
    1. TF_USERNAME 값을 프로젝트 액세스 토큰의 사용자 이름으로 설정합니다.
    2. TF_PASSWORD 값을 프로젝트 액세스 토큰의 비밀번호로 설정합니다.
    3. 선택 사항. 변수를 보호하여 보호된 브랜치나 보호된 태그에서 실행되는 파이프라인에서만 사용할 수 있도록 합니다.

상태 이름에 마침표가 포함되면 상태를 찾을 수 없음#

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#

이 오류는 상태 이름에 슬래시(/) 문자가 포함된 경우 발생할 수 있습니다. 이를 해결하려면 상태 이름에 슬래시(/) 문자가 포함되지 않았는지 확인합니다.