Terraform의 디버그 노하우(AWS시)

5375 단어 AWSTerraformdebugtech

이 페이지

  • Terraform의 디버깅 노하우 보존
  • 생각


    Terraform에서 오류가 발생한 경우 대략 7가지 모드(실제 6가지 모드)가 오류의 원인이다.위에서부터 차례대로 당할 확률이 높다.
    특히 4 이후에는 보기 드물죠.
  • Terraform의 실행 환경에 대한 질문
  • Terraform의 코드 문제
  • Terraform에서 제공한 대상(AWS 측)의 문제
  • Terraform 자체 질문
  • Terraform이 내부에서 사용하는 AWS SDK Go에 대한 질문
  • AWS의 API 문제->모르면 AWS에 문의
  • Go 언어의 문제(지금까지 거의 0, 적용되지 않음)
  • 분할 방법


    Terraform의 실행 환경 문제


    terraform-v에 버전이 나오면 실행 환경으로서 문제가 없습니다.
    이것이 나타나지 않을 때 환경 구축과terraform의 2진법 경로가 통과되지 않은 문제가 고려되어 확인되었다.

    Terraform 코드 문제

  • terraform validate 명령으로 문법 검사
  • terraform plan
    실행하면 대체로 해결될 것이다.
    Terraform 자체의 유효성도 부족하기 때문에 문제가 해결되지 않을 때도 있지만 플랜이 잘못 통과하지 않으면 기본적으로 문제없다
  • 또한Terraform의 쓰기 방법Terraform provider에 관한 문서에는 많은 쓰기 방법이 있다.

    Terraform에서 제공되는 객체(AWS 측)의 문제


    아마도 이것은 가장 많은 실수를 당한 것 같다.
    Terraform의 정의 파일이 정확하지만 오류가 발생했을 때 기본적으로 AWS 측의 제약으로 인한 오류입니다.
    예를 들어 특정 옵션의 조합은 AWS 측에서 허용하지 않는 오류입니다.
    오류 정보를 먼저 읽습니다.
    또한 이 메시지를 보내는 단계에서 테라form 내부에서 AWS API를 수행한 결과AWS용 API 문서가 자주 나오거나 AWS의 콘솔이 같은 조작을 할 때 오류가 발생했는지 확인하기 때문에 원인을 규명할 수 있다.

    Terraform 자체 질문


    여기서부터는 테라폼 내부의 말이라 너무 투덜거려도 메시지가 나오지 않는 경우가 많다.
    이것은 이른바 Terraform 측의 오류일 수 있습니다.
    이와 관련된 것은 주로 다음과 같은 세 개의 창고다.
    제각기

  • provider=>AWS 등 대상 자원에 대한 미리 설정된 처리가 기록되어 있으며, 대체적으로 여기를 보면 각 자원을 어떻게 창설/정의하는지 기록되어 있다

  • Terraform 호스트=>Terraform에서 통용되는 처리 플랜이나 apply 등이 적혀 있지만 주체가 원인이 되는 경우에는 그렇지 않아 우선도가 낮다

  • plugin sdk=>provider 측의 코드를 읽고 왜 이 처리를 통해 다양한 조작을 할 수 있는지 생각할 때가 있다.이 비밀은 이곳에서 정의된 것이 매우 많다.여기도 읽을 필요가 거의 없다.
  • 특히 provider 측 ISSUE와 Pull Request는 같은 문제가 있는지를 고려해 좋은 키워드를 고려해 검색한다.대체로 수사 대상의 자원을 집중하면 문제가 일람되는데, 여기도 없으면 새로운 문제가 생길 가능성이 높다.

    Terraform 내부에서 사용되는 AWS SDK Go의 문제


    * AWS의 경우
    Terraform provider aws에서 사용aws-sdk-go.2021/9/7에 V1을 사용합니다.이쪽 문제일 가능성도 있어.

    조사 방법


    Terraform provider aws측에서 자원을 어떻게 만드는지 조사한다.
    우선 이 자원에 기재된 코드를 찾아보세요.
    코드의 명명 규칙은
    /aws/resource_<검색할 자원 이름 >>.go
    그래서 찾기도 어렵지 않아요.
    예: Aurora의 인스턴스
    https://github.com/hashicorp/terraform-provider-aws/blob/main/aws/resource_aws_rds_cluster_instance.go
    관심사
    resourceAwsRDSClusterInstanceCreate
    위에서 말한 바와 같이 Create에 기재된 방법이 있는데 이것은 자원의 제작 처리이다.
    모든 자원 처리 코드는 기본적으로
  • 리소스의 정의(r e s Ource AwsRDSCluster Instance: Schema의 위치)
  • CRUD
    의 구성.
    따라서 자원 정의 정보를 확인하려면 Schema의 위치를 확인하고 제작 처리를 확인하려면 Create 방법을 확인합니다.
  • 그런 식으로 보면...
    https://github.com/hashicorp/terraform-provider-aws/blob/main/aws/resource_aws_rds_cluster_instance.go#L298
    확정하다
    		resp, err = conn.CreateDBInstance(createOpts)
    
    같은 conne.<어떤 방법>
    처리해.
    AWS SDK를 통해 AWS API를 호출하는 곳입니다.
    SDK 측에서 CreateDBInstance라는 코드를 호출하고 있습니다.
    실제로 aws-sdk-go 쪽에서.
    https://raw.githubusercontent.com/aws/aws-sdk-go/main/service/rds/api.go
    func (c *RDS) CreateDBInstance(input *CreateDBInstanceInput) (*CreateDBInstanceOutput, error) {
    	req, out := c.CreateDBInstanceRequest(input)
    	return out, req.Send()
    }
    
    같은 명칭의 방법이 있다.
    그리고 이 방법의 내용을 확인하고 설치 여부를 조사한다.

    AWS API 문제


    AWS SDK Go를 조사했으나 문제를 발견하지 못한 정황이 있다.
    이 경우 AWS SDK Go에서 호출된AWS API 정보를 확인한 뒤 끝내 이해하지 못하면 AWS 측에 원인을 묻는다.
    예컨대
    https://github.com/hashicorp/terraform-provider-aws/issues/20789
    의 경우 AWS SDK Go 측에 표시된 정의가 없어 AWS API 측의 처리를 더 조사해야 한다.
    https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_CreateHsm.html
    API의 정의 정보를 확인하면 원래 태그가 없음을 알 수 있습니다.

    총결산

  • Terraform에 문제가 발생하면terraform validate+plan으로Terraform의 쓰기에 문제가 있는지 조사
  • 여기서 오류가 발생하면 오류 메시지 읽기
  • 아직도 잘못된 정보의 뜻을 모르면 상당히 어려운 질문이 나올 수 있으니 먼저 여쭤볼게요.
    나는 차이가 많지 않으면 디버깅을 진행할 수 있을 것이라고 생각한다.
  • 좋은 웹페이지 즐겨찾기