Как развернуть Go-приложение на AWS Elastic Beanstalk

Elastic Beanstalk — это PaaS (Platform-as-a-Service) от Amazon Web Services, которое автоматизирует создание и управление ресурсами, необходимыми для работы приложений: EC2-инстансы, балансировщики нагрузки, Auto Scaling, S3-бакеты и т.д. Это упрощает вывод приложений из локальной среды в продакшн: минимум ручной настройки инфраструктуры, простые команды и возможность интеграции с CI/CD.
В этой статье вы найдёте пошаговое руководство по созданию простого Go-сервера, деплою через EB CLI, а также дополнительные материалы: когда Elastic Beanstalk не подходит, альтернативы, методики безопасности, чек-листы для ролей, критерии приёмки и план отката.
Что нужно подготовить
- Go (версии 1.13+ или актуальная стабильная версия) установлен на рабочей машине. Коротко: Go — компилируемый язык от Google для серверных приложений.
- Аккаунт AWS и базовая конфигурация учётных данных (Access Key ID, Secret Access Key) в профиле AWS CLI или через eb init.
- Установленный EB CLI (Elastic Beanstalk CLI). Инструкция установки: официальная документация AWS EB CLI.
- Базовые навыки работы с терминалом и Git желательны, но не обязательны.
Важно: Elastic Beanstalk по умолчанию использует NGINX как обратный прокси и ожидает, что приложение слушает порт 5000 (если вы не меняете конфигурацию NGINX).
Создаём простое веб-приложение на Go
Ниже шаги для создания минимального приложения, которое отдаёт статическую страницу.
- Инициализируйте новый проект и перейдите в директорию проекта (пример в терминале):

- В корне проекта создайте папку static и файл static/index.html со следующим содержимым:
Hello world!
Hello World from Elastic Beanstalk
- Создайте файл application.go в корне проекта. Важное замечание: Elastic Beanstalk по умолчанию ищет исполняемый файл или точку входа, поэтому файл с main лучше назвать application.go, чтобы платформа правильно собрала приложение.
package main
import (
"log"
"net/http"
)
func main() {
static := http.FileServer(http.Dir("./static"))
http.Handle("/", static)
log.Fatal(http.ListenAndServe(":5000", nil))
}
- Запустите локально для проверки:
- Команда: go run application.go
- Откройте в браузере: http://localhost:5000

Если вы видите страницу с «Hello World from Elastic Beanstalk», приложение готово к деплою.
Развёртывание приложения в AWS Elastic Beanstalk через EB CLI
Мы используем EB CLI — удобный инструмент командной строки для создания приложений и окружений Elastic Beanstalk.
Перейдите в корень проекта в терминале.
Инициализация EB репозитория:
- Выполните: eb init
- EB CLI задаст вопросы: регион, профиль AWS, название приложения, платформа. Следуйте подсказкам.

- Настройка учётных данных AWS (если требуется):
- В процессе eb init вы можете выбрать профиль AWS или ввести Access Key ID/Secret Access Key.

- Выберите платформу. Для Go обычно выбирают соответствующую опцию (например, Go)

- SSH: EB CLI спросит, хотите ли вы разрешить SSH-доступ к инстансам. Для простых тестовых приложений можно выбрать No, но для отладки стоит включать SSH и создать ключ.

- Создание окружения и развёртывание:
- Выполните: eb create “my-env”
- Процесс создаёт все ресурсы (EC2, ELB, Auto Scaling, S3) и занимает примерно 5–10 минут.

- Откройте приложение в браузере:
- Выполните: eb open
- Должна открыться URL вашего приложения, где будет отображаться «Hello World».

- Обновления и остановка окружения:
- Обновить код: eb deploy
- Остановить окружение и удалить ресурсы: eb terminate
Совет: в EB Console доступна история дистрибутивов (versions) — оттуда можно откатить приложение к предыдущей версии через веб-интерфейс.
Практические замечания по порту и NGINX
- По умолчанию платформа Elastic Beanstalk для Go использует NGINX как reverse proxy и ожидает, что ваше приложение слушает порт 5000. Если вы хотите слушать другой порт, нужно изменить конфигурацию NGINX через файлы в .platform (см. сниппет ниже).
Пример кастомизации NGINX (файл проекта .platform/nginx/conf.d/proxy.conf):
# .platform/nginx/conf.d/proxy.conf
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}Если вы меняете порт на 8080, не забудьте, что приложение должно слушать 8080 вместо 5000.
Альтернативные способы деплоя (когда использовать другое решение)
- ECS (Amazon Elastic Container Service): если вы хотите полный контроль над контейнерной оркестрацией и/или интеграцию с сложными CI/CD пайплайнами.
- EKS (Kubernetes): для организаций, использующих Kubernetes как стандартную платформу, с необходимостью портировать существующие k8s-манифесты.
- AWS Lambda (Serverless): если ваше приложение можно упростить до безсерверных функций и требуется масштабирование по событиям.
- Docker на Elastic Beanstalk (Docker-платформа): если вы хотите запускать контейнеры без управления кластером.
- Heroku: альтернатива с похожим опытом PaaS, но с другой моделью биллинга и интеграций.
Когда Elastic Beanstalk не подходит:
- Вы управляете сложным кластером микросервисов с кастомными сетевыми требованиями — рассматривайте EKS.
- Нужна строго предсказуемая стоимость и детальный контроль над инфраструктурой — ECS/EKS предпочтительнее.
- Требуется высокая плотность контейнеров и сложное планирование ресурсов — Kubernetes.
Сравнительная матрица (кратко)
- Elastic Beanstalk: лёгкая автоматизация, быстрый старт, меньше контроля.
- ECS: контейнеры, высокий контроль, тесная интеграция с AWS.
- EKS: полная Kubernetes-совместимость, сложнее в управлении.
- Lambda: идеальна для событийных задач, но не для долгоживущих HTTP-сервисов.
Мини-методология: шаги до стабильного продакшн-окружения
- Локальная проверка: unit и интеграционные тесты, прогон в докере.
- Настройка окружений: тестовое (staging) и прод (production).
- CI/CD: автоматизация сборки, тестов и деплоя (например, GitHub Actions → eb deploy).
- Мониторинг: CloudWatch метрики, логирование, алёрты.
- Backup и откат: версии в S3, бэкапы данных и тестируемый план отката.
Чек-листы по ролям
Разработчик:
- Код проходит unit-тесты.
- Приложение слушает правильный порт (5000 по умолчанию).
- Все зависимости зафиксированы (go.mod).
- Локально проверена статическая сборка.
DevOps / Инженер по площадке:
- EB окружение создано с подходящими правами IAM.
- HTTPS настроен через ACM и ELB/ALB.
- Логи и метрики направлены в CloudWatch.
- Настроено авто-скейлинг и health checks.
Критерии приёмки
- Команда eb create завершилась без ошибок и окружение имеет статус Green.
- eb open показывает ожидаемую страницу с корректным содержимым.
- HTTP/HTTPS ответы от приложения успешны (2xx) при проверках health check.
- Логи приложения доступны в CloudWatch и содержат ожидаемые записи.
Тесты и критерии приёмки (примеры)
- Smoke test: GET / возвращает 200 и содержит текст «Hello World».
- Интеграционный тест: имитация трафика 100 RPS в течение 30 секунд — окружение не деградирует.
- Регрессион: запуск набора unit-тестов после деплоя.
Откат и инцидентный план (Runbook)
- Обнаружен инцидент: приложение отвечает ошибками, health статус изменился на Red.
- Быстрая проверка: eb status, eb health, CloudWatch Logs.
- Если проблема в новом деплое — откат к предыдущей версии:
- Через консоль: Elastic Beanstalk → Application versions → выбрать предыдущую версию → Deploy.
- Через EB CLI: можно указать конкретную версию при деплое (используйте version label из истории версий).
- Если требуется выключить окружение: eb terminate — это удалит ресурсы, используйте осторожно.
- После отката — провести постмортем, зафиксировать root cause и добавить тест, предотвращающий повтор.
Практические рекомендации по безопасности
- Минимальные права IAM: используйте роли с принципом least privilege.
- HTTPS: привяжите сертификат ACM к балансировщику нагрузки и принудите HTTPS.
- SSH: не открывайте SSH в продакшне без явной необходимости; при необходимости — ограничьте по IP.
- Секреты: храните в AWS Systems Manager Parameter Store или Secrets Manager; используйте KMS-шифрование.
- Логи: отправляйте лог-файлы в CloudWatch для централизованного мониторинга.
Советы по миграции и масштабированию
- Для контейнеризованных приложений рассмотрите Docker на EB или переход на ECS/EKS для сложной оркестрации.
- Планируйте авто-скейлинг и health checks заранее.
- Для stateful-сервисов используйте внешние хранилища (RDS, ElastiCache) — не полагайтесь на локальную файловую систему инстанса.
Полезные сниппеты и конфиги
application.go (минимальный пример — уже приведён выше)
index.html (в static/index.html) — тоже выше.
Пример .platform/nginx/conf.d/proxy.conf, если нужно изменить проксирование:
# .platform/nginx/conf.d/proxy.conf
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}Пример minimal .ebextensions для установки переменных окружения и логирования:
# .ebextensions/01-environment.config
option_settings:
aws:elasticbeanstalk:application:environment:
APP_ENV: "production"
LOG_LEVEL: "info"Примечание: директория .platform и .ebextensions должна быть в корне проекта и включена в архив при деплое.
Когда Elastic Beanstalk не сможет помочь (контрпримеры)
- Вы хотите управлять кастомным сетевым стэком с множеством VPC правил и CNI-плагинов — EB ограничит гибкость.
- Вам нужен глубокий контроль над cgroup/CPU-подсистемами контейнеров — лучше перейти на Kubernetes.
- Вы строите высокоплотное мульти-тенантное окружение с нестандартным образом жизненного цикла контейнеров.
Краткое резюме
Elastic Beanstalk — удобный путь для быстрого вывода Go-приложений в облако без ручной настройки всех компонентов инфраструктуры. Для небольших и средних приложений EB экономит время и снижает сложность. Если вам нужен максимальный контроль, контейнерная масштабируемость или специфичный сетевой стек — рассмотрите ECS/EKS.
Важно: тестируйте деплой в staging, настраивайте мониторинг и план отката, а также следуйте принципам безопасности: минимальные права, HTTPS и централизованное логирование.
Полезные команды (шпаргалка):
- eb init — инициализация EB проекта
- eb create
— создание окружения и деплой - eb deploy — деплой текущей версии
- eb open — открыть URL приложения
- eb status / eb health — проверка статуса окружения
- eb terminate — удаление окружения и ресурсов
Завершите эксперимент, построив небольшой CRUD-сервис на Go и развернув его на Elastic Beanstalk, чтобы закрепить все шаги в памяти.
Важно: для продуктивных сред создавайте отдельные окружения (staging, prod), настраивайте CI/CD и регулярно проверяйте политические и финансовые аспекты использования облачных ресурсов.
Краткое резюме в одну строку: Elastic Beanstalk позволяет быстро перевести локальное Go-приложение в рабочее облачное окружение с минимальной конфигурацией инфраструктуры.
Похожие материалы
Как увидеть, кто изменял Google Docs
Колонтитулы в Google Docs: как добавить и настроить
Оформление в MLA в Google Docs
Помощь при написании в Google Docs
Изменить шрифт по умолчанию в Google Docs и Word