Автоматическое создание 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 с помощью своего рода "обходного пути":

  1. Начать локальный стек
  2. Создайте ожидаемые сегменты, например:

    aws --endpoint-url=http://localhost:4572 s3 mb s3://test1   
    
  3. Выше строки будет обновлять s3_api_calls.json файл в каталоге Localstack (по умолчанию в Linux это/tmp/localstack/data
  4. Сделайте резервную копию файла
  5. Поместите скопированный файл в каталог Localstack (/tmp/localstack/data по умолчанию) перед повторным запуском стека
  6. Вы должны быть в состоянии увидеть что-то вроде 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"

Здесь две важные вещи:

  1. src/test/resources/test-data — это исходная папка для ваших файлов json.
  2. 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)

Другие вопросы по тегам