Мастерская модов приложений

1. Введение

Последнее обновление: 1 ноября 2024 г.

Как нам модернизировать старое PHP-приложение до Google Cloud?

(📽️ посмотрите 7-минутное вступительное видео к этой кодовой лаборатории)

Обычно локально работают устаревшие приложения, которые необходимо модернизировать. Это означает, что они должны быть масштабируемыми, безопасными и пригодными для развертывания в различных средах.

На этом семинаре вы:

  1. Контейнеризация PHP-приложения.
  2. Перейдите на службу управляемой базы данных ( Cloud SQL ).
  3. Развертывание в Cloud Run (это альтернатива GKE/Kubernetes, не требующая операций).
  4. Защитите приложение с помощью управления идентификацией и доступом (IAM) и диспетчера секретов.
  5. Определите конвейер CI/CD с помощью Cloud Build . Cloud Build может быть связан с вашим репозиторием Git, размещенным на популярных провайдерах Git, таких как GitHub или GitLab, и запускаться, например, при любом нажатии на основной.
  6. Разместите изображения приложения в облачном хранилище . Это достигается за счет монтирования, и для изменения приложения код не требуется.
  7. Внедрите функциональность Gen AI через Gemini , управляемую с помощью облачных функций (бессерверных).
  8. Ознакомьтесь с SLO и работой с обновленным приложением.

Следуя этим шагам, вы сможете постепенно модернизировать свое PHP-приложение, улучшая его масштабируемость, безопасность и гибкость развертывания. Более того, переход в Google Cloud позволяет вам использовать его мощную инфраструктуру и сервисы, чтобы обеспечить бесперебойную работу вашего приложения в облачной среде.

Мы считаем, что то, что вы узнаете, выполнив эти простые шаги, можно применить к вашему собственному приложению и организации с другим языком/стеком и разными сценариями использования.

О приложении

Приложение ( код под лицензией MIT ), которое вы создадите, представляет собой базовое приложение PHP 5.7 с аутентификацией MySQL. Основная идея приложения — предоставить платформу, на которую пользователи могут загружать фотографии, а администраторы имеют возможность отмечать неприемлемые изображения. В приложении есть две таблицы:

  • Пользователи . Поставляется предварительно скомпилированным администратором. Новые люди могут зарегистрироваться.
  • Изображения . Поставляется с несколькими примерами изображений. Вошедшие в систему пользователи могут загружать новые изображения. Мы добавим сюда немного магии.

Ваша цель

Мы хотим модернизировать старое приложение, чтобы разместить его в Google Cloud. Мы будем использовать его инструменты и услуги для улучшения масштабируемости, повышения безопасности, автоматизации управления инфраструктурой и интеграции расширенных функций, таких как обработка изображений, мониторинг и хранение данных, с помощью таких сервисов, как Cloud SQL, Cloud Run, Cloud Build, Secret Manager и других.

445f7a9ae37e9b4d.png

Что еще более важно, мы хотим делать это шаг за шагом, чтобы вы могли узнать, какой мыслительный процесс стоит за каждым шагом, и обычно каждый шаг открывает новые возможности для следующих (пример: модули 2 -> 3 и 6 -> 7). ).

Еще не убеждены? Посмотрите это 7-минутное видео на YouTube .

Что вам понадобится

  • Компьютер с браузером, подключенный к Интернету.
  • Некоторые кредиты GCP. Спросите об этом у местного поклонника Google ;)
  • Команда gcloud работает.
  • Вы работаете на местном уровне ? скачать его здесь . Вам также понадобится хороший редактор (например, vscode или intellij).
  • Хотите делать все « в облаке »? Тогда вы можете использовать Cloud Shell .
  • Пользователь Github. Это необходимо для разветвления исходного кода 🧑🏻‍💻 gdgpescara/app-mod-workshop на собственный репозиторий git. Это необходимо для наличия собственного конвейера CI/CD (автоматическая фиксация -> сборка -> развертывание).

Примеры решений можно найти здесь:

Этот семинар можно проходить со своего локального компьютера или полностью проводить в браузере.

2. Настройка кредита и форк

6dafc658860c0ce5.png

Погасите кредит GCP и настройте свою среду GCP [необязательно]

Для проведения этого семинара вам понадобится платежный аккаунт с некоторым кредитом. Если у вас уже есть собственный платежный аккаунт, вы можете пропустить этот шаг.

Создайте новую учетную запись Google Gmail (*), чтобы привязать ее к своему кредиту GCP. Попросите своего инструктора ссылку, чтобы выкупить кредит GCP, или воспользуйтесь кредитами здесь: bit.ly/PHP-Amarcord-credits .

Войдите в новую учетную запись и следуйте инструкциям.

ff739240dbd84a30.png

(

) Зачем мне нужна новая учетная запись Gmail? *

Мы видели, как люди терпели неудачу при проверке кода, поскольку их учетные записи (особенно рабочие или студенческие электронные письма) ранее подвергались воздействию GCP, а организационные политики ограничивали их возможности это делать. Мы рекомендуем либо создать новую учетную запись Gmail, либо использовать существующую учетную запись GMail (gmail.com) без предварительного использования GCP.

Нажмите кнопку, чтобы погасить кредит.

331658dc50213403.png

Заполните следующую форму, указав свое имя и фамилию, и согласитесь с Условиями использования.

Возможно, вам придется подождать несколько секунд, прежде чем платежный аккаунт появится здесь: https://console.cloud.google.com/billing.

После этого откройте Google Cloud Console и создайте новый проект, щелкнув «Выбор проекта» в раскрывающемся меню слева вверху, где отображается «Нет организации». См. ниже

bd7548f78689db0b.png

Создайте новый проект, если у вас его нет, как показано на скриншоте ниже. В правом верхнем углу есть опция «НОВЫЙ ПРОЕКТ».

6c82aebcb9f5cd47.png

Обязательно свяжите новый проект с платежным аккаунтом пробной версии GCP следующим образом.

f202527d254893fb.png

Все готово для использования Google Cloud Platform. Если вы новичок или просто хотите делать все в облачной среде, вы можете получить доступ к Cloud Shell и его редактору с помощью следующей кнопки в верхнем левом углу, как показано ниже.

7d732d7bf0deb12e.png

Убедитесь, что ваш новый проект выбран в левом верхнем углу:

Не выбрано (плохо):

c2ffd36a781b276a.png

Выбрано (хорошо):

594563c158f4f590.png

Форк приложения из Github

  1. Перейдите в демо-приложение: https://github.com/gdgpescara/app-mod-workshop.
  2. Нажмите 🍴 вилка.
  3. Если у вас нет учетной записи GitHub, вам необходимо создать новую.
  4. Редактируйте вещи по своему желанию.

734e51bfc29ee5df.png

  1. Клонируйте код приложения с помощью git clone https://github.com/ <ВАШ-GITHUB-ПОЛЬЗОВАТЕЛЬ>/<ВАШЕ-РЕПО-ИМЯ>
  1. Откройте папку клонированного проекта в вашем любимом редакторе. Если вы выберете Cloud Shell, вы можете сделать это, нажав «Открыть редактор», как показано ниже.

40f5977ea4c1d1cb.png

У вас есть все необходимое с редактором Google Cloud Shell, как показано на следующем рисунке.

a4e5ffb3e9a35e84.png

3. Модуль 1. Создание экземпляра SQL

645902e511a432a6.png

Создайте экземпляр Google Cloud SQL.

Наше PHP-приложение будет подключаться к базе данных MySQL, поэтому нам необходимо реплицировать его в Google Cloud для беспроблемной миграции. Cloud SQL идеально подходит, поскольку позволяет запускать полностью управляемую базу данных MySQL в облаке. Вот шаги, которые необходимо выполнить:

  1. Перейдите на страницу Cloud SQL: https://console.cloud.google.com/sql/instances .
  2. Нажмите «Создать экземпляр».
  3. Включите API (при необходимости). Это может занять несколько секунд.
  4. Выберите MySQL.
  5. (Мы стараемся предоставить вам самую дешевую версию, чтобы она прослужила дольше):
  • Издание: Предприятие
  • Предустановка: разработка (мы пробовали Sandbox и у нас не сработало)
  • Mysql версия: 5.7 (вау, взрыв из прошлого!)
  1. Идентификатор экземпляра: выберите appmod-phpapp (если вы его измените, не забудьте соответствующим образом изменить будущие скрипты и решения).
  2. Пароль: любой, но запишите его как CLOUDSQL_INSTANCE_PASSWORD.
  3. Регион: оставьте то же, что вы выбрали для остальной части приложения (например, Милан = europe-west8 ).
  4. Зональное использование: одна зона (мы экономим деньги на демо-версию)

Нажмите кнопку «Создать экземпляр», чтобы развернуть базу данных Cloud SQL; ⌛ выполнение занимает около 10 минут⌛ . А пока продолжайте читать документацию; вы также можете начать решать следующий модуль («Контейнеризация вашего PHP-приложения»), поскольку он не имеет зависимостей от этого модуля в первой части (пока вы не исправите соединение с БД).

Примечание . Этот экземпляр обойдется вам примерно в 7 долларов в день. Обязательно отключите его после семинара.

Создайте базу данных image_catalog и пользователя в Cloud SQL.

Проект приложения поставляется с папкой db/ , содержащей два файла sql:

  1. 01_schema.sql : содержит код SQL для создания двух таблиц, содержащих данные пользователей и изображений.
  2. 02_seed.sql : содержит код SQL для заполнения данных в ранее созданных таблицах.

Эти файлы будут использоваться позже, когда будет создана база данных image_catalog . Вы можете сделать это, выполнив следующие шаги:

  1. Откройте свой экземпляр и перейдите на вкладку «Базы данных»:
  2. нажмите «Создать базу данных»
  3. назовите его image_catalog (как в конфигурации приложения PHP).

997ef853e5ebd857.png

Затем мы создаем пользователя базы данных. Благодаря этому мы можем пройти аутентификацию в базе данных image_catalog.

  1. Теперь нажмите на вкладку «Пользователи» .
  2. Нажмите «Добавить учетную запись пользователя».
  3. Пользователь: давайте создадим:
  • Имя пользователя: appmod-phpapp-user
  • Пароль: выберите тот, который вы можете запомнить, или нажмите «Создать».
  • Оставьте « Разрешить любой хост (%) ».
  1. нажмите ДОБАВИТЬ.

Откройте БД для известных IP-адресов.

Обратите внимание, что все базы данных в Cloud SQL изначально изолированы. Вам необходимо явно настроить сеть для доступа.

  1. Нажмите на свой экземпляр
  2. Откройте меню «Подключения»
  3. Нажмите на вкладку «Сеть».
  4. Нажмите «Авторизованные сети». Теперь добавьте подсеть.
  • А пока давайте перейдем к НЕБЕЗОПАСНОСТИ, чтобы приложение могло работать:
  • Название: «Все в мире – НЕБЕЗОПАСНО» (напомним себе, что это дешевое решение также небезопасно).
  • Сеть: «0.0.0.0/0» (Примечание: это НЕБЕЗОПАСНО!)

Нажмите «Сохранить».

Вы должны увидеть что-то вроде этого:

5ccb9062a7071964.png

Примечание . Это решение является хорошим компромиссом для завершения семинара за O(часов). Однако ознакомьтесь с документом БЕЗОПАСНОСТЬ , чтобы защитить свое решение для производства!

Пришло время проверить соединение с БД!

Давайте посмотрим, работает ли созданный нами ранее пользователь image_catalog . Получите доступ к Cloud SQL Studio внутри экземпляра и введите базу данных, пользователя и пароль для аутентификации, как показано ниже:

d56765c6154c11a4.png

Теперь вы можете открыть редактор SQL и перейти к следующему разделу.

Импортируйте базу данных из базы кода.

Используйте редактор SQL для импорта таблиц image_catalog с их данными. Возьмите код SQL из файлов sql в репозитории и выполните их один за другим в последовательном порядке. 01_schema.sql , а затем 02_seed.sql .

После этого вы должны получить две таблицы в image_catalog, которые представляют собой пользователей и изображения, как показано ниже:

65ba01e4c6c2dac0.png

Вы можете проверить это, выполнив в редакторе следующее: select * from images;

Также обязательно запишите общедоступный IP-адрес, он понадобится вам позже.

4. Модуль 2. Контейнеризация вашего PHP-приложения

e7f0e9979d8805f5.png

Мы хотим создать это приложение для облака.

Это означает упаковку кода в какой-то ZIP-файл, содержащий всю информацию для его запуска в облаке.

Есть несколько способов упаковки:

  • Докер . Очень популярный, но довольно сложный в правильной настройке.
  • Сборочные пакеты . Менее популярен, но имеет тенденцию «автоматически угадывать», что создавать и что запускать. Часто это просто работает!

В контексте этого семинара мы будем предполагать, что вы используете Docker.

Докер

Если вы хотите иметь контроль, это правильное решение для вас. Это имеет смысл, когда вам нужно настроить определенные библиотеки и внедрить определенное неочевидное поведение (chmod при загрузке, нестандартный исполняемый файл в вашем приложении и т. д.).

Поскольку мы хотим в конечном итоге развернуть наше контейнерное приложение в Cloud Run, проверьте следующую документацию и попробуйте заполнить пробелы . Мы предоставляем только самое необходимое, чтобы облегчить задачу на данный момент. Ваш окончательный файл Dockerfile будет выглядеть примерно так:

# Use an official PHP image with Apache
# Pull a suitable php image
FROM __________# Define the env variable for the Apache listening port 8080
ENV __________

# Set working directory inside the container
WORKDIR __________

# Install required PHP extensions: PDO, MySQL, and other dependencies
RUN __________

# Copy all application files into the container
COPY __________

# Configure Apache to listen on port 8080. Use ‘sed' command to change the default listening port.
RUN __________

# When in doubt, always expose to port 8080
EXPOSE __________

# Start Apache in the foreground
CMD __________

Более того, чтобы протестировать наше приложение локально, нам нужно изменить файл config.php таким образом, чтобы наше приложение PHP могло подключаться к базе данных MYSQL, доступной в Google CloudSQL. На основе того, что вы настроили ранее, заполните поля .

  • Db_host — это публичный IP-адрес Cloud SQL, его можно найти в консоли:

bd27071bf450a8d0.png

  • Имя_базы_данных должно остаться неизменным: image_catalog
  • Db_user должен быть appmod-phpapp-user
  • Db_pass — это то, что вы выбрали. Заключите его в одинарные кавычки и при необходимости экранируйте.
<?php
// Database configuration
$db_host = '____________';
$db_name = '____________';
$db_user = '____________';
$db_pass = '____________';

try {
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Errore di connessione: " . $e->getMessage());
}

session_start();
?>

Кроме того, не стесняйтесь переводить несколько итальянских фрагментов на английский с помощью Gemini !

Хорошо, теперь, когда у вас есть Dockerfile и вы настроили PHP-приложение для подключения к базе данных, давайте попробуем это!

Установите докер, если у вас его еще нет ( ссылка ). Вам это не нужно, если вы используете Cloud Shell (насколько это круто?).

Теперь попробуйте собрать и запустить контейнерное PHP-приложение с помощью соответствующих команд сборки и запуска Docker.

  • docker build -t <IMAGE_TAG_NAME> .
  • docker run -it -p <ПОРТ КОНТЕЙНЕРА>:<ПОРТ ЛОКАЛЬНОГО МАШИНЫ> <ИМЯ_ТЕГА_ИЗОБРАЖЕНИЯ>

Если все работает, вы сможете увидеть следующую веб-страницу при подключении к локальному хосту.

Если вы используете Cloud Shell, вы также можете экспортировать локальный порт (скажем, 8080) в свой браузер, например:

docker build -t my-php-app-docker app-mod-workshop/ -f Dockerfile

docker run -it -p 8080:8080 my-php-app-docker

Теперь вы знаете, что ваше приложение работает на порту 8080, щелкните значок «Предварительный просмотр в Интернете» (браузер с глазом), а затем выберите «Предварительный просмотр на порту 8080» (или «Изменить порт» на любой другой порт).

33a24673f4550454.png

Тестирование результата в вашем браузере

Теперь ваше приложение должно выглядеть примерно так:

2718ece96b1f18b6.png

И если вы войдете в систему под учетной записью Admin/admin123, вы увидите что-то вроде этого.

68b62048c2e86aea.png

Большой!!! Это работает 🎉🎉🎉

Если ваша докеризация прошла успешно, но учетные данные БД неверны, вы можете получить что-то вроде этого:

e22f45b79bab86e1.png

Попробуй еще раз, ты близко!

Сборочные пакеты [необязательно]

С помощью Buildpacks приложение собирается автоматически. К сожалению, у вас нет полного контроля, поэтому вы можете получить неожиданную конфигурацию.

У вас должен быть новый образ Docker в вашей локальной среде. Вы можете попытаться запустить для него контейнер, но поскольку мы не имеем полного контроля над тем, как создан образ, приложение может не работать. В любом случае приглашаем вас поэкспериментировать и в случае успеха поделиться своим мнением. Спасибо!

Сохранение в реестре артефактов [необязательно]

К этому моменту у вас должно быть работающее контейнерное PHP-приложение, готовое к развертыванию в облаке. Далее нам нужно место в облаке для хранения нашего образа Docker и обеспечения его доступности для развертывания в облачных сервисах Google, таких как Cloud Run. Это решение для хранения называется Artifact Registry — полностью управляемый облачный сервис Google, предназначенный для хранения артефактов приложений, включая образы контейнеров Docker, пакеты Maven, модули npm и многое другое.

Создадим репозиторий в Google Cloud Artifact Registry с помощью соответствующей кнопки.

e1123f0c924022e6.png

Выберите допустимое имя, формат и регион, подходящий для хранения артефактов.

4e516ed209c470ee.png

Вернитесь к тегу локальной среды разработки и отправьте образ контейнера приложения в только что созданный репозиторий реестра артефактов. Для этого выполните следующие команды.

  • тег Docker SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • докер нажмите TARGET_IMAGE[:TAG]

Результат должен выглядеть как на следующем снимке экрана.

1e498feb4e88be9f.png

Ура 🎉🎉🎉 вы можете перейти на следующий уровень.

Примечание. Также попробуйте конечную точку /upload.php и попробуйте загрузить изображение. Вы можете получить сообщение «Отказано в доступе». Если да, то вам нужно внести исправления chmod/chown в Dockerfile .

5. Модуль 3. Развертывание приложения в Cloud Run

9ffca42774f6c5d1.png

Почему Cloud Run?

Честный вопрос! Несколько лет назад вы наверняка выбрали бы Google App Engine.

Проще говоря, сегодня Cloud Run имеет более новый стек технологий, его проще развернуть, он дешевле и масштабируется до 0, когда вы его не используете. Благодаря своей гибкости для запуска любого контейнера без сохранения состояния и интеграции с различными сервисами Google Cloud он идеально подходит для развертывания микросервисов и современных приложений с минимальными накладными расходами и максимальной эффективностью.

В частности, Cloud Run — это полностью управляемая платформа Google Cloud, которая позволяет запускать контейнерные приложения без сохранения состояния в бессерверной среде. Он автоматически управляет всей инфраструктурой, масштабируясь с нуля для удовлетворения входящего трафика и прекращая работу в случае простоя, что делает его экономичным и эффективным. Cloud Run поддерживает любой язык или библиотеку, если они упакованы в контейнер, что обеспечивает большую гибкость при разработке. Он хорошо интегрируется с другими сервисами Google Cloud и подходит для создания микросервисов, API, веб-сайтов и приложений, управляемых событиями, без необходимости управлять серверной инфраструктурой.

Предварительные условия

Для выполнения этой задачи на вашем локальном компьютере должен быть установлен gcloud . Если нет, смотрите инструкции здесь . Вместо этого, если вы используете Google Cloud Shell, никаких действий предпринимать не нужно.

Прежде чем развернуть...

Если вы работаете в своей локальной среде, выполните аутентификацию в Google Cloud, выполнив следующие действия:

  • $ gcloud auth login –update-adc # not needed in Cloud Shell

Это должно аутентифицировать вас через вход OAuth в вашем браузере. Убедитесь, что вы входите в систему через Chrome под тем же пользователем (например, vattelapesca@gmail.com), который вошел в Google Cloud с включенной оплатой.

Включите Cloud Run API с помощью следующей команды

  • $ gcloud services enable run.googleapis.com

На этом этапе все готово к развертыванию в Cloud Run.

Разверните свое приложение в облаке. Запуск через gcloud

Команда, позволяющая развернуть приложение в Cloud Run, — это gcloud run deploy . Есть несколько вариантов настройки для достижения вашей цели. Минимальный набор следующий:

  1. Имя службы Cloud Run, которую вы хотите развернуть для своего приложения. Служба Cloud Run вернет вам URL-адрес, который предоставляет конечную точку для вашего приложения.
  2. Регион Google Cloud , в котором будет работать ваше приложение.
  3. Изображение контейнера , которое обертывает ваше приложение.
  4. Переменные среды , которые ваше приложение должно использовать во время своего выполнения.
  5. Флаг Allow-Unauthenticated , который разрешает каждому доступ к вашему приложению без дополнительной аутентификации.

Обратитесь к документации , чтобы узнать, как применить эту опцию к вашей команде. Развертывание займет несколько минут. Если все правильно, вы должны увидеть что-то подобное в Google Cloud Console.

ef1029fb62f8de81.png

f7191d579c21ca3e.png

Нажмите на URL-адрес, предоставленный Cloud Run, и протестируйте свое приложение. После аутентификации вы должны увидеть что-то вроде этого.

d571a90cd5a373f9.png

«gcloud run Deploy» без «вопросов»

Возможно, вы заметили, что gcloud run deploy задает вам правильные вопросы и заполняет оставленные вами пробелы. Это потрясающе!

Однако в нескольких модулях мы добавим эту команду в триггер Cloud Build, чтобы не было вопросов. Нам нужно заполнить каждую опцию в команде. Итак, вы хотите создать золотой gcloud run deploy --option1 blah --foo bar --region your-fav-region . Как ты это делаешь?

  1. повторяйте шаги 2-3-4, пока gcloud не перестанет задавать вопросы:
  2. [LOOP] gcloud run deploy с найденными на данный момент опциями
  3. Системы [LOOP] запрашивают опцию X
  4. [LOOP] Найдите в общедоступных документах, как настроить X из CLI, добавив параметр --my-option [my-value] .
  5. Вернитесь к шагу 2, если только gcloud не завершится без дополнительных вопросов.
  6. Этот запуск gcloud развертывает БЛА-БЛА-БЛА камни! Сохраните команду где-нибудь, она понадобится вам позже на этапе Cloud Build!

Возможное решение здесь .

Ура 🎉🎉🎉 Вы успешно развернули свое приложение в Google Cloud, пройдя первый этап модернизации.

6. Модуль 4. Очистка пароля с помощью Secret Manager

95cd57b03b4e3c73.png

На предыдущем шаге мы смогли успешно развернуть и запустить наше приложение в Cloud Run. Однако мы сделали это, используя плохую с точки зрения безопасности практику: предоставляя некоторые секреты в открытом виде .

Первая итерация: обновите свой config.php , чтобы использовать ENV.

Возможно, вы заметили, что мы поместили пароль к базе данных прямо в код файла config.php. Это подходит для целей тестирования и проверки работы приложения. Но вы не можете фиксировать/использовать такой код в производственной среде. Пароль (и другие параметры подключения к БД) следует считывать динамически и предоставлять приложению во время выполнения. Измените файл config.php так, чтобы он считывал параметры базы данных из переменных ENV. Если это не помогло, вам следует рассмотреть возможность установки значений по умолчанию . Это хорошо, если вам не удалось загрузить ENV, поэтому выходные данные страницы сообщат вам, используются ли значения по умолчанию. Заполните пробелы и замените код в config.php.

<?php
// Database configuration with ENV variables. Set default values as well 
$db_host = getenv('DB_HOST') ?: _______;
$db_name = getenv('DB_NAME') ?: 'image_catalog';
$db_user = getenv('DB_USER') ?: 'appmod-phpapp-user';
$db_pass = getenv('DB_PASS') ?: _______;
// Note getenv() is PHP 5.3 compatible
try {
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Errore di connessione: " . $e->getMessage());
}

session_start();
?>

Поскольку ваше приложение является контейнерным, вам необходимо предоставить способ предоставления переменных ENV в приложение. Это можно сделать несколькими способами:

  • Во время сборки в файле Dockerfile. Добавьте в предыдущий файл Docker 4 параметра, используя синтаксис ENV DB_VAR=ENV_VAR_VALUE. Это установит значения по умолчанию, которые можно переопределить во время выполнения. Например, «DB_NAME» и «DB_USER» могут быть установлены здесь и нигде больше.
  • Во время выполнения . Вы можете настроить эти переменные для Cloud Run как из CLI, так и из пользовательского интерфейса. Это подходящее место для размещения всех ваших 4 переменных (если вы не хотите сохранить значения по умолчанию, установленные в Dockerfile).

На локальном хосте вы можете поместить переменные ENV в файл .env (проверьте папку решений ).

Также убедитесь, что .env добавлен в ваш .gitignore : вы не хотите отправлять свои секреты на Github!

echo .env >> .gitignore

После этого вы можете протестировать экземпляр локально:

docker run -it -p 8080:8080 --env-file .env my-php-app-docker

Теперь вы достигли следующего:

  1. Ваше приложение будет динамически считывать переменную из вашего ENV.
  2. Вы улучшили безопасность, поскольку удалили пароль БД из своего кода)

Теперь вы можете развернуть новую версию в Cloud Run. Давайте перейдем к пользовательскому интерфейсу и вручную установим переменные среды:

  • Перейдите на https://console.cloud.google.com/run.
  • Нажмите на свое приложение
  • Нажмите «Изменить и развернуть новую ревизию».
  • На первой вкладке «Контейнер(ы)» нажмите нижнюю вкладку «Переменные и секреты».
  • Нажмите «+ Добавить переменную» и добавьте все необходимые переменные. В итоге у вас должно получиться что-то вроде этого:

7a5fbfa448544d3.png

f2780c35585388ca.png

Это идеально? Нет. Ваш PASS по-прежнему виден большинству операторов. Это можно исправить с помощью Google Cloud Secret Manager.

Вторая итерация: Секретный менеджер

Ваши пароли исчезли из вашего собственного кода: победа! Но подождите, мы уже в безопасности?

Ваши пароли по-прежнему будут видны всем, у кого есть доступ к Google Cloud Console. Фактически, если вы получите доступ к файлу развертывания Cloud Run YAML, вы сможете получить его. Или, если вы попытаетесь отредактировать или развернуть новую версию Cloud Run, пароль будет виден в разделе «Переменные и секреты», как показано на снимках экрана ниже.

Google Cloud Secret Manager — это безопасный централизованный сервис для управления конфиденциальной информацией, такой как ключи API, пароли, сертификаты и другие секреты.

Он позволяет хранить секреты, управлять ими и получать к ним доступ с детальными разрешениями и надежным шифрованием. Secret Manager, интегрированный с системой управления идентификацией и доступом (IAM) Google Cloud, позволяет вам контролировать, кто может получить доступ к определенным секретам, обеспечивая безопасность данных и соответствие нормативным требованиям.

Он также поддерживает автоматическую ротацию секретов и управление версиями, упрощая управление жизненным циклом секретов и повышая безопасность приложений в сервисах Google Cloud.

Чтобы получить доступ к Секретному менеджеру, перейдите из меню «Гамбургер» в «Службы безопасности» и найдите его в разделе «Защита данных» , как показано на снимке экрана ниже.

6df83a1c3cb757f6.png

Включите API Secret Manager, как только вы окажетесь там, как показано на следующем изображении.

a96c312e2c098db1.png

  • Теперь нажмите « Создать секрет »: Назовем его рационально:
  • Имя: php-amarcord-db-pass
  • Секретное значение: « пароль вашей базы данных » (игнорируйте часть «загрузить файл»).
  • аннотируйте эту секретную ссылку, она должна выглядеть так: projects/123456789012/secrets/php-amarcord-db-pass . Это уникальный указатель на ваш секрет (для Terraform, Cloud Run и других). Этот номер является вашим уникальным номером проекта.

Совет . Попробуйте использовать единообразные соглашения об именах для своих секретов, начиная слева направо, например: cloud-devrel-phpamarcord-dbpass

  • Организация (с компанией)
  • Команда (внутри организации)
  • Заявка (внутри команды)
  • Имя переменной (внутри приложения)

Это позволит вам легко использовать регулярные выражения для поиска всех ваших секретов для одного приложения.

Создайте новую версию Cloud Run.

Теперь, когда у нас есть новый секрет, нам нужно избавиться от переменной ENV DB_PASS и заменить ее новым секретом. Так:

  • Доступ к Cloud Run с помощью Google Cloud Console
  • Выберите приложение.
  • Нажмите «Редактировать и развернуть новую версию».
  • найдите вкладку «Переменные и секреты».
  • Используйте кнопку «+ Ссылка на секрет», чтобы сбросить переменную DB_PASS ENV.
  • Используйте тот же «DB_PASS» для указанных секретов и используйте последнюю версию.

9ed4e35be7654dcb.png

После этого вы должны получить следующую ошибку

da0ccd7af39b04ed.png

Постарайтесь придумать, как это исправить. Чтобы решить эту проблему, вам необходимо получить доступ к разделу IAM & Admin и изменить разрешения на предоставление. Удачной отладки!

Как только вы это выясните, вернитесь в Cloud Run и повторно разверните новую версию. Результат должен выглядеть как на следующем рисунке:

e89f9ca780169b6b.png

Совет : консоль разработчика (пользовательский интерфейс) отлично подходит для выявления проблем с разрешениями. Найдите время, чтобы просмотреть все ссылки для ваших облачных объектов!

7. Модуль 5. Настройка CI/CD с помощью Cloud Build

ba49b033c11be94c.png

Зачем нужен конвейер CI/CD?

К этому моменту вы уже должны были набрать gcloud run deploy несколько раз, возможно, отвечая на один и тот же вопрос снова и снова.

Устали развертывать приложение вручную с помощью gcloud run Deploy? Разве не было бы здорово, если бы ваше приложение могло автоматически развертываться каждый раз, когда вы добавляете новое изменение в свой репозиторий Git?

Чтобы использовать конвейер CI/CD, вам понадобятся две вещи:

  1. Персональный репозиторий Git . К счастью, вы уже должны были подключить репозиторий Workshop к своей учетной записи GitHub на шаге 2. Если нет, вернитесь и завершите этот шаг. Ваш раздвоенный репозиторий должен выглядеть так: https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
  2. Облачная сборка . Этот замечательный и дешевый сервис позволяет настроить автоматизацию сборки практически для всего: Terraform, док-приложений и т. д.

В этом разделе основное внимание будет уделено настройке Cloud Build.

Вступайте в облачную сборку!

Для этого мы будем использовать Cloud Build:

  • создайте свой исходный код (с помощью Dockerfile). Думайте об этом как о «большом ZIP-файле», который содержит все необходимое для его сборки и запуска («ваш «артефакт сборки»).
  • отправить этот артефакт в реестр артефактов (AR).
  • Затем выполните развертывание из AR в Cloud Run для приложения «php-amarcord».
  • Это создаст новую версию («ревизию») существующего приложения (представьте себе слой с новым кодом), и мы настроим его для перенаправления трафика на новую версию в случае успешной отправки.

Это пример некоторых сборок моего приложения php-amarcord :

f30f42d4571ad5e2.png

Как нам все это сделать?

  1. Создав один идеальный файл YAML: cloudbuild.yaml
  2. Создав триггер Cloud Build.
  3. Подключившись к нашему репозиторию на GitHub через интерфейс Cloud Build .

Создать триггер (и подключить репозиторий)

  • Перейдите на https://console.cloud.google.com/cloud-build/triggers.
  • Нажмите «Создать триггер».
  • Скомпилировать:
  • Имя: что-то значимое, например on-git-commit-build-php-app
  • Событие: Нажмите на ветку
  • Источник: «Подключить новый репозиторий» альтернативный текст
  • Откроется окно справа: «Подключить репозиторий».
  • Поставщик исходного кода: Github (первый)
  • "Продолжать"
  • Аутентификация откроет окно на github для перекрестной аутентификации. Следуйте за потоком и будьте терпеливы. Если у вас много репозиториев, это может занять некоторое время.
  • «Выбрать репо» Выберите свою учетную запись/репо и отметьте часть «Я понимаю…».
  • Если вы получили сообщение об ошибке : Приложение GitHub не установлено ни в одном из ваших репозиториев, нажмите «Установить Google Cloud Build» и следуйте инструкциям.
  • 23e0e0f1219afea3.png Нажмите «Подключиться».
  • bafd904ec07122d2.png
  • Бинго! Ваше репо теперь подключено.
  • Вернемся к триггерной части....
  • Конфигурация: определяется автоматически (*)
  • Дополнительно: выберите учетную запись службы «[PROJECT_NUMBER] -compute@developer.gserviceaccount.com ».
  • ххххх — это идентификатор вашего проекта
  • Учетная запись вычислительной службы по умолчанию подходит для лабораторного подхода — не используйте ее в рабочей среде! ( Узнать больше ).
  • все остальное оставь как есть.
  • Нажмите на кнопку «Создать».

(*) Это самый простой способ, поскольку он проверяет наличие Dockerfile или cloudbuild.yaml. Однако cloudbuild.yaml дает вам реальную возможность решать, что делать на каком этапе.

У меня есть сила!

Теперь триггер не будет работать, если вы не укажете учетную запись службы Cloud Build (что такое учетная запись службы? Электронная почта «робота», который действует от вашего имени для выполнения задачи — в данном случае создание чего-либо в облаке!).

Ваш SA не сможет построить и развернуть, если вы не уполномочите его сделать это. К счастью, это легко!

  • перейдите в «Облачная сборка» > « Настройки ».
  • Учетная запись службы «[PROJECT_NUMBER]- Compute@developer.gserviceaccount.com »
  • Отметьте эти поля:
  • Облачный бег
  • Секретный менеджер
  • Сервисные аккаунты
  • Облачная сборка
  • Также отметьте «Установить в качестве предпочтительной учетной записи службы».

8715acca72286a46.png

Где находится Cloud Buld YAML?

Мы настоятельно рекомендуем вам потратить некоторое время на создание собственной облачной сборки YAML.

Однако, если у вас нет времени или вы не хотите его уделять, вы можете почерпнуть вдохновение в этой папке решений: .solutions

Теперь вы можете отправить изменение на github и наблюдать за Cloud Build.

Настройка Cloud Build может оказаться сложной задачей. Ожидайте немного взад и вперед:

  • Проверка журналов в https://console.cloud.google.com/cloud-build/builds;region=global
  • Находим свою ошибку.
  • Исправляем код и перевыпускаем git commit/git push.
  • Иногда ошибка не в коде, а в некоторой конфигурации. В этом случае вы можете выпустить новую сборку из пользовательского интерфейса (Cloud Build> «Триггеры»> запустить)

97ACD16980A144AB.PNG

Обратите внимание, что если вы используете это решение, есть еще какая -то работа. Например, вам необходимо установить переменные ENV для вновь созданных конечных точек Dev/Prod:

3da8723e4ff80c0a.png

Вы можете сделать это двумя способами:

  • Через пользовательский интерфейс - снова установив переменные ENV
  • Через CLI , создав «идеальный» сценарий для вас. Пример можно найти здесь: gcloud-unploy.sh . Вам нужно настроить несколько вещей, например, конечная точка и номер проекта; Вы можете найти свой номер проекта в обзоре облака .

Как мне совершить код GitHub?

Это выходит за рамки этого семинара, чтобы научить вас лучшему способу git push к GitHub. Однако, если вы застряли, и вы находитесь в облачной оболочке, есть два способа:

  1. Кли . Добавьте ключ SSH локально и добавьте пульт с git@github.com : your_user/app-mod-workshop.git (вместо http)
  2. VSCODE . Если вы используете редактор облачной оболочки, OU может использовать вкладку «Исходный элемент управления» (CTRL-Shift-G), нажмите «Изменения синхронизации» и следуйте инструкциям. Вы должны быть в состоянии аутентифицировать свою учетную запись GitHub в VSCODE, и оттуда притяжение/толкание станет бризом.

F0D53F839C7FA3B6.PNG

Не забудьте git add clodubuild.yaml среди других файлов, иначе это не сработает.

Глубокий против мелкого "Dev/Prod Carity" [необязательно]

Если вы скопировали модельную версию отсюда , у вас будет две идентичные версии Dev и Prod. Это круто, и в соответствии с правилом 10 двенадцатифакторного приложения .

Тем не менее, мы используем две разные веб -конечные точки, чтобы иметь приложение, указывающее на одну и ту же базу данных. Этого достаточно для мастерской; Однако в реальной жизни вы хотите потратить некоторое время на создание правильной среды Prod. Это означает наличие двух баз данных (одна для Dev и One для Prod), а также выбор того, где их иметь для аварийного восстановления / высокой доступности. Это выходит за рамки этой мастерской, но это немного еды для размышлений.

Если у вас есть время, чтобы сделать «глубокую» версию производства, пожалуйста, имейте в виду все ресурсы, необходимые для дублирования, например:

  • База данных Cloud SQL (и, вероятно, экземпляр SQL).
  • Ведро GCS
  • Облачная функция.
  • Вы можете использовать Flash Gemini 1.5 в качестве модели в DEV (дешевле, быстрее) и Gemini 1.5 Pro (более мощный).

В целом, каждый раз, когда вы что -то делаете с приложением, думайте о том, что в производстве есть такая же ценность или нет? И если нет, дублировать свои усилия. Это, конечно, намного проще с Terraform, где вы можете вводить окружающую среду (-dev, -prod) в качестве суффикса в ваши ресурсы.

8. Модуль 6: Перейдите в Google Cloud Storage

A680E0F287DD2DFB.PNG

Хранилище

В настоящее время приложение хранило штат в контейнере Docker. Если машина ломается, приложение взрывается, или просто, если вы продвигаете новую ревизию , будет запланировано новое хранилище сброса (=> пустого). 🙈

Как мы это исправим? Есть ряд подходов.

  1. Хранить изображения в дм. Это то, что я в итоге сделал со своим предыдущим приложением PHP. Это самое простое решение, поскольку оно не добавляет сложности к нему. Но это добавляет задержку и нагружена в ваш БД наверняка!
  2. Перенесите приложение Cloud Run в удобное для хранения решение: GCE + Persistent Disk ? Может, GKE + хранение ?
  3. Перейти к GCS . Google Cloud Storage предлагает лучшее в классе хранилище для всего Google Cloud, и это самое облачное идиоматическое решение. Тем не менее, это требует от нас падения с библиотеками PHP . Есть ли у нас библиотеки PHP 5.7 для GCS ? Поддерживает ли PHP 5.7 даже Composer (похоже на PHP 5.3.2 - самая ранняя версия, поддерживаемая композитором)?
  4. Может, использовать коляску Docker ?
  5. Или, может быть, используйте GCS Cloud Run Mounts . Это звучит потрясающе.

🤔 мигрируйте хранение (открытое)

[Open Cinded] В этом упражнении мы хотим, чтобы вы нашли решение для перемещения ваших изображений таким образом, что каким -то образом сохраняется.

Принятие теста

Я не хочу рассказывать вам решение, но я хочу, чтобы это произошло:

  1. Вы загружаете newpic.jpg . Вы видите это в приложении.
  2. Вы обновляете приложение до новой версии.
  3. newpic.jpg все еще там, видимо.

💡 Возможное решение (GCS Cloud Run Mounts)

Это очень элегантное решение, которое позволяет нам достигать загрузки файлов Stateful, вообще не касаясь кода (кроме того, что показывает описание изображения, но это тривиально и просто для удовлетворения глаз).

Это должно позволить вам установить папку от Cloud Run до GCS, так что:

  1. Все загрузки в GCS действительно будут видны в вашем приложении.
  2. Все загрузки в ваше приложение фактически будут загружены в GCS
  3. Магия произойдет, загруженные TYO -объекты, загруженные в GCS (глава 7).

Примечание . Пожалуйста, прочитайте предохранитель мелкий шрифт. Это не нормально, если производительность является проблемой.

Создайте ведро GCS

GCS-это всеобъемлющая служба хранения Google Cloud. Он испытывается в битве и используется каждой службой GCP, нуждающейся в хранении.

Обратите внимание, что Cloud Shell Export Project_ID AS Google_Cloud_project:

$ export PROJECT_ID=$GOOGLE_CLOUD_PROJECT

#!/bin/bash

set -euo pipefail

# Your Cloud Run Service Name, eg php-amarcord-dev
SERVICE_NAME='php-amarcord-dev'
BUCKET="${PROJECT_ID}-public-images"
GS_BUCKET="gs://${BUCKET}"

# Create bucket
gsutil mb -l "$GCP_REGION" -p "$PROJECT_ID" "$GS_BUCKET/"

# Copy original pictures there - better if you add an image of YOURS before.
gsutil cp ./uploads/*.png "$GS_BUCKET/"

Настройте Cloud Run, чтобы установить ведро в / загрузки / папку

Теперь давайте придем к элегантной части. Мы создаем объем php_uploads и инструктируйте Cloud Run, чтобы выполнить крепление предохранителя на MOUNT_PATH (что -то вроде /var/www/html/uploads/ ):

#!/bin/bash

set -euo pipefail

# .. keep variables from previous script..

# Uploads folder within your docker container.
# Tweak it for your app code.
MOUNT_PATH='/var/www/html/uploads/'

# Inject a volume mount to your GCS bucket in the right folder.
gcloud --project "$PROJECT_ID" beta run services update "$SERVICE_NAME" \
    --region $GCP_REGION \
    --execution-environment gen2 \
    --add-volume=name=php_uploads,type=cloud-storage,bucket="$BUCKET"  \
    --add-volume-mount=volume=php_uploads,mount-path="$MOUNT_PATH"

Теперь повторите этот шаг для всех конечных точек, которые вы хотите указать на облачное хранилище.

Вы также можете добиться того же от пользовательского интерфейса

  1. В рамках вкладки «Объем» создайте томальные крепления, указывающие на ваше ведро, типа «ковшера облачного хранилища», например, с именем «php_uploads».
  2. В контейнере (ы)> Mounts Mounts устанавливает том, который вы только что создали в точке объема, запрашиваемой вашим приложением. Это зависит от DockerFile, но это может выглядеть как var/www/html/uploads/ .

В любом случае, если это работает, редактирование новой ревизии Cloud Run, должно показать вам что -то вроде этого:

6C2BB98FC1B0E077.PNG

Теперь протестируйте новое приложение Загрузить одно новое изображение в конечную точку /upload.php .

Изображения должны плавно течь на GC, не написав ни одной линии PHP:

70032b216afee2d7.png

Что только что произошло?

Что -то очень волшебное произошло.

Старое приложение со старым кодом все еще выполняет свою работу. Новый, модернизированный стек позволяет нам иметь все изображения/изображения в нашем приложении, удобно сидеть в ставном облачном ведре. Теперь небо - предел:

  • Хотите отправлять электронное письмо каждый раз, когда появляется изображение с «опасным» или «обнаженным»? Вы можете сделать это, не касаясь кода PHP.
  • Хотите использовать мультимодальную модель Близнецов каждый раз, когда появляется изображение, чтобы описать ее, и загружать DB с его описанием? Вы можете сделать это, не касаясь кода PHP. Ты мне не веришь? Продолжайте читать в главе 7.

Мы только что разблокировали здесь большое пространство возможностей.

9. Модуль 7: расширить возможности вашего приложения с помощью Google Gemini

C00425F0AD83B32C.PNG

Теперь у вас есть потрясающее модернизированное, блестящее новое приложение PHP (например, 2024 Fiat 126 ) с облачным хранилищем.

Что с этим можно сделать?

Предварительные условия

В предыдущей главе модельное решение позволило нам установить изображения /uploads/ на GCS, де -факто отделяет логику приложения от хранилища изображений.

Это упражнение требует от вас:

  • Успешно завершили упражнения в главе 6 (хранение).
  • Имейте ведро GCS с загрузкой изображения, где люди загружают изображения в ваше приложение, а изображения переходят в ваше ведро.

Настройка облачной функции (в Python)

Задумывались ли вы, как реализовать приложение, управляемое событиями ? Что -то вроде:

  • Когда <событие> происходит => Отправить электронное письмо
  • Когда <event> происходит => Если <dondent> это правда, тогда обновите базу данных.

Событие может быть чем угодно, от новой записи, доступной в BigQuery, новый объект, измененный в папке в GCS, или новое сообщение ждет в очереди в Pub/Sub.

Google Cloud поддерживает несколько парадигм для достижения этого. В частности:

В этом упражнении мы углубимся в облачную функцию, чтобы достичь довольно впечатляющего результата. И мы предоставим вам дополнительные упражнения.

Обратите внимание, что пример кода предоставляется в разделе .solutions/

Настройка облачной функции (🐍 Python)

Мы пытаемся создать очень амбициозный GCF.

  1. Когда на GCS создается новое изображение .. (вероятно, как кто -то загрузил его в приложение, но не только)
  2. .. Позвоните Близнецам, чтобы описать его и получить текстовое описание изображения .. (было бы неплохо проверить MIME и убедиться, что это изображение, а не PDF, MP3 или текст)
  3. .. и обновить БД с этим описанием. (Это может потребовать исправления DB, чтобы добавить столбец description в таблицу images ).

Установите DB, чтобы добавить description к изображениям

  1. Open Cloud SQL Studio:

B92B07C4CBA658EF.PNG

  1. Поместите свой пользователь и пароль для изображений DB
  2. Введите этот SQL, который добавляет столбец для описания изображения:

ALTER TABLE images ADD COLUMN description TEXT;

3691 Sade78a6389.png

И бинго! Попробуйте сейчас проверить, сработало ли это:

SELECT * FROM images;

Вы должны увидеть новый столбец описания:

Bed69d6ad0263114.png

Напишите Близнецы f (x)

Примечание . Эта функция была фактически создана с помощью помощи Code Gemini Code .

Примечание . Создавая эту функцию, вы можете понести в ошибки разрешений IAM. Некоторые из них задокументированы ниже в пункте «Возможные ошибки».

  1. Включить API
  2. Перейдите на https://console.cloud.google.com/functions/list
  3. Нажмите «Создать функцию»
  4. Включить API от мастера API:

D22B82658CFD4C48.PNG

Вы можете создать GCF из пользовательского интерфейса или из командной строки. Здесь мы будем использовать командную строку.

Возможный код может быть найден при .solutions/

  1. Создайте папку для размещения вашего кода, например, "GCF/". Введите папку.
  2. Создайте файл requirements.txt :
google-cloud-storage
google-cloud-aiplatform
pymysql
  1. Создайте функцию Python. Пример кода здесь: gcf/main.py .
#!/usr/bin/env python

"""Complete this"""

from google.cloud import storage
from google.cloud import aiplatform
import vertexai
from vertexai.generative_models import GenerativeModel, Part
import os
import pymysql
import pymysql.cursors

# Replace with your project ID
PROJECT_ID = "your-project-id"
GEMINI_MODEL = "gemini-1.5-pro-002"
DEFAULT_PROMPT = "Generate a caption for this image: "

def gemini_describe_image_from_gcs(gcs_url, image_prompt=DEFAULT_PROMPT):
    pass

def update_db_with_description(image_filename, caption, db_user, db_pass, db_host, db_name):
    pass

def generate_caption(event, context):
    """
    Cloud Function triggered by a GCS event.
    Args:
        event (dict): The dictionary with data specific to this type of event.
        context (google.cloud.functions.Context): The context parameter contains
                                                event metadata such as event ID
                                                and timestamp.
    """
    pass
  1. Протолкнуть функцию. Вы можете использовать сценарий, похожий на это: GCF/push-to-gcf.sh .

Примечание 1 . Обязательно поставьте Envs с правильными значениями или просто добавьте их сверху ( GS_BUCKET=blah , ..):

Примечание 2 . Это подтолкнет весь локальный код ( . ), Поэтому обязательно окружайте ваш код в определенной папке и использовать .gcloudignore как профессионал, чтобы избежать разжигания огромных библиотек. ( пример ).

#!/bin/bash

set -euo pipefail

# add your logic here, for instance:
source .env || exit 2 

echo "Pushing ☁️ f(x)☁ to 🪣 $GS_BUCKET, along with DB config.. (DB_PASS=$DB_PASS)"

gcloud --project "$PROJECT_ID" functions deploy php_amarcord_generate_caption \
    --runtime python310 \
    --region "$GCP_REGION" \
    --trigger-event google.cloud.storage.object.v1.finalized \
    --trigger-resource "$BUCKET" \
    --set-env-vars "DB_HOST=$DB_HOST,DB_NAME=$DB_NAME,DB_PASS=$DB_PASS,DB_USER=$DB_USER" \
    --source . \
    --entry-point generate_caption \
    --gen2

Примечание . В этом примере generate_caption будет вызываемым методом, а облачная функция передаст событие GCS со всей соответствующей информацией (имя ведра, имя объекта, ..). Потратьте некоторое время, чтобы отладить это событие Python Dict.

Тестирование функции

Модульные тесты

Функция имеет много движущихся частей. Возможно, вы захотите иметь возможность проверить все единственные.

Примером является gcf/test.py .

Облачные функции UI

Также потратьте некоторое время, чтобы изучить вашу функцию на пользовательском интерфейсе. Каждая вкладка стоит изучить, особенно Source (мой любимый), Variables , Trigger и Logs ; Вы проведете много времени в Logs , чтобы устранения ошибок (также см. Возможные ошибки в нижней части этой страницы). Также обязательно проверьте Permissions .

CF3D30D532A2C7.PNG

Тест E2E

Время вручную проверить функцию!

  1. Зайдите в свое приложение и войдите в систему
  2. Загрузите картинку (не слишком большая, мы видели проблемы с большими изображениями)
  3. Проверьте пользовательский интерфейс, изображение загружается.
  4. Проверьте Cloud SQL Studio , что описание было обновлено. Войдите и запустите этот запрос: SELECT * FROM images .

43a680b12dbbdda0.png

И это работает! Мы также могли бы обновить фронт, чтобы показать это описание.

Обновить PHP, чтобы показать [необязательно]

Мы доказали, что приложение работает. Тем не менее, было бы неплохо, что пользователи также могли увидеть это описание.

Нам не нужно быть экспертами PHP, чтобы добавить описание в index.php . Этот код должен сделать (да, Gemini тоже написал это для меня!):

<?php if (!empty($image['description'])): ?>
    <p class="font-bold">Gemini Caption:</p>
    <p class="italic"><?php echo $image['description']; ?></p>
<?php endif; ?>

Поместите этот код внутри foreach на вашем собственном вкусе.

На следующих шагах мы также видим более красивую версию пользовательского интерфейса, благодаря Assive Gemini Code Assist. Красивая версия может выглядеть так:

FDC12DE0C88C4464.PNG

Выводы

Вы получили облачную функцию, запускаемую на новых объектах, приземленных на GCS, которая может аннотировать содержание изображения, как это может сделать человек, и автоматически обновлять DB. Ух ты!

Что дальше? Вы можете следовать тем же рассуждениям, чтобы достичь двух великих функций.

[Необязательно] Добавить дополнительные облачные функции [Open Conded]

На ум приходит пара дополнительных функций.

📩 Электронный триггер

Триггер по электронной почте , который отправляет вам электронное письмо каждый раз, когда кто -то отправляет фотографию.

  • Слишком часто? Добавьте дополнительное ограничение: общая картина или картину, содержание Близнецов, содержит слова «обнаженная/обнаженная/насильственная».
  • Рассмотрим проверку EventArc на это.

🚫 Авторучные неподходящие фотографии

В настоящее время человеческий администратор помечает изображения для «неуместного». Как насчет того, чтобы Близнецы делали тяжелую работу и смягчали пространство? Добавьте тест, чтобы Flag неподходящее содержимое триггера и обновите DB, как мы узнали в предыдущей функции. Это означает, в основном, выполнение предыдущей функции, изменение подсказки и обновление БД на основе ответа.

Предостережение . Генеративный ИИ имеет непредсказуемые результаты. Убедитесь, что «творческий вывод» от Близнецов полон «на рельсах». Вы можете попросить детерминированный ответ, как оценка доверия от 0 до 1, JSON, .. Вы можете достичь этого во многих отношениях, например: * Использование библиотек Python pydantic , langchain , .. * Используйте структурированный выход Gemini .

Кончик . Вы можете иметь несколько функций или иметь одну подсказку, которая обеспечивает соблюдение ответа JSON (работает Greta с «структурированным выводом Gemini», как отмечено выше), как:

Что будет подсказывать это для создания?

{
    "description": "This is the picture of an arrosticino",
    "suitable": TRUE
}

Вы можете добавить в приглашенные дополнительные поля, чтобы получить информацию, как: есть ли в этом что -то хорошее? Плохо об этом? Вы узнаете это место? Есть ли какой -то текст (OCR никогда не было проще):

  • goods : "Это похоже на еду yummie"
  • bads : "Это похоже на нездоровую еду"
  • OCR : "DA Consumpare Prefivibilmente Prima del 10 Novembre 2024"
  • location : "Пескара, Лунгумаре"

Хотя обычно лучше иметь N -функцию для N -результатов, невероятно полезно делать то, что делает 10 вещей. Проверьте эту статью Риккардо, чтобы увидеть, как.

Возможные ошибки (в основном IAM / разрешения)

Первое, что я разработал это решение, я пришел к некоторым вопросам разрешения IAM. Я добавлю их здесь для сочувствия и дам некоторые идеи о том, как их исправить.

Ошибка: недостаточно разрешений для учетной записи службы

  1. Обратите внимание, что для развертывания функции GCF, которая слушает ведро GCS, вам необходимо настроить надлежащие разрешения на учетную запись службы, которую вы используете для задания, как на рисунке:

22F51012FA6B4A24.PNG

Возможно, вам также придется включить API EventARC - что за несколько минут, прежде чем они станут полностью доступными.

Ошибка: пропущенная облачная запуска Invoker

  1. Другой комментарий от пользовательского интерфейса для разрешения GCF - это ( Cloud Run Invoker Роль ):

BE72E17294F2D3F3.PNG

Эта ошибка может быть исправлено, запустив команду в изображении, что аналогично Fix-Permissions.sh

Эта проблема описана здесь: https://cloud.google.com/functions/docs/securing/authenticating

Ошибка: предел памяти превышен

В первый раз, когда я запустил его, мои журналы могли бы сказать: «Предел памяти 244 MIB превысил 270 используемых MIB. Рассмотрим увеличение предела памяти, см . ". Опять же, добавьте оперативную память в свой GCF. Это очень легко сделать в пользовательском интерфейсе. Вот возможная шишка:

Bed69d6ad0263114.png

В качестве альтернативы, вы также можете исправить свой скрипт развертывания Cloud Run для Bump MEM/CPU. Это занимает немного больше времени.

Ошибка: Pubsub опубликован

Создание спускового крючка с GCF v1, как только эта ошибка дала эту ошибку:

e5c338ee35ad4c24.png

Опять же, это легко исправить, отправившись в IAM и предоставив вашему сервисному аккаунту роль «Pub/Sub Publisher».

Ошибка: AI Vertex не использовалась

Если вы получите эту ошибку:

Разрешение отказано: 403 API Vertex AI не использовался в проекте Your_Project или отключена. Включите его, посетив https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=yor_project

Вам просто нужно включить API Vertex AI. Самый простой способ обеспечить все необходимые API - это:

  1. https://console.cloud.google.com/vertex-ai
  2. Нажмите «Включить все рекомендованные API».

492F05AC377F3630.PNG

Ошибка: EventArc Trigger не найден.

Если вы получите это, пожалуйста, переведите функцию.

8EC4FC11833D7420.PNG

Ошибка: 400 сервисных агентов предоставляются

400 служебных агентов предоставляются ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ). Сервисные агенты необходимы для чтения предоставленного файла облачного хранилища. Так что, пожалуйста, попробуйте еще раз через несколько минут.

Если это произойдет, подождите время или спросите Googler.

10. Модуль 8: Создать SLOS доступности

В этой главе мы пытаемся достичь этого:

  1. Создание SLIS
  2. Создание SLO на основе SLIS
  3. Создание оповещений на основе SLOS

F63426182C052123.png

Это очень дорогая тема для автора, так как Риккардо работает в области SRE / DevOps в Google Cloud.

(открытый) Создайте SLIS и SLO для этого приложения

Насколько хорошо приложение, если вы не можете сказать, когда оно упадет?

Что такое SLO?

О боже! Google изобрел SLOS! Чтобы узнать больше об этом, я могу предложить:

Шаг 1: Создайте доступность SLI/SLO

Давайте начнем с доступности SLO, так как это самое простое и, возможно, самое важное, что вы хотите измерить.

К счастью, Cloud Run поставляется с предварительно построенной поддержкой SLO, благодаря Istio .

После того, как ваше приложение будет в облаке, это очень просто для достижения, у меня уходит 30 секунд.

  • Перейдите на свою страницу Cloud Run.
  • Нажмите/выберите приложение.
  • Выберите вкладку SLOs .
  • Нажмите «+ Создать SLO».
  • Доступность , на основе запросов
  • Продолжать
  • Календарный месяц / 99%.
  • Нажмите «Создать SLO».

e471c7ebdc56cdf6.png

Шаг 2: Настройка предупреждения на этом SLO

Я предлагаю создать 2 оповещения:

  1. Один с низким содержанием Burnrate («Slowburn»), чтобы предупредить вас по электронной почте (моделирует билет с низким PRI).
  2. Один с высоким Burnrate («Fastburn»), чтобы предупредить вас через SMS (моделирует билет / пейджер High PRI)

Перейдите на свою SLO tab

Сделайте это дважды:

314bfd6b9ef0a260.png

  • Нажмите «Создать оповещение SLO» (кнопка 🔔 с плюсом внутри, справа)
  • Продолжительность просмотра, порог скорости сжигания:
  • [БЫСТРЫЙ]. Первое: 60 мин / 10 х
  • [МЕДЛЕННЫЙ]. Второе: 720 мин / 2 х
  • Канал уведомления: нажмите на каналы уведомления управления
  • Во -первых, "Электронная почта" -> добавить новый -> ..
  • Во -вторых, "SMS" -> Добавить новый -> Проверьте на телефоне.
  • Совет: мне нравится использовать смайлики в именах! Это весело для демонстраций.
  • Когда закончите, нажмите «Большой Х» сверху справа.
  • Сначала выберите телефон (быстро), по электронной почте следующее (медленно).
  • Добавьте пример документации, например:
  • [PHP Amarcord] Riccardo told me to type sudo reboot or to check documentation in http://example.com/playbooks/1.php but I guess he was joking .

Бинго!

Окончательный результат

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

Если вы хотите, вы можете добавить задержку (и я настоятельно рекомендую вам это сделать) или даже более сложный. Для задержки выберите задержку, которую вы считаете разумной; В случае сомнений выберите 200 мс .

11. Следующие шаги

Вы все завершили, чего не хватает?

Немного еды для размышлений:

Играть с Близнецами

Вы можете использовать Близнецы в двух вкусах:

  1. Vertex Ai. «Enterprise Way», переплетенный с вашим GCP, который мы исследовали в главе 7 (GCF+Gemini). Вся аутентификация волшебным образом работает, и услуги прекрасно взаимосвязаны.
  2. Google AI. «Потребительский путь». Отсюда вы получаете ключ API Gemini и начинаете строить небольшие сценарии, которые можно связать с любой рабочей нагрузкой (проприетарная работа, другие облака, Localhost, ..). Вы просто замените свой ключ API, и код начинается магически, чтобы работать.

Мы призываем вас попробовать изучить (2) с вашими собственными проектами для домашних животных.

Пользовательский подъем

Я не хорош в UIS. Но Близнецы есть! Вы можете просто взять одну страницу PHP и сказать что -то вроде этого:

I have a VERY old PHP application. I want to touch it as little as possible. Can you help me:

1. add some nice CSS to it, a single static include for tailwind or similar, whatever you prefer
2. Transform the image print with description into cards, which fit 4 per line in the canvas?

Here's the code:

-----------------------------------
[Paste your PHP page, for instance index.php - mind the token limit!]

Вы можете легко получить это менее чем за 5 минут, один облако нарастает! :)

Ответ Близнецов был идеальным (это означает, что мне не нужно было ничего менять):

8A3D5FE37EC40BF8.PNG

А вот новый макет в личном приложении автора:

81620EB90AE3229A.PNG

Примечание. Код вставлен как изображение, так как мы не хотим поощрять вас принимать код, но чтобы заставить Близнецы написать код для вас, с вашим собственным творческим пользовательским интерфейсом/ограничениями фронта; Поверьте мне, у вас останется очень незначительные изменения после этого.

Безопасность

Правильная защита этого приложения-это нецелевая мастерская.

Для некоторых идей, проверьте doc SECURITY .

12. Поздравляю!

Поздравляем 🎉🎉🎉, вы успешно модернизировали свое устаревшее приложение PHP с помощью Google Cloud.

24CB9A39B1841FBD.PNG

Таким образом, в этом коделабе вы узнали:

  • Как развернуть базу данных MySQL в Google Cloud SQL и как перенести в нее существующую базу данных.
  • Как контейнерировать приложение PHP с помощью Docker и Build Packs и хранить его изображение в реестре Google Cloud Artifact
  • Как развернуть ваше приложение для контейнер для Cloud Run и запустить с помощью Cloud SQL
  • Как тайно хранить/использовать конфиденциальные параметры конфигурации (например, пароль DB), используя Google Secret Manager
  • Как настроить свой конвейер CI/CD с помощью Google Cloud Build, чтобы автоматически построить и развернуть ваше приложение PHP при любом кодовом точке для вашего репозитория GitHub.
  • Как использовать облачное хранилище для «облачного» ресурсов вашего приложения
  • Как использовать технологии без серверов для создания удивительных рабочих процессов в верхней части Google Cloud, не касаясь кода вашего приложения.
  • Используйте мультимодальные возможности Gemini для примечательного использования.

Это отличное начало для вашего путешествия в модернизацию приложений с Google Cloud!

🔁 Обратная связь

Если вы хотите рассказать нам о своем опыте работы с этим семинаром, рассмотрите возможность подачи этой формы обратной связи .

Мы приветствуем ваши отзывы, а также PR S для кусочков кода, которыми вы особенно гордитесь.

🙏 Спасибо

Автор хотел бы поблагодарить Мирко Гилиоли и Маурицио Ипсале из DataTonic за помощь в записи и тестировании решения.