web-dev-qa-db-ja.com

AWS S3:bashを使用してバケットにファイルが存在するかどうかを確認する方法

特定のバケットに特定のファイルがあるかどうかを確認できるかどうかを知りたいです。

これは私が見つけたものです:

s3cmdを使用してファイルがS3バケットにあるかどうかを確認する

それは私の問題を解決するはずですが、何らかの理由で、ファイルが存在している間、ファイルが存在しないことを返し続けます。このソリューションも少し古く、doesObjectExistメソッドを使用しません。

Amazon S3 Webサービスで使用できるすべてのメソッドの概要

これにより、このメソッドの使用方法の構文が得られますが、動作させるようには思えません。

メソッドのステータスを保存するためにブール変数を作成することを期待していますか?または関数は出力を直接与えるか、エラーをスローしますか?

これは、bashスクリプトで現在使用しているコードです。

existBool=doesObjectExist(${BucketName}, backup_${DomainName}_${CurrentDate}.Zip)

if $existBool ; then
        echo 'No worries, the file exists.'
fi

完全なパスを指定する代わりに、ファイルの名前のみを使用してテストしました。しかし、私が取得しているエラーは構文エラーなので、おそらくそれを間違って使用しているだけでしょう。

誰かが私を助けて、私が間違っていることを教えてくれることを願っています。

!編集

doesObjectExistの使用は最速でも簡単でもないので、これを行う別の方法を探しました。

18
J. Swaelen

前回、パフォーマンスの比較を見ましたgetObjectMetadataは、オブジェクトが存在するかどうかを確認する最も速い方法でした。 head-object メソッド、例:

aws s3api head-object --bucket www.codeengine.com --key index.html

返されるもの:

{
    "AcceptRanges": "bytes",
    "ContentType": "text/html; charset=utf-8",
    "LastModified": "Sun, 08 Jan 2017 22:49:19 GMT",
    "ContentLength": 38106,
    "ContentEncoding": "gzip",
    "ETag": "\"bda80810592763dcaa8627d44c2bf8bb\"",
    "StorageClass": "REDUCED_REDUNDANCY",
    "CacheControl": "no-cache, no-store",
    "Metadata": {}
}
18
Dave Maple

「aws s3 ls」は、答えが受け入れられたとしても、まったく機能しないことに注意してください。特定のオブジェクトキーではなく、プレフィックスで検索します。誰かがファイル名の末尾に「1」を追加してファイルの名前を変更したときに、これが難しい方法であることがわかりましたが、存在チェックはまだTrueを返します。

(これをコメントとして追加しようとしましたが、まだ十分な担当者がいません。)

13
Michael Glenn

1つの簡単な方法は、aws s3 ls

exists=$(aws s3 ls $path_to_file)
if [ -z "$exists" ]; then
  echo "it does not exist"
else
  echo "it exists"
fi
7
traceformula

@DaveMapleと@MichaelGlennの回答に従って、私が使用している条件は次のとおりです。

aws s3api head-object --bucket <some_bucket> --key <some_key> || not_exist=true
if [ $not_exist ]; then
  echo "it does not exist"
else
  echo "it exists"
fi
4
ItayB