S3 CLI에서 마지막으로 수정 된 객체 가져 오기


80

프로그래밍 방식으로 EC2 인스턴스를 불러오고 S3에서 복사 및 실행 파일을 실행하고 인스턴스를 종료하는 사용 사례가 있습니다 (사용자 데이터에서 수행됨). S3에서 마지막으로 추가 된 파일 만 가져 오면됩니다. CLI를 사용하여 S3 버킷에서 마지막으로 수정 된 파일 / 객체를 가져 오는 방법이 있습니까?


프로그래밍 언어를 전혀 포함시킬 수 있습니까?
Drew

CLI는 인스턴스 시작 중에 사용자 데이터에 포함 할 계획이므로 최상의 옵션이 될 것입니다.
wishy 2015-06-26

s3로 어떤 언어로 프로그래밍합니까?
드류

1
2 백만 개 이상의 객체가있는 버킷에 대한 더 나은 솔루션이 있습니까?
lonewarrior556

1
많은 객체의 경우 더 나은 해결책은 Event/Lambda에서 트리거되는 객체 를 만드는 것 입니다 ObjectCreation. s3 cli 또는 api를 사용하여 2M + 객체 중 마지막 객체를 가져 오는 것은 속도가 느려집니다.
Vaulstein

답변:


174

다음을 사용하여 버킷의 모든 객체를 나열 할 수 있습니다 aws s3 ls $BUCKET --recursive.

$ aws s3 ls $BUCKET --recursive
2015-05-05 15:36:17          4 an_object.txt
2015-06-08 14:14:44   16322599 some/other/object
2015-04-29 12:09:29      32768 yet-another-object.sh

키를 기준으로 알파벳순으로 정렬되지만 첫 번째 열이 마지막으로 수정 된 시간입니다. 빠른 sort날짜순으로 다시 정렬합니다.

$ aws s3 ls $BUCKET --recursive | sort
2015-04-29 12:09:29      32768 yet-another-object.sh
2015-05-05 15:36:17          4 an_object.txt
2015-06-08 14:14:44   16322599 some/other/object

tail -n 1마지막 행을 선택하고 awk '{print $4}'네 번째 열 (객체 이름)을 추출합니다.

$ aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'
some/other/object

마지막으로 aws s3 cp, 객체를 다운로드하려면 다음을 입력하십시오.

$ KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'`
$ aws s3 cp s3://$BUCKET/$KEY ./latest-object

2
화려한 포스트. 각 명령에 대한 설명으로 인해 특히 유용합니다. 감사.
Christian

4
S3는 키로 만 객체를 인덱싱합니다. 버킷에 원하는 객체를 찾기위한 "전체 테이블 스캔"이 비실용적 일 정도로 충분한 객체가있는 경우 별도의 인덱스를 직접 작성해야합니다. 내가 생각할 수있는 가장 게으른 옵션은 가장 최근에 작성된 객체의 키를 작성한 후 s3 : // $ BUCKET / current에 넣고 독자가 가져와야 할 항목을 찾아 보도록하는 것입니다.
David Murray

당신은 전체 "폴더"에 대한 같은 것을 원한다면 그냥 보조 노트는, awk(대신 4의) 두 번째 요소를 선택해야하고 --recursive, 예를 들어, 필요한 것KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $2}'` ; aws s3 cp s3://$BUCKET/$KEY ./latest-object --recursive
데이비드 Arenburg에게

3
1000 개가 넘는 항목이있는 버킷에서는 이것이 작동하지 않습니다. docs.aws.amazon.com/cli/latest/reference/s3/ls.html
nico

이 라인은 작동하지 않습니다 aws s3 cp s3://$BUCKET/$KEY ./latest-object이전 스크립트가 돌아갑니다"object"
Madeo

23

잠시 후 약간 우아하게 수행하는 방법에 대한 작은 업데이트가 있습니다.

aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'sort_by(Contents, &LastModified)[-1].Key' --output=text

추가 reverse기능 대신 다음을 통해 목록에서 마지막 항목을 가져올 수 있습니다.[-1]

이전 답변 :

이 명령은 외부 종속성없이 작업을 수행합니다.

aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'reverse(sort_by(Contents, &LastModified))[:1].Key' --output=text

3
우수한. 특정 문자열과 일치하기 위해 객체 이름도 필요한 경우 :--query 'reverse(sort_by(Contents[?contains(Key, `myKey`)], &LastModified))[:1].Key'
bfcapell

5
--query는 로컬에서 실행되므로 버킷에 1000 개 이상의 파일이있는 경우 마지막으로 수정 된 파일을 먼저 가져 오지 않을 수 있습니다.
Gismo Ranas

@GismoRanas 좋은 지적입니다. 정규 --filter옵션 목록을 줄이기 위해 적용 할 수 있습니다
로마 시시 킨을

11
aws s3api list-objects-v2 --bucket "bucket-name" |jq  -c ".[] | max_by(.LastModified)|.Key"

당신이 전에 JQ 만난 적이 없다면, 그것은 JSON 프로세서의 stedolan.github.io/jq
앤드류 로리엔

3
내 생각 list-objects-v2버킷 그 이상 개체가 그렇다면, 최대 항목에 제한이 -이 정확한 답변을 얻지 못할 수도
길 라드 벨렉

docs.aws.amazon.com/cli/latest/reference/s3api/… 는 페이지 당 최대 제한 이 1000 임을 명시합니다 (이 문서 작성 시점) . 또한 IsTruncated반환 할 키가 더 많은 경우 출력이 true로 설정되어 있습니다.
아슈 JINDAL

2

다음은 S3 버킷에서 최신 파일을 다운로드하는 bash 스크립트입니다. 대신 AWS S3 Synch 명령을 사용하여 이미있는 경우 S3에서 파일을 다운로드하지 않았습니다.

--exclude, 모든 파일을 제외합니다.

--include, 패턴과 일치하는 모든 파일 포함

#!/usr/bin/env bash

    BUCKET="s3://my-s3-bucket-eu-west-1/list/"
    FILE_NAME=`aws s3 ls $BUCKET  | sort | tail -n 1 | awk '{print $4}'`
    TARGET_FILE_PATH=target/datdump/
    TARGET_FILE=${TARGET_FILE_PATH}localData.json.gz

    echo $FILE_NAME
    echo $TARGET_FILE

    aws s3 sync $BUCKET $TARGET_FILE_PATH --exclude "*" --include "*$FILE_NAME*"

    cp target/datdump/$FILE_NAME $TARGET_FILE

ps 감사합니다 @David Murray


1

새로 업로드 된 파일 인 경우 Lambda 를 사용 하여 새 S3 객체에서 코드를 실행할 수 있습니다 .

가장 최근 파일을 가져와야하는 경우 먼저 날짜로 파일 이름을 지정하고 이름별로 정렬 한 다음 첫 번째 개체를 가져올 수 있습니다.


2
안타깝게도 새로 업로드 된 파일이 아닙니다. 언제든지 업로드 할 수있는 마지막 업로드 파일이 필요합니다.
wishy 2015-06-26
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.