S3 CLI से अंतिम संशोधित वस्तु प्राप्त करें


80

मेरे पास एक उपयोग का मामला है जहां मैं क्रमिक रूप से S3 से एक EC2 उदाहरण, कॉपी और निष्पादन योग्य फ़ाइल ला रहा हूं, इसे चलाएं और उदाहरण को बंद कर दें (उपयोगकर्ता-डेटा में किया गया)। मुझे S3 से केवल अंतिम जोड़ी गई फ़ाइल प्राप्त करने की आवश्यकता है। क्या CLI का उपयोग करके S3 बाल्टी से अंतिम संशोधित फ़ाइल / ऑब्जेक्ट प्राप्त करने का कोई तरीका है?


क्या आप सभी में एक प्रोग्रामिंग भाषा शामिल कर सकते हैं
आकर्षित

उदाहरण के लॉन्च के दौरान उपयोगकर्ता-डेटा में होने की योजना के बाद से सीएलआई सबसे अच्छा विकल्प होगा।
इच्छाधारी ६

क्या आप s3 के साथ किसी भी भाषा में प्रोग्राम करते हैं?
ड्रयू

1
क्या 2M + वस्तुओं के साथ बाल्टी के लिए एक बेहतर समाधान है?
lonewarrior556

1
बहुत सी वस्तुओं के लिए, मुझे लगता है कि एक बेहतर समाधान Event/Lambdaउस वस्तु पर बनाना होगा जो चालू हो जाता है ObjectCreation। S3 cli या api का उपयोग करके 2M + ऑब्जेक्ट के बीच अंतिम ऑब्जेक्ट को धीमा करने का तरीका है।
वालस्टीन

जवाबों:


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
शानदार पोस्ट। प्रत्येक कमांड के स्पष्टीकरण के कारण विशेष रूप से उपयोगी है। धन्यवाद।
क्रिश्चियन

4
S3 केवल कुंजी द्वारा ऑब्जेक्ट्स को अनुक्रमित करता है। यदि बाल्टी में पर्याप्त वस्तुएं हैं जो आपके द्वारा खोजे जा रहे अव्यवहारिक को खोजने के लिए "पूर्ण तालिका स्कैन" है, तो आपको अपने स्वयं के अलग सूचकांक बनाने की आवश्यकता होगी। मेरे द्वारा सबसे हाल ही में लिखी गई वस्तु की कुंजी को s3: // $ BUCKET / करंट में डालने के बाद जो सबसे बड़ा विकल्प है, उसके बारे में सोच सकते हैं, और पाठकों को यह देखने के लिए देखना होगा कि उन्हें कौन सा खींचना चाहिए।
डेविड मरे

बस एक साइड नोट, यदि आप पूरे "फ़ोल्डर" के लिए एक ही चीज़ चाहते हैं, तो आपको 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
डेविड अरनबर्ग

3
यह 1000 से अधिक वस्तुओं के साथ बाल्टियों पर काम नहीं करेगा, क्योंकि यह सबसे अधिक है जो डॉक्स .aws.amazon.com
nico

यह लाइन काम नहीं करेगी aws s3 cp s3://$BUCKET/$KEY ./latest-objectपिछली स्क्रिप्ट वापस आ जाएगी"object"
मेडो

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
-क्वेरी को स्थानीय रूप से निष्पादित किया जाता है, इसलिए यदि आपके पास बाल्टी में 1000 से अधिक फाइलें हैं, तो आपको अंतिम संशोधित लोगों को पहले प्राप्त करने की गारंटी नहीं है।
जिस्मो राणा

@GismoRanas अच्छा बिंदु। --filterएक सूची को कम करने के लिए नियमित विकल्प लागू किया जा सकता है
रोमन शिस्किन

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

अगर आपने पहले कभी jq से मुलाकात नहीं की है, तो यह एक json processor है stedolan.github.io/jq
andrew lorien

3
मुझे लगता list-objects-v2है कि अधिकतम वस्तुओं पर सीमा होती है, इसलिए यदि आपकी बाल्टी में इससे अधिक वस्तुएं हैं - तो इसका सटीक उत्तर नहीं मिल सकता है
गिल्ड पेलेग

docs.aws.amazon.com/cli/latest/reference/s3api/… (इस लेखन के रूप में) बताता है कि प्रति पृष्ठ अधिकतम सीमा 1000 है। यह भी ध्यान रखें कि IsTruncatedयदि वापसी के लिए अधिक कुंजियाँ उपलब्ध हैं, तो आउटपुट सही पर सेट है।
आशुतोष जिंदल

2

निम्नलिखित बैश स्क्रिप्ट है, जो S3 बाल्टी से नवीनतम फ़ाइल डाउनलोड करता है। मैंने 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 धन्यवाद @ दाविद मरे


1

यदि यह एक ताज़ा अपलोड की गई फ़ाइल है, तो आप नई S3 ऑब्जेक्ट पर कोड का एक टुकड़ा निष्पादित करने के लिए लैम्ब्डा का उपयोग कर सकते हैं ।

यदि आपको वास्तव में सबसे हाल ही में प्राप्त करने की आवश्यकता है, तो आप पहले तारीख के साथ फाइल को नाम दे सकते हैं, नाम से क्रमबद्ध कर सकते हैं, और पहली वस्तु ले सकते हैं।


2
यह दुर्भाग्य से एक ताजा अपलोड की गई फ़ाइल नहीं है। मुझे अंतिम अपलोड की गई फ़ाइल की आवश्यकता होगी जो कभी भी अपलोड की जा सकती थी।
इच्छाधारी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.