Spec-Zone.ru › Deno 2

Развёртывание 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.

hello world from localhost

Работает!

Сборка, добавление тега и отправка в 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:

new image on docker hub

Создание и развёртывание в контейнере Lightsail

Перейдём в консоль Amazon Lightsail.

Затем нажмите «Контейнеры» и «Создать контейнерную службу». На середине страницы нажмите «Настроить первый развёртывание» и выберите «Указать пользовательское развёртывание».

Вы можете задать любое имя контейнера.

В Image, обязательно используйте {{ username }}/{{ image }} из Docker Hub. В этом примере это lambtron/deno-on-aws-lightsail.

Нажмём Add open ports и добавим 8000.

Наконец, в PUBLIC ENDPOINT, выберите имя контейнера, которое вы только что создали.

Полная форма должна выглядеть так:

create container service interface

Когда будете готовы, нажмите «Создать контейнерную службу».

Через несколько мгновений ваш новый контейнер будет развернут. Нажмите на общедоступный адрес, и вы увидите своё приложение Deno:

Hello world from Deno and AWS Lightsail

Автоматизация с помощью GitHub Actions

Для автоматизации этого процесса мы будем использовать aws командную строку с подкомандой lightsail.

Шаги в нашем рабочем процессе GitHub Actions будут:

  1. Получение репозитория
  2. Сборка приложения как Docker-изображения локально
  3. Установка и аутентификация AWS CLI
  4. Отправка локального 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 on 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API