S3バケットにファイルがあることを確認する

S3バケットにファイルがあることを確認する

このディレクトリには、/data/files/次の何千ものファイルがあります。

1test
2test
3test

[...]

60000test
60001test

AWS CLI.

/data/files/S3バケットのファイルがS3バケットにあるかどうかを確認できますか?不足しているファイルがS3にコピーされない場合はどうなりますか?

私はBASHを使ってこれを行うことを好みます。また、AWS CLI を別の CLI に変更する必要がある場合でも問題ありません。

答え1

aws s3 ls実際のファイル名でこれを行う場合。ファイル名がある場合、終了コードは0になり、ファイル名は表示されます。それ以外の場合、終了コードはゼロではありません。

aws s3 ls s3://bucket/filname
if [[ $? -ne 0 ]]; then
  echo "File does not exist"
fi

答え2

最初の答えは似ていますが、shebangで-eを使用するとスクリプトが失敗するので、最後に欲しいものです。単語数を使用するのが最善です。したがって、次のコマンドを使用できます。

wordcount=`aws s3 ls s3://${S3_BUCKET_NAME}/${folder}/|grep $${file}|wc -c`
echo wordcount=${wordcount}
if [[ "${wordcount}" -eq 0 ]]; then
do something
else
do something
fi

答え3

以下を試してください。

aws s3api head-object --bucket ${S3_BUCKET} --key ${S3_KEY}

検索するメタデータオブジェクト自体を検索しなくても、オブジェクトに関する情報を取得できます。読み取り(s3:オブジェクトのインポート)アクセスが必要です。 。

答え4

ファイルのサイズを知りたいのですが、ファイルが存在するかどうかを知りたいと思うかもしれません。

この関数はファイルサイズを取得し、エコーに「返す」。

s3_file_size() {
    if command -v aws &> /dev/null; then
        echo "$(aws s3 ls "${1}" --summarize | grep "Total.*Size" | grep -o -E '[0-9]+')"
        return 0
    else
        echo "Warn-${FUNCNAME[0]}, AWS command missing."
        return 1
    fi
}

この関数は他の関数を使用して、ファイルサイズが0のファイルを受け取ったことを確認します。これは、ファイルが本質的に存在しないことを意味します。 (はい、サイズ0のファイルは存在しないと見なされます)

s3_does_file_exist() {
    if command -v aws &> /dev/null; then
        [[ $(s3_file_size "${1}") -lt 1 ]] && return 1 || return 0
    else
        echo "Warn-${FUNCNAME[0]}, AWS command missing."
        return 1
    fi
}

関連情報