`aws` CLI를 사용하여 AWS S3에서 반복적으로 객체 검색 및 다운로드

3503 단어 bashawss3
어제 프로젝트에서 (아주) 오래된 파일이 있는지 질문을 받았습니다. 그것들은 원래 우리의 프리랜서 중 한 명이 생성했는데, 그는 프로젝트가 끝날 때 보관을 위해 자신의 외장 드라이브 백업을 우리에게 제공했습니다.

이런 종류의 장기 저장에 대한 나의 선택은 AWS S3 또는 Glacier 입니다. 드라이브를 bucket에 백업하고 지금까지 잊고 있었습니다.
aws CLI는 모든 AWS 서비스에 대해 웹 콘솔이 할 수 있는 모든 작업을 수행할 수 있다는 점에서 강력하지만 이해하기 어렵습니다.

파일은 Sibelius(.sib)와 Clarinet, Flute 및 Sax에서 가져왔습니다. aws s3 list-objects command 에 대해 인터넷 검색을 해보세요.

검색어를 --query parameter에 결합하여 list-objects 호출의 결과를 제한할 수 있습니다. 검색은 대소문자를 구분하며 파일 이름이 원래 어떻게 지정되었는지 확신할 수 없었기 때문에 다음을 검색했습니다.

--query "Contents[?(contains(Key,'larinet') || contains(Key,'lute') || contains(Key,'ax')) && contains(Key,'.sib')]


Clarinet 또는 clarinet 등을 찾을 수 있는 가장 좋은 기회를 주기 위해 (CLARINET라는 이름은 좋지 않지만 어떤 종류의 괴물이 그렇게 할까요?)
get-object 호출을 위해 S3 객체에 대한 경로만 필요하므로 다음 항목만 필터링하겠습니다.

aws s3api list-objects --bucket "my-bucket-name" --prefix 'path/to/files/' --query "Contents[?(contains(Key,'larinet') || contains(Key,'lute') || contains(Key,'ax')) && contains(Key,'.sib')]"



이것은 다음과 같은 json 객체의 배열을 제공합니다.

[
    {
        "Key": "path/to/files/Project backup/Clarinets/example.sib",
        "LastModified": "2017-09-18T21:01:19+00:00",
        "ETag": "\"e9abc61fab413ec5de1126e7ab48ac38\"",
        "Size": 226180,
        "StorageClass": "STANDARD",
        "Owner": {
            "DisplayName": "owner-name",
            "ID": "d9fc4a52c54711ec9d640242ac120002f54ce640c54711ec9d640242ac120002"
        }
    },
    ...,
    ...,
]



그런 다음 이를 반복하여 파일을 다운로드할 수 있습니다. 하나의 디렉토리에 모두 덤프하는 대신 저장된 경로 구조를 복제해 보겠습니다.

# Get the list of objects to download - note that the Key search is case sensitive
# hence using larinet instead of clarinet or Clarinet, etc
aws s3api list-objects --bucket "my-bucket-name" --prefix 'path/to/files/' --query "Contents[?(contains(Key,'larinet') || contains(Key,'lute') || contains(Key,'ax')) && contains(Key,'.sib')]" > files.json

# loop through the list, grabbing each object, putting it in the relevant folder
cat files.json | jq -r '.[] | .Key'| while read key
  do dir="$(dirname "$key")"
     file="$(basename "$key")"     
     mkdir -p "$dir"
     aws s3api get-object --bucket "my-bucket-name" --key "$key" "${dir}"/"${file}"
  done

좋은 웹페이지 즐겨찾기