Как убедиться, что префиксы S3 совпадают при создании из консоли против CLI? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть следующая структура папок, которую я хотел бы создать в S3,

/demo/app/a.txt

через консоль:

demo и app, используя « Создать папку », после чего a.txt загрузка файла

через CLI:

aws s3 sync . s3://<my-bucket>/, где . ( текущий каталог ) имеет demo папку

-

Теперь, когда я бегу,

aws s3 ls s3://<my-bucket> --recursive, результат довольно интересный / удивительный!

Вывод:

# created & uploaded from console
demo/
demo/app/
demo/app/a.txt

# from CLI
demo/app/a.txt

Очевидно, что нет префиксов / объектов для demo/ и demo/app/, созданных с использованием CLI upload.

-

Этот ответ помог мне понять, что " Create Folder " из консоли приводит к созданию 0-байтового файла, когда папка пусто. Но это не тот случай, когда загружается через CLI.

Итак, как мне имитировать c поведение 0-байтового файла для загрузки CLI? Другими словами, сопоставьте префиксы!

Другой вариант использования: навигация по каталогам из браузера не будет работать, так как префиксы недоступны. Например,

  1. Загружен из консоли: https://<domain>/demo/ показывает app каталог.
  2. Загружен из CLI: https://<domain>/demo/ приводит к NoSuchKeyError

-

Примечание. Я использую дистрибутив CloudFront для доступа к данным S3 (если это поможет)!

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Amazon S3 - это плоская система хранения объектов. Это не файловая система и не имеет понятия папок или каталогов. Скорее, Key (имя файла) объекта содержит полный путь объекта.

Самый простой способ использовать S3 - это делать вид, что папки существуют, но на самом деле не создавать их. Например, вы можете скопировать файл в S3 следующим образом:

aws s3 cp a.txt s3://my-bucket/demo/app/a.txt

Это будет работать успешно, даже если нет каталога с именем demo или app, потому что каталоги / папки делают не существует .

Вместо этого Amazon S3 предоставляет концепцию CommonPrefix, которую вы увидите в нижней части вызова API ListObjects(). Возвращает список имен папок, разделенных разделителем (обычно /). Это обеспечивает программную c эквивалентность директории, фактически не требуя их существования.

Если вы хотите sh представить серию иерархических каталогов, используйте список CommonPrefixes для построения этого представления. Это будет работать, даже если нет файлов нулевой длины, потому что S3 смотрит на ключи объектов, а не на действительные каталоги.

Вот несколько примеров:

aws s3 cp a.txt s3://my-bucket/demo/app/a.txt
upload: ./a.txt to s3://my-bucket/demo/app/a.txt                  

aws s3api list-objects-v2 --bucket my-bucket

{
    "Contents": [
        {
            "Key": "demo/app/a.txt",
            "LastModified": "2020-04-22T01:11:20+00:00",
            "ETag": "\"802776735eb3ddcf03962ae47e08ed13\"",
            "Size": 211,
            "StorageClass": "STANDARD"
        }
    ]
}

aws s3api list-objects-v2 --bucket my-bucket --delimiter '/'

{
    "CommonPrefixes": [
        {
            "Prefix": "demo/"
        }
    ]
}

aws s3api list-objects-v2 --bucket jstack-b --delimiter '/' --prefix 'demo/'
{
    "CommonPrefixes": [
        {
            "Prefix": "demo/app/"
        }
    ]
}

Обратите внимание, как команды в конце укажите delimiter, поэтому возвращается список CommonPrefixes. Это способ, с помощью которого вы можете просмотреть список каталогов (которые не существуют).

1 голос
/ 22 апреля 2020

Если вам действительно нужно иметь структуру папок в S3, которая отражает структуру локальной папки, тогда вы можете попробовать какой-либо вариант следующих сценариев оболочки и awscli на Linux или Ma c:

  1. список всех локальных папок
  2. преобразование этого списка в нечто, соответствующее соглашениям об именах S3
  3. создание файла нулевого байта для каждого имени папки в S3

Список локальных папки:

find . -type d

Пример вывода:

.
./dogs
./dogs/cute
./dogs/fierce
./cats
./cats/white
./cats/black

Преобразовать этот список, чтобы удалить ., и ./dogs/cute станет dogs/cute:

find . -type d | grep -v '^\.$' | sed 's/^\.\///g'

Пример вывода:

dogs
dogs/cute
dogs/fierce
cats
cats/white
cats/black

Наконец, соберите все вместе и создайте файл нулевого байта в каждой папке:

find . -type d \
    | grep -v '^\.$' \
    | sed 's/^\.\///g' \
    | xargs -L 1 -I % \
    aws s3api put-object --bucket mybucket --key %/ --content-length 0

Проверьте, что это привело к S3:

aws s3 ls s3://mybucket --recursive

Результаты:

2020-04-21 21:00:05          0 cats/black/
2020-04-21 21:00:05          0 cats/white/
2020-04-21 21:00:04          0 cats/
2020-04-21 21:00:03          0 dogs/cute/
2020-04-21 21:00:04          0 dogs/fierce/
2020-04-21 21:00:02          0 dogs/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...