Развёртывание Deno на Amazon Lightsail
Amazon Lightsail — самый простой и дешёвый способ начать работу с Amazon Web Services. Он позволяет размещать виртуальные машины и даже целые контейнерные сервисы.
Это руководство покажет, как развернуть приложение Deno на Amazon Lightsail с использованием Docker, Docker Hub и GitHub Actions.
Перед продолжением убедитесь, что у вас есть:
dockerкомандная строка- учётная запись на Docker Hub
- учётная запись на GitHub
- учётная запись на AWS
Создание Dockerfile и docker-compose.yml
Чтобы сосредоточиться на развёртывании, наше приложение будет просто main.ts файлом, который возвращает строку в качестве HTTP-ответа:
import { Application } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
app.use((ctx) => {
ctx.response.body = "Hello from Deno and AWS Lightsail!";
});
await app.listen({ port: 8000 });
Затем мы создадим два файла — Dockerfile и docker-compose.yml — для сборки Docker-изображения.
В нашем Dockerfile, добавим:
FROM denoland/deno
EXPOSE 8000
WORKDIR /app
ADD . /app
RUN deno install --entrypoint main.ts
CMD ["run", "--allow-net", "main.ts"]
Затем, в нашем docker-compose.yml, добавим:
version: "3"
services:
web:
build: .
container_name: deno-container
image: deno-image
ports:
- "8000:8000"
Давайте протестируем это локально, выполнив docker compose -f docker-compose.yml build, затем docker compose up, и перейдя по адресу localhost:8000.
Работает!
Сборка, добавление тега и отправка в Docker Hub
Сначала войдём в Docker Hub и создадим репозиторий. Назовём его deno-on-aws-lightsail.
Затем добавим тег и отправим наше новое изображение, заменив username вашим:
Затем выполним сборку изображения локально. Обратите внимание, что наш docker-compose.yml файл назовёт сборку deno-image.
docker compose -f docker-compose.yml build
Добавим тег к локальному изображению с помощью команды tag, заменив {{ username }}/deno-on-aws-lightsail:
docker tag deno-image {{ username }}/deno-on-aws-lightsail
Теперь мы можем отправить изображение в Docker Hub:
docker push {{ username }}/deno-on-aws-lightsail
После успешного выполнения, вы должны увидеть новое изображение в вашем репозитории Docker Hub:

Создание и развёртывание в контейнере Lightsail
Перейдём в консоль Amazon Lightsail.
Затем нажмите «Контейнеры» и «Создать контейнерную службу». На середине страницы нажмите «Настроить первый развёртывание» и выберите «Указать пользовательское развёртывание».
Вы можете задать любое имя контейнера.
В Image, обязательно используйте {{ username }}/{{ image }} из Docker Hub. В этом примере это lambtron/deno-on-aws-lightsail.
Нажмём Add open ports и добавим 8000.
Наконец, в PUBLIC ENDPOINT, выберите имя контейнера, которое вы только что создали.
Полная форма должна выглядеть так:

Когда будете готовы, нажмите «Создать контейнерную службу».
Через несколько мгновений ваш новый контейнер будет развернут. Нажмите на общедоступный адрес, и вы увидите своё приложение Deno:
Автоматизация с помощью GitHub Actions
Для автоматизации этого процесса мы будем использовать aws командную строку с подкомандой lightsail.
Шаги в нашем рабочем процессе GitHub Actions будут:
- Получение репозитория
- Сборка приложения как Docker-изображения локально
- Установка и аутентификация AWS CLI
- Отправка локального Docker-изображения в AWS Lightsail Container Service через CLI
Предварительные требования для работы этого рабочего процесса GitHub Actions:
- создан контейнер AWS Lightsail (см. раздел выше)
- настроен пользователь IAM и соответствующие разрешения. (Узнайте больше о управлении доступом к Amazon Lightsail для пользователя IAM.)
-
AWS_ACCESS_KEY_IDиAWS_SUCCESS_ACCESS_KEYдля вашего пользователя с правами. (Следуйте этому руководству AWS, чтобы сгенерироватьAWS_ACCESS_KEY_IDиAWS_SUCCESS_ACCESS_KEY.)
Давайте создадим новый файл container.template.json, содержащий настройки для создания развёртывания контейнера службы. Обратите внимание на сходство значений этих параметров с введёнными нами вручную значениями в предыдущем разделе.
{
"containers": {
"app": {
"image": "",
"environment": {
"APP_ENV": "release"
},
"ports": {
"8000": "HTTP"
}
}
},
"publicEndpoint": {
"containerName": "app",
"containerPort": 8000,
"healthCheck": {
"healthyThreshold": 2,
"unhealthyThreshold": 2,
"timeoutSeconds": 5,
"intervalSeconds": 10,
"path": "/",
"successCodes": "200-499"
}
}
}
Добавим следующее в ваш файл .github/workflows/deploy.yml:
name: Build and Deploy to AWS Lightsail
on:
push:
branches:
- main
env:
AWS_REGION: us-west-2
AWS_LIGHTSAIL_SERVICE_NAME: container-service-2
jobs:
build_and_deploy:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout main
uses: actions/checkout@v2
- name: Install Utilities
run: |
sudo apt-get update
sudo apt-get install -y jq unzip
- name: Install AWS Client
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install || true
aws --version
curl "https://s3.us-west-2.amazonaws.com/lightsailctl/latest/linux-amd64/lightsailctl" -o "lightsailctl"
sudo mv "lightsailctl" "/usr/local/bin/lightsailctl"
sudo chmod +x /usr/local/bin/lightsailctl
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ env.AWS_REGION }}
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: Build Docker Image
run: docker build -t ${{ env.AWS_LIGHTSAIL_SERVICE_NAME }}:release .
- name: Push and Deploy
run: |
service_name=${{ env.AWS_LIGHTSAIL_SERVICE_NAME }}
aws lightsail push-container-image \
--region ${{ env.AWS_REGION }} \
--service-name ${service_name} \
--label ${service_name} \
--image ${service_name}:release
aws lightsail get-container-images --service-name ${service_name} | jq --raw-output ".containerImages[0].image" > image.txt
jq --arg image $(cat image.txt) '.containers.app.image = $image' container.template.json > container.json
aws lightsail create-container-service-deployment --service-name ${service_name} --cli-input-json file://$(pwd)/container.json
Здесь много всего происходит! Два последних шага наиболее важны: Build Docker Image и Push and Deploy.
docker build -t ${{ env.AWS_LIGHTSAIL_SERVICE_NAME }}:release .
Эта команда собирает наше Docker-изображение с именем container-service-2 и добавляет ему тег release.
aws lightsail push-container-image ...
Эта команда отправляет локальное изображение в наш контейнер Lightsail.
aws lightsail get-container-images --service-name ${service_name} | jq --raw-output ".containerImages[0].image" > image.txt
Эта команда получает информацию об изображении и, используя jq, парсит её и сохраняет имя изображения в локальном файле image.txt.
jq --arg image $(cat image.txt) '.containers.app.image = $image' container.template.json > container.json
Эта команда использует имя изображения, сохранённое в image.txt и container.template.json, и создаёт новый файл настроек, названный container.json. Этот файл настроек будет передан aws lightsail для финального развёртывания на следующем шаге.
aws lightsail create-container-service-deployment --service-name ${service_name} --cli-input-json file://$(pwd)/container.json
Наконец, эта команда создаёт новое развёртывание с использованием service_name, а также настроек конфигурации из container.json.
После отправки в GitHub и успешного выполнения действия, вы увидите своё новое приложение Deno в AWS:
🦕 Теперь вы можете развернуть приложение Deno на Amazon Lightsail с помощью Docker, Docker Hub и GitHub Actions.
© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/tutorials/aws_lightsail