Автоматическое создание S3 Buckets на локальном стеке
Использование localstack в моем docker-compose в основном имитирует S3.
Я знаю, что могу создавать ведра, это не проблема. То, что я хотел бы сделать, это автоматически создавать сегменты при запуске docker-compose.
Есть ли что-то встроенное уже для локального стека?
5 ответов
Изменение, внесенное в этот коммит, начиная с версии0.10.0
.
Когда контейнер запускается в первый раз, он будет выполнять файлы с расширениями.sh, которые находятся в
/docker-entrypoint-initaws.d
. Файлы будут выполняться в алфавитном порядке. Вы можете легко создавать ресурсы aws в локальном стеке, используя инструмент cli awslocal (или aws) в сценариях инициализации.
version: '3.7'
services:
localstack:
image: localstack/localstack
environment:
- SERVICES=s3
ports:
- "4572:4572"
volumes:
- ./aws:/docker-entrypoint-initaws.d
Со скриптом в каталоге ./aws/buckets.sh
:
#!/bin/bash
set -x
awslocal s3 mb s3://bucket
set +x
Обратите внимание set [-/+] x
предназначен исключительно для включения и выключения вывода выполняемых команд.
Произведет такой вывод:
...
localstack_1 | Starting mock S3 (http port 4572)...
localstack_1 | Waiting for all LocalStack services to be ready
localstack_1 | Ready.
localstack_1 | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initaws.d/buckets.sh
localstack_1 | ++ awslocal s3 mb s3://bucket
localstack_1 | make_bucket: bucket
localstack_1 | ++ set +x
localstack_1 |
Я смог добиться этого с помощью Localstack с помощью своего рода "обходного пути":
- Начать локальный стек
Создайте ожидаемые сегменты, например:
aws --endpoint-url=http://localhost:4572 s3 mb s3://test1
- Выше строки будет обновлять
s3_api_calls.json
файл в каталоге Localstack (по умолчанию в Linux это/tmp/localstack/data
- Сделайте резервную копию файла
- Поместите скопированный файл в каталог Localstack (
/tmp/localstack/data
по умолчанию) перед повторным запуском стека - Вы должны быть в состоянии увидеть что-то вроде
2019-03-21T08:38:28:INFO:localstack.utils.persistence: Restored 2 API calls from persistent file: /tmp/localstack/data/s3_api_calls.json
в журнале запуска после повторного запуска Localstack, и корзина должна быть доступна:aws --endpoint-url=http://localhost:4572 s3 ls s3://test1
Важное замечание для пользователей LocalStack v1.1.3 и выше
С 1 декабря 2022 года LocalStack объявил об прекращении поддержки устаревших сценариев инициализации () с выпуском версии 1.3.0 . Замена — подключаемые хуки инициализации — была представлена в версии 1.1.0.
Они будут полностью удалены в версии 2.0.0, что создаст риск для всех, кто будет использовать последнюю версию LocalStack.
Это было бы переломным моментом.
Для проверки на будущее принятый ответ по-прежнему действителен, но я бы рекомендовал заменить/docker-entrypoint-initaws.d
с/etc/localstack/init/ready.d
.
Это будет имитировать предыдущее предполагаемое поведение, поскольку оно будет подключаться кREADY
этап, на котором LocalStack может фактически создавать ваши корзины S3, при этом вы можете продолжать обновлять LocalStack.
Это будет лучший токDockerfile
:
version: '3.8'
services:
localstack:
image: localstack/localstack:latest
environment:
- SERVICES=s3
ports:
- "4566:4566"
volumes:
- ./aws:/etc/localstack/init/ready.d
Просто потратьте день, чтобы все исправить. Вот так!
Цель: запустить docker-compose с помощью localstack, создать корзину S3 s3://this-is-my-bucket и скопировать несколько json-файлов из исходного кода проекта.
LOCALSTACK_BUILD_VERSION: последняя на сегодня, 2.1.1.dev
Докер составляет:
localstack:
image: localstack/localstack:latest
networks:
- hmpps
container_name: localstack
ports:
- "4566-4597:4566-4597"
- 8999:8080
- 9080:9080
environment:
- SERVICES=s3
- PORT_WEB_UI=9080
- DEBUG=${DEBUG- }
- DATA_DIR=/tmp/localstack/data
- DOCKER_HOST=unix:///var/run/docker.sock
- DEFAULT_REGION=eu-west-2
volumes:
- "./src/test/resources/test-data:/tmp/localstack/test-data"
- "$PWD/src/test/resources/localstack/setup-s3.sh:/etc/localstack/init/ready.d/init-aws.sh"
- "/var/run/docker.sock:/var/run/docker.sock"
Здесь две важные вещи:
- src/test/resources/test-data — это исходная папка для ваших файлов json.
- src/test/resources/localstack/setup-s3.sh — файл сценария, который нужно запустить во время компоновки docker.
Файл сценария setup-s3.sh
#!/usr/bin/env bash
set -e
export TERM=ansi
export AWS_ACCESS_KEY_ID=foobar
export AWS_SECRET_ACCESS_KEY=foobar
export AWS_DEFAULT_REGION=eu-west-2
export PAGER=
echo "S3 Configuration started"
aws --endpoint-url=http://localhost:4566 s3 mb s3://this-is-my-bucket
aws --endpoint-url=http://localhost:4566 s3 cp /tmp/localstack/test-data/ s3://this-is-my-bucket/chart --recursive
echo "S3 Configured"
Посмотрите параметр «--recursive» для команды «aws cp». Это заняло у нас 4 часа!
Не работает без « --recursive ». Сумасшедший!
журналы докера logstack:
2023-06-22 17:07:00 S3 Configuration started
2023-06-22 17:07:01 2023-06-22T16:07:01.070 INFO --- [ asgi_gw_0] localstack.request.aws : AWS s3.CreateBucket => 200
2023-06-22 17:07:01 make_bucket: this-is-my-bucket
2023-06-22 17:07:01 2023-06-22T16:07:01.431 INFO --- [ asgi_gw_0] localstack.request.aws : AWS s3.PutObject => 200
upload: ../../../tmp/localstack/test-data/1a.json to s3://this-is-my-bucket/chart/1a.json
2023-06-22 17:07:01 S3 Configured
Пользовательский интерфейс для корзин S3 localstack находится здесь http://s3.localhost.localstack.cloud:4566/this-is-my-bucket .
Не уверен, что это необходимо, у нас есть свойства application-test.yml.
aws:
region-name: eu-west-2
endpoint-url: "http://localhost:4566"
access_key: foobar
secret_access_key: foobar
s3:
access_key: foobar
secret_access_key: foobar
bucket_name: this-is-my-bucket
Следующая цель — написать интеграционный тест, указать ведро localstack s3://this-is-my-bucket, загрузить файл «chart/1a.json» и запустить магию утверждений.
Спасибо!
DATA_DIR: локальный каталог для сохранения постоянных данных (в настоящее время поддерживается только для этих служб: Kinesis, DynamoDB, Elasticsearch, S3)