Podstawowe informacje
Magazyn obiektowy to rozwiązanie programowe pozwalające na składowanie danych (obiektów) zgrupowanych w buckety. Usługa udostępnia możliwość korzystania z REST API S3, które jest kompatybilne z Amazon S3 REST API. Usługa dostępna jest pod adresem https://s3.storage.task.gda.pl
Dostęp do usługi
Aby zacząć korzystać z magazynu obiektowego niezbędne jest uzyskanie danych dostępowych. Dostępy przyznawane są w ramach umów/grantów przez operatorów usługi. Dostęp do danych będzie udzielony poprzez udostępnienie dwóch wrażliwych danych, które będą wyglądały następująco:
[default]
aws_access_key_id = ABCDEFGHIJK123456789
aws_secret_access_key = abcdefhijklmnopqrstuvwxyzAaBbC1234567890
UWAGA dostęp do magazynu obiektowego jest publiczny. Pamiętaj o odpowiednim zabezpieczeniu dostępu do bucketów i obiektów.
Sposób użycia
Zalecanym sposobem korzystania z S3 API jest użycie w tym celu kontenera Docker uruchomionym na obrazie amazon/aws-cli. Obraz ten umożliwia bezpośrednią komunikację z S3 API przy odpowiedniej konfiguracji. W celu umożliwienia korzystania zaleca się stworzenie następującej funkcji (np. poprzez dodanie do pliku .bashrc):
function docker_awscli() {
COMMAND=${1}
DOCKER_VOLUME=${2:-"/dev/null"}
docker run \
--name "docker_awscli" \
--rm \
--volume "${DOCKER_VOLUME}:${DOCKER_VOLUME}" \
--env "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" \
--env "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" \
--env "AWS_DEFAULT_REGION=default" \
"amazon/aws-cli" \
--endpoint-url="https://s3.storage.task.gda.pl" \
${COMMAND}
}
powyższa funkcja wymaga istnienia w danej sesji terminala zmiennych środowiskowych AWS_ACCESS_KEY_ID
oraz AWS_SECRET_ACCESS_KEY
. W tym celu należy owe zmienne ustawić przed pierwszym użyciem funkcji:
export AWS_ACCESS_KEY_ID=<your_access_key>
export AWS_SECRET_ACCESS_KEY=<your_secret_key>
Zmienna DOCKER_VOLUME
wskazuje na katalog z dysku lokalnego, który jest montowany do kontenera i z którego chcemy np. wysłać dane do magazynu obiektowego lub do którego chcemy je pobrać. Występuje jako drugi parametr do polecenia docker_awscli
.
Przykłady użycia
Po prawidłowej konfiguracji danych dostępowych oraz funkcji uruchamiającej kontener możliwe i bardzo łatwe staje się komunikowanie z API S3. Poniżej znajdują się proste przykłady użycia:
-
Tworzenie bucketu:
Komenda:
docker_awscli "s3 mb s3://my-first-bucket"
Przykładowy output:
make_bucket: my-first-bucket
-
Listowanie bucketów:
Komenda:
docker_awscli "s3 ls"
Przykładowy output:
2021-01-26 07:30:23 my-first-bucket 2021-01-26 07:30:25 my-second-bucket
-
Synchronizacja aktualnego katalogu z określoną lokalizacją w buckecie:
Komenda:
docker_awscli "s3 sync ${PWD} s3://my-first-bucket/katalog" ${PWD}
Przykładowy output:
upload: home/documentation/.git/HEAD to s3://my-first-bucket/katalog/.git/HEAD upload: home/documentation/.git/hooks/pre-applypatch.sample to s3://my-first-bucket/katalog/.git/hooks/pre-applypatch.sample upload: home/documentation/.git/hooks/post-update.sample to s3://my-first-bucket/katalog/.git/hooks/post-update.sample upload: home/documentation/.git/hooks/commit-msg.sample to s3://my-first-bucket/katalog/.git/hooks/commit-msg.sample ...
-
Listowanie (rekursywne) zawartości pojedynczego bucketu:
Komenda:
docker_awscli "s3 ls --recursive s3://my-first-bucket"
Przykładowy output:
2021-01-26 07:34:53 19 katalog/.git/COMMIT_EDITMSG 2021-01-26 07:34:53 607 katalog/.git/FETCH_HEAD 2021-01-26 07:34:53 45 katalog/.git/HEAD 2021-01-26 07:34:53 41 katalog/.git/ORIG_HEAD ...
-
Synchronizacja określonej lokalizacji bucketu z danym podkatalogiem aktualnego katalogu:
Komenda:
mkdir katalog docker_awscli "s3 sync s3://my-first-bucket/katalog ${PWD}/katalog" ${PWD}/katalog
Przykładowy output:
download: s3://my-first-bucket/katalog/.git/FETCH_HEAD to home/documentation/katalog/.git/FETCH_HEAD download: s3://my-first-bucket/katalog/.git/COMMIT_EDITMSG to home/documentation/katalog/.git/COMMIT_EDITMSG download: s3://my-first-bucket/katalog/.git/description to home/documentation/katalog/.git/description download: s3://my-first-bucket/katalog/.git/config to home/documentation/katalog/.git/config ...
-
Usunięcie bucketu:
Komenda:
docker_awscli "s3 rb s3://my-first-bucket"
Jeśli w buckecie istnieją dane to powyższa komenda nie zadziała i prawdopodobnie otrzymamy coś takiego:
remove_bucket failed: s3://my-first-bucket An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: Unknown
Aby usunąć bucket z danymi można użyć metody siłowej, czyli dodać do komendy parametr
--force
:docker_awscli "s3 rb --force s3://my-first-bucket"
Przykładowy output:
delete: s3://my-first-bucket/katalog/.git/COMMIT_EDITMSG delete: s3://my-first-bucket/katalog/.git/FETCH_HEAD delete: s3://my-first-bucket/katalog/.git/config delete: s3://my-first-bucket/katalog/.git/hooks/pre-applypatch.sample ...
Jak widać korzystanie z API S3 nie musi być trudne, powyższy sposób oferuje o wiele więcej działających poleceń ale nie ma sensu ich wszystkich tutaj opisywać. Warto wspomnieć, że kontener, którego użyliśmy w tej instrukcji to po prostu moduł w Pythonie awscli, którego komendą domyślną (entrypoint) jest komenda aws
.
Jeśli chcesz dowiedzeć się więcej o możliwościach tego modułu zajrzyj do jego dokumentacji Python awscli.
Jeśli nie chcesz korzystać z Dockera w celu komunikacji z Ceph po S3 API, możesz bezpośrednio zainstalować wspomniany wcześniej moduł. Na stronie z dokumentacją dowiesz się jak go zainstalować oraz używać.