Когда мы перешли с Azure на AWS, нам также пришлось немного изменить нашу инфраструктуру. Я довольно много исследовал, как лучше всего развернуть сервер Prisma в среде, готовой к работе.

У самих Prisma есть учебник о том, как это сделать, но он проходит через CloudFormation - и он отлично работает!

Учебник хорош - за исключением одной части. Кто-то в Prisma решил (я уверен, что у них были свои причины…?), Чтобы переменная среды PRISMA_CONFIG содержала все… в карте YAML! 😱 Попробуйте ввести это в однострочное поле env-var при создании определения задачи.

Он работает в первый раз, так как сам шаблон CloudFormation - это YAML, но при обновлении определения задачи он ломается. (Можете ли вы даже правильно ввести однострочный YAML? Кажется, что экранирование не работает ...)

Поэтому нам нужно вместо этого использовать PRISMA_CONFIG_PATH. Поэтому я пошел дальше и создал собственный контейнер Docker для решения этой проблемы.



Dockerfile сначала загружает образ Prisma (вам необходимо обновить этот контейнер, чтобы обновить Prisma). Затем он устанавливает для envvar PRISMA_CONFIG_PATH значение prisma.yml…

FROM prismagraphql/prisma:1.27
ARG PRISMA_CONFIG_PATH
ENV PRISMA_CONFIG_PATH prisma.yml
COPY config.yml config.yml
COPY sub.sh sub.sh
ENTRYPOINT sh sub.sh && sh -c /app/start.sh
EXPOSE 4466

… Затем мы копируем локальный файл config.yml в контейнер…

port: PORT
managementApiSecret: SECRET
databases:
  default:
    migrations: true
    connector: mysql
    host: DATABASE_HOST
    port: DATABASE_PORT
    user: DATABASE_USER
    password: DATABASE_PASSWORD

… Которые содержат заполнители, которые, в свою очередь, заменяются на sub.sh, который также копируется ...

[ -z "${PORT}" ] && echo "Not set: PORT";
[ -z "${SECRET}" ] && echo "Not set: SECRET";
[ -z "${DATABASE_HOST}" ] && echo "Not set: DATABASE_HOST";
[ -z "${DATABASE_PORT}" ] && echo "Not set: DATABASE_PORT";
[ -z "${DATABASE_USER}" ] && echo "Not set: DATABASE_USER";
[ -z "${DATABASE_PASSWORD}" ] && echo "Not set: DATABASE_PASSWORD";
cp config.yml prisma.yml
sed -ri 's/port: PORT/port: '$PORT'/g' prisma.yml
sed -ri 's/managementApiSecret: SECRET/managementApiSecret: '$SECRET'/g' prisma.yml
sed -ri 's/host: DATABASE_HOST/host: '$DATABASE_HOST'/g' prisma.yml
sed -ri 's/port: DATABASE_PORT/port: '$DATABASE_PORT'/g' prisma.yml
sed -ri 's/user: DATABASE_USER/user: '$DATABASE_USER'/g' prisma.yml
sed -ri 's/password: DATABASE_PASSWORD/password: '$DATABASE_PASSWORD'/g' prisma.yml

… Который затем проверяет, что вы предоставили все необходимые env-vars, а затем делает копию исходного config.yml с именем prisma.yml, в котором заменяются все заполнители.

Каждый раз, когда контейнер запускается, этот сценарий оболочки запускается, а Prisma получает свою конфигурацию из файла.

Теперь все, что вам нужно сделать, это отправить свой контейнер в Dockerhub или ECR и создать определение задачи.

Ах, все переменные хороши и разделены. 😊

Довольно простые вещи - но, может быть, это кому-то поможет!