go-getter는 URL을 기본 입력 형식으로 사용하여 다양한 소스에서 파일이나 디렉터리를 다운로드하기 위한 Go(golang)용 라이브러리입니다.
이 라이브러리의 장점은 단일 문자열을 입력으로 사용하여 다양한 소스(파일 경로, Git, HTTP, Mercurial 등)에서 다운로드할 수 있다는 점입니다. 이는 구현자로부터 다양한 소스로부터 다운로드하는 방법을 알아야 하는 부담을 덜어줍니다.
감지기 의 개념은 유효하지 않은 URL을 적절한 URL로 자동으로 변환합니다. 예를 들어 "github.com/hashicorp/go-getter"는 Git URL로 변환됩니다. 또는 "./foo"가 파일 URL로 변환됩니다. 이는 확장 가능합니다.
이 라이브러리는 Terraform에서 모듈을 다운로드하는 데 사용되며 Nomad에서는 바이너리를 다운로드하는 데 사용됩니다.
패키지 설명서는 GoDoc에서 찾을 수 있습니다.
일반적인 go get
으로 설치를 완료할 수 있습니다.
$ go get github.com/hashicorp/go-getter
go-getter에는 URL 문자열을 테스트하는 데 사용할 수 있는 명령도 있습니다.
$ go install github.com/hashicorp/go-getter/cmd/go-getter ... $ go-getter github.com/foo/bar ./foo ...
이 명령은 URL 구조를 확인하는 데 유용합니다.
사용자가 제공한 URL에서 리소스를 가져오는 것은 본질적으로 위험한 작업이며 애플리케이션이 서버 측 요청 위조, 경로 탐색, 서비스 거부 또는 기타 보안 결함에 취약해질 수 있습니다.
go-getter에는 이러한 보안 문제 중 일부에 대한 완화 기능이 포함되어 있지만 보안이 중요한 상황에서는 여전히 주의해서 사용해야 합니다. 이러한 위험 중 일부를 완화하기 위해 구성할 수 있는 사용 가능한 보안 옵션을 확인하세요.
go-getter는 민감한 데이터를 포함할 수 있는 호출자 제공 쿼리 매개변수가 포함된 값을 반환할 수 있습니다. 어떤 매개변수가 민감하고 민감하지 않은지에 대한 컨텍스트는 go-getter 호출자에게만 알려져 있으며 각 사용 사례에 따라 다릅니다. 민감한 데이터가 로그에 유지되지 않도록 호출자는 go-getter의 반환 값(예: 오류 메시지)이 적절하게 처리되고 삭제되었는지 확인하는 것이 좋습니다.
go-getter는 단일 문자열 URL을 입력으로 사용하여 다양한 프로토콜에서 다운로드합니다. go-getter에는 특정 작업을 수행하기 위해 이 URL을 사용하는 다양한 "트릭"이 있습니다. 이 섹션에서는 URL 형식을 설명합니다.
프로토콜은 특정 메커니즘을 사용하여 파일/디렉터리를 다운로드하는 데 사용됩니다. 예제 프로토콜은 Git 및 HTTP입니다.
감지기는 유효하거나 유효하지 않은 URL이 특정 패턴과 일치하는 경우 다른 URL로 변환하는 데 사용됩니다. 예: "github.com/user/repo"는 완전히 유효한 Git URL로 자동 변환됩니다. 이를 통해 go-getter는 매우 사용자 친화적이 될 수 있습니다.
go-getter는 기본적으로 다음 프로토콜을 지원합니다. Getter
인터페이스를 구현하여 런타임에 추가 프로토콜을 확장할 수 있습니다.
로컬 파일
힘내
수은제
HTTP
아마존 S3
구글 GCP
위의 프로토콜 외에도 go-getter에는 "탐지기"라는 것이 있습니다. 이는 URL을 가져와 이에 가장 적합한 프로토콜을 자동으로 선택하려고 시도하며, 여기에는 프로토콜 변경도 포함될 수 있습니다. 다음 탐지는 기본적으로 내장되어 있습니다.
"./foo"와 같은 파일 경로는 자동으로 절대 파일 URL로 변경됩니다.
"github.com/mitchellh/vagrant"와 같은 GitHub URL은 HTTP를 통해 자동으로 Git 프로토콜로 변경됩니다.
"gitlab.com/inkscape/inkscape"와 같은 GitLab URL은 HTTP를 통해 자동으로 Git 프로토콜로 변경됩니다.
"bitbucket.org/mitchellh/vagrant"와 같은 BitBucket URL은 BitBucket API를 사용하여 Git 또는 수은 프로토콜로 자동 변경됩니다.
소스 URL에 따라 사용할 프로토콜이 모호한 경우도 있습니다. 예를 들어 "http://github.com/mitchellh/vagrant.git"은 HTTP URL 또는 Git URL을 참조할 수 있습니다. 강제 프로토콜 구문은 이 URL을 명확하게 하는 데 사용됩니다.
강제 프로토콜은 URL 앞에 프로토콜과 이중 콜론을 붙여 수행할 수 있습니다. 예를 들어: git::http://github.com/mitchellh/vagrant.git
Git 프로토콜을 사용하여 지정된 HTTP URL을 다운로드합니다.
강제 프로토콜은 모든 감지기를 재정의합니다.
강제 프로토콜이 없으면 탐지기가 URL에서 실행되어 어쨌든 프로토콜을 변환할 수 있습니다. 위의 예에서는 Git 탐지기가 GitHub URL임을 감지했기 때문에 Git 프로토콜을 어느 쪽이든 사용했을 것입니다.
각 프로토콜은 해당 프로토콜을 구성하기 위한 프로토콜별 옵션을 지원할 수 있습니다. 예를 들어, git
프로토콜은 해당 Git 저장소에 대해 체크아웃할 참조를 알려주는 ref
쿼리 매개변수 지정을 지원합니다.
옵션은 go-getter에 제공된 URL(또는 URL과 유사한 문자열)에 쿼리 매개변수로 지정됩니다. 위의 Git 예제를 사용하면 아래 URL은 go-getter에 대한 유효한 입력입니다.
github.com/hashicorp/go-getter?ref=abcd1234
프로토콜별 옵션은 URL 형식 섹션 아래에 설명되어 있습니다. 그러나 이는 URL의 일부이기 때문에 여기에 표시하여 해당 항목이 존재한다는 것을 알 수 있습니다.
다운로드한 디렉터리에서 특정 하위 디렉터리만 다운로드하려면 이중 슬래시 //
뒤에 하위 디렉터리를 지정하면 됩니다. go-getter는 먼저 이중 슬래시 앞에 지정된 URL을 다운로드합니다(이중 슬래시를 지정하지 않은 것처럼). 그런 다음 이중 슬래시 뒤의 경로를 대상 디렉터리에 복사합니다.
예를 들어 이 GitHub 리포지토리를 다운로드하지만 testdata
디렉터리만 다운로드하려는 경우 다음을 수행할 수 있습니다.
https://github.com/hashicorp/go-getter.git//testdata
이것을 /tmp
디렉토리에 다운로드했다면 /tmp/archive.gz
파일이 존재할 것입니다. 이 파일은 이 저장소의 testdata
디렉토리에 있지만 하위 디렉토리를 지정했기 때문에 go-getter는 해당 디렉토리 내용만 자동으로 복사했습니다.
하위 디렉터리 경로는 파일 시스템 glob 패턴을 사용할 수도 있습니다. 경로는 정확히 하나의 항목과 일치해야 합니다. 그렇지 않으면 go-getter가 오류를 반환합니다. 이는 정확한 디렉토리 이름은 확실하지 않지만 예측 가능한 명명 구조를 따르는 경우에 유용합니다.
예를 들어 다음 URL도 작동합니다.
https://github.com/hashicorp/go-getter.git//test-*
모든 프로토콜의 파일 다운로드에 대해 go-getter는 자동으로 체크섬을 확인할 수 있습니다. 체크섬은 디렉터리가 아닌 파일 다운로드에만 작동하지만 체크섬은 모든 프로토콜에서 작동합니다.
파일을 체크섬하려면 checksum
쿼리 매개변수를 URL에 추가하세요. go-getter는 이 쿼리 매개변수를 자동으로 구문 분석하고 이를 사용하여 체크섬을 확인합니다. 매개변수 값은 type:value
또는 value
형식일 수 있습니다. 여기서 type은 "md5", "sha1", "sha256", "sha512" 또는 "file" 입니다. "값"은 실제 체크섬 값이거나 "파일"에 대한 다운로드 URL이어야 합니다. type
부분을 생략하면 체크섬 문자열의 길이를 기준으로 유형을 추측합니다. 예:
./foo.txt?checksum=md5:b7d96c89d09d9e204f5fedc4d5d55b21
./foo.txt?checksum=b7d96c89d09d9e204f5fedc4d5d55b21
./foo.txt?checksum=file:./foo.txt.sha256sum
파일에서 체크섬을 계산할 때(예: checksum=file:url
사용) go-getter는 동일한 구성을 사용하여 file:
뒤에 URL에 링크된 파일을 가져옵니다. 예를 들어 file:http://releases.ubuntu.com/cosmic/MD5SUMS
go-getter는 http 프로토콜을 사용하여 앞서 언급한 URL 아래에 체크섬 파일을 다운로드합니다. go-getter가 지원하는 모든 프로토콜을 사용할 수 있습니다. 체크섬 파일은 임시 파일로 다운로드된 후 구문 분석됩니다. 임시 파일의 대상은 시스템별 환경 변수를 설정하여 변경할 수 있습니다. unix의 경우 TMPDIR
; Windows에서는 TMP
, TEMP
또는 USERPROFILE
. 임시 디렉터리 선택에 대한 자세한 내용은 os.TempDir의 godoc를 읽어보세요. 파일 내용은 BSD 또는 GNU 스타일이어야 합니다. 체크섬 파일로 Go-getter가 완료되면; 삭제되었습니다.
체크섬 쿼리 매개변수는 백엔드 프로토콜 구현으로 전송되지 않습니다. Go-getter 자체가 더 높은 수준에서 사용합니다.
대상 파일이 존재하고 체크섬이 일치하는 경우: 다운로드를 건너뜁니다.
go-getter는 요청된 파일의 확장명에 따라(모든 프로토콜을 통해) 파일을 파일이나 디렉터리에 자동으로 보관 해제합니다. 이는 파일 및 디렉터리 다운로드 모두에 적용됩니다.
go-getter는 아카이브 형식을 지정하기 위해 archive
쿼리 매개변수를 찾습니다. 지정되지 않은 경우 go-getter는 경로 확장자를 사용하여 해당 경로가 보관된 것으로 나타나는지 확인합니다. archive
쿼리 매개변수를 false
로 설정하여 보관 취소를 명시적으로 비활성화할 수 있습니다.
다음 아카이브 형식이 지원됩니다.
tar.gz
및 tgz
tar.bz2
및 tbz2
tar.xz
및 txz
zip
gz
bz2
xz
예를 들어, 예제 URL은 다음과 같습니다.
./foo.zip
이는 자동으로 ZIP 파일로 추론되어 추출됩니다. 아카이브 유형을 명시적으로 지정할 수도 있습니다.
./some/other/path?archive=zip
마지막으로 보관을 완전히 비활성화할 수 있습니다.
./some/path?archive=false
보관 취소를 체크섬과 같은 go-getter의 다른 기능과 결합할 수 있습니다. 특수 archive
쿼리 매개변수는 최종 프로토콜 다운로더로 이동하기 전에 URL에서 제거됩니다.
이 섹션에서는 go-getter에 대해 지정할 수 있는 프로토콜별 옵션을 문서화합니다. 이러한 옵션은 일반 쿼리 매개변수로 입력에 추가되어야 합니다(단, HTTP 헤더는 예외입니다). go-getter의 사용에 따라 응용 프로그램은 옵션을 입력하는 대체 방법을 제공할 수 있습니다. 예를 들어 Nomad는 URL이 아닌 옵션을 지정하기 위한 멋진 옵션 블록을 제공합니다.
아래 옵션은 모든 프로토콜에 사용할 수 있습니다.
archive
- 이 파일을 보관 취소하는 데 사용할 보관 형식 또는 보관 취소를 비활성화하려면 ""(빈 문자열)입니다. 자세한 내용은 위의 아카이브 지원에 대한 전체 섹션을 참조하세요.
checksum
- 다운로드한 파일이나 아카이브를 확인하기 위한 체크섬입니다. 형식과 자세한 내용은 위의 체크섬에 대한 전체 섹션을 참조하세요.
filename
- 파일 다운로드 모드에 있을 때 디스크에 다운로드된 파일의 이름을 지정할 수 있습니다. 디렉터리 모드에서는 효과가 없습니다.
file
)없음
git
) ref
- 결제할 Git 참조입니다. 이는 참조이므로 커밋 SHA, 분기 이름 등을 가리킬 수 있습니다. 분기 이름과 같은 명명된 참조인 경우 go-getter는 이를 각 가져오기에서 최신으로 업데이트합니다.
sshkey
- 복제 중에 사용할 SSH 개인 키입니다. 제공된 키는 base64로 인코딩된 문자열이어야 합니다. 예를 들어 디스크의 개인 키 파일에서 적합한 sshkey
생성하려면 base64 -w0
실행합니다.
참고 : 이 기능을 사용하려면 Git 2.3 이상이 필요합니다.
depth
- Git 복제 깊이입니다. 제공된 숫자는 저장소에서 복제할 마지막 n
개 개정을 지정합니다.
git
getter는 git::ssh://[email protected]/foo/bar
와 같은 URL 스타일 SSH 주소와 git::[email protected]/foo/bar
와 같은 "scp 스타일" 주소를 모두 허용합니다. 후자의 경우 사용자 이름 접두사가 정확히 git@
이면 git::
force 접두사 생략이 허용됩니다.
"scp 스타일" 주소는 ssh://
체계 접두사와 함께 사용할 수 없습니다 . 이 경우 콜론은 호스트로부터 경로를 구분하는 대신 연결할 선택적 포트 번호를 표시하는 데 사용되기 때문입니다.
hg
) rev
- 체크아웃할 Mercurial 개정판입니다.
http
) go-getter와 함께 HTTP 기본 인증을 사용하려면 https://Aladdin:[email protected]/index.html
과 같은 URL의 호스트 이름 앞에 username:password@
추가하면 됩니다. 사용자 이름과 비밀번호를 포함한 모든 특수 문자는 URL로 인코딩되어야 합니다.
선택적 요청 헤더는 사용자 정의 HttpGetter
에 제공하여 추가할 수 있습니다(대부분의 다른 옵션과 같은 쿼리 매개변수가 아님 ). 이 헤더는 문제의 getter가 요청하는 모든 요청에 대해 전송됩니다.
s3
)S3는 URL에서 다양한 액세스 구성을 사용합니다. 설정된 경우 표준 AWS 환경 변수에서도 이를 읽습니다. Minio와 같은 S3 호환 서버도 지원됩니다. 쿼리 매개변수가 있는 경우 이 매개변수가 우선순위를 갖습니다.
aws_access_key_id
- AWS 액세스 키입니다.
aws_access_key_secret
- AWS 액세스 키 비밀입니다.
aws_access_token
- AWS 액세스 토큰이 사용되는 경우입니다.
aws_profile
- 로컬 ~/.aws/config에서 이 프로필을 사용합니다. 다른 세 가지보다 우선합니다.
go-getter를 사용하고 자격 증명 사용을 피하기 위해 EC2 IAM 인스턴스 프로필을 사용하려는 경우 이를 생략하면 해당 프로필이 사용 가능한 경우 자동으로 사용됩니다.
Minio 지원을 위해 go-gitter를 사용하는 경우 다음 사항을 고려해야 합니다.
aws_access_key_id
(필수) - Minio 액세스 키입니다.
aws_access_key_secret
(필수) - Minio 액세스 키 비밀입니다.
region
(선택 사항 - 기본값은 us-east-1) - 사용할 지역 식별자입니다.
version
(선택 사항 - 기본값은 Minio 기본값) - 구성 파일 형식입니다.
S3에는 버킷을 참조하는 데 사용되는 여러 주소 지정 체계가 있습니다. 이는 https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-bucket-intro.html에 나열되어 있습니다.
이러한 주소 지정 체계에 대한 몇 가지 예는 다음과 같습니다.
s3::https://s3.amazonaws.com/bucket/foo
s3::https://s3-eu-west-1.amazonaws.com/bucket/foo
bucket.s3.amazonaws.com/foo
bucket.s3-eu-west-1.amazonaws.com/foo/bar
"s3::http://127.0.0.1:9000/test-bucket/hello.txt?aws_access_key_id=KEYID&aws_access_key_secret=SECRETKEY®ion=us-east-2"
gcs
)GCS에 접속하기 위해서는 인증정보를 제공해야 합니다. 자세한 내용은 여기에서 확인할 수 있습니다.
gcs::https://www.googleapis.com/storage/v1/bucket
gcs::https://www.googleapis.com/storage/v1/bucket/foo.zip
www.googleapis.com/storage/v1/bucket/foo
get_gcs.go
테스트를 위해서는 환경에 GCP 사용자 인증 정보가 설정되어 있어야 합니다. 이러한 자격 증명은 모든 프로젝트에 대해 모든 수준의 권한을 가질 수 있으며 존재하기만 하면 됩니다. 이는 GOOGLE_APPLICATION_CREDENTIALS="~/path/to/credentials.json"
또는 GOOGLE_CREDENTIALS="{stringified-credentials-json}"
설정을 의미합니다. 이 구성으로 인해 CircleCI의 외부 기여자에 대한 get_gcs_test.go
실패합니다.
Symlink 비활성화
getter 클라이언트 구성에서는 Symlink(디렉토리 외부를 가리킬 수 있음)를 통해 쓰거나 복사하는 것을 방지하는 DisableSymlinks
옵션을 사용하는 것이 좋습니다.
client := getter.Client{ // 심볼릭 링크를 통해 파일을 복사하거나 쓰는 것을 방지합니다. 비활성화Symlinks: true, }
X-Terraform-Get
비활성화 또는 제한
Go-Getter는 X-Terraform-Get
헤더를 통한 임의 리디렉션을 지원합니다. 이 기능은 Terraform 사용 사례를 지원하기 위해 존재하지만 대부분의 애플리케이션에는 필요하지 않을 수 있습니다.
HttpGetter
를 사용하는 코드의 경우 다음 구성 옵션을 추가합니다.
var httpGetter = &getter.HttpGetter{ // 대부분의 클라이언트는 X-Terraform-Get을 비활성화해야 합니다. // 아래 참고 사항을 참조하십시오. XTerraformGetDisabled: true, // 소프트웨어는 X-Terraform-Get에 의존하지 않을 수도 있지만 // 의존하는 경우 , 위 필드를 false로 설정하고 // XTerraformGet Limit을 설정하여 끝없는 리디렉션을 방지해야 합니다. // XTerraformGetLimit: 10,}
시간 초과 적용
HttpGetter
시간 초과 및 기타 리소스 제한 구성 옵션을 지원합니다. GitGetter
및 HgGetter
시간 초과만 지원합니다.
HttpGetter
구성:
var httpGetter = &getter.HttpGetter{ // HEAD 요청 프리패치 비활성화 DoNotCheckHeadFirst: true, // 위 설정에 대한 대안으로 // HEAD 요청에 대한 합리적인 시간 제한을 설정할 수 있습니다. // HeadFirstTimeout: 10 * time.Second, // HTTP 작업에 대한 읽기 시간 제한 ReadTimeout: 30 * time.Second, // // getter가 읽을 수 있는 최대 바이트 수 MaxBytes: 500000000, // 500MB}
GitGetter
또는 HgGetter
사용하는 코드의 경우 Timeout
옵션을 설정합니다.
var gitGetter = &getter.GitGetter{ // git 작업에 대한 합리적인 시간 초과 설정 시간 초과: 5 * time.Minute, }
var hgGetter = &getter.HgGetter{ // hg 작업에 대한 합리적인 시간 초과 설정 시간 초과: 5 * time.Minute, }