InfoGrab Docs

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-1parent-group, subgroup-A, subgroup-B를 생성합니다.
  • subgroup-Asubgroup-B와 공유됩니다.
  • 사용자 terraform-user가 두 하위 그룹 모두에 대한 상속된 owner 액세스 권한으로 parent-group의 멤버입니다.

Terraform 상태가 새로 고침될 때 프로바이더가 발행한 API 쿼리 GET /groups/:subgroup-A_idshared_with_groups 배열에서 subgroup-B의 세부 정보를 반환하지 않습니다. 이로 인해 오류가 발생합니다.

이 문제를 해결하려면 다음 조건 중 하나를 충족해야 합니다:

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

  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_USERNAMETF_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_ADDRESSTF_HTTP_UNLOCK_ADDRESS가 설정되어 있는 경우 거기서도 상태 이름을 업데이트해야 합니다.

또는 OpenTofu 상태를 마이그레이션할 수 있습니다.

오류: 상태 저장: HTTP 오류: 404#

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

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-1parent-group, subgroup-A, subgroup-B를 생성합니다.
  • subgroup-Asubgroup-B와 공유됩니다.
  • 사용자 terraform-user가 두 하위 그룹 모두에 대한 상속된 owner 액세스 권한으로 parent-group의 멤버입니다.

Terraform 상태가 새로 고침될 때 프로바이더가 발행한 API 쿼리 GET /groups/:subgroup-A_idshared_with_groups 배열에서 subgroup-B의 세부 정보를 반환하지 않습니다. 이로 인해 오류가 발생합니다.

이 문제를 해결하려면 다음 조건 중 하나를 충족해야 합니다:

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

  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_USERNAMETF_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_ADDRESSTF_HTTP_UNLOCK_ADDRESS가 설정되어 있는 경우 거기서도 상태 이름을 업데이트해야 합니다.

또는 OpenTofu 상태를 마이그레이션할 수 있습니다.

오류: 상태 저장: HTTP 오류: 404#

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