Рубрики
Без рубрики

21 июня #cloudguruchallenge

TL; Доктор я закончил другой #cloudguruchallenge. В этом месяце нам бросили сомнение, чтобы улучшить … Помечено с AWS, Elasticache, Python, Redis.

TL; доктор

Я закончил другой #Cloudguruchallenge . В этом месяце нам было оспорен, чтобы улучшить производительность приложения Python, путем внедрения уластичной радости для Redis.

Я думал, что эта задача была действительно интересной, потому что производительность приложений такая большая тема в отрасли. Я видел Python и Redis уже несколько раз уже несколько раз.

К сожалению, благодаря характеру услуг, необходимых для этой проблемы, я не смог взять безсетесовый подход. Это также означает, что я бы уже оторвал ресурсы к тому времени, когда вы читаете это. Не волнуйтесь, хотя я сделал несколько фотографий для нас, чтобы наслаждаться!

Реакция базы данных

Реакция кэша

Если вы хотите оформить заказ кода или подключиться к LinkedIn, затем см. Ниже.

Github https://github.com/wheelers-websites/CloudGuruChallenge_21.06

LinkedIn https://www.linkedin.com/in/justin-wheeer-the-cloud-architect/

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

Архитектура

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

Сетевая архитектура

  • VPC.
  • 4 общественных подсети
  • 4 частных подсети
  • Таблица публичных маршрутов
  • Частный маршрут Таблица
  • Интернет-шлюз
  • Ворота Nat
  • Группа общественной безопасности (HTTP и SSH)
  • Частная группа безопасности (PostgreSQL и Redis)

Архитектура приложений

  • Экземпляр EC2
  • Ec2 keypair.
  • Экземпляр эластики рады
  • Группа подсети упругостих
  • Rds postgresql экземпляр
  • Группа подсети RDS

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

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

HTTPS Ingress

  • Обновить группу общественной безопасности для разрешения HTTPS вместо HTTP
  • Настройка Nginx для использования HTTPS

Отработка шлюза NAT

  • Установка Failover NAT Gateway в другом AZ
  • Обновите таблицу таблицы маршрута, чтобы использовать один или оба Nat Gateways.

Несколько серверов приложений с балансировкой/нагрузкой

  • Настройте приложение для запуска как часть ASG вместо
  • Настройка ALB/NLB перед ASG для загрузки баланса

Террафор

Как и в предыдущих проектах, я решил использовать здесь террафом для инфраструктуры в качестве кода (IAC). Кажется, что каждый раз, когда я использую террафору, я нахожу что-то новое, что мне нравится в этом.

Ниже приведены список новых признаков, которые я недавно узнал и использовал в этом проекте.

блок местных жителей

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

https://www.terraform.io/docs/language/values/locals.html

locals {
  availability_zones = [
    "us-east-1a",
    "us-east-1b",
    "us-east-1c",
    "us-east-1d"
  ]
  cidr_anywhere_block = "0.0.0.0/0"
  ...
}

local.cidr_anywhere_block

Функция файла

Эта функция позволяет легко передавать файл в объявление ресурсов. Это позволило мне загрузить мою экземпляр EC2, управляя этим скриптом за пределы самого шаблона. Здесь не требуется сумасшедший форматирование!

https://www.terraform.io/docs/language/functions/file.html

resource "aws_instance" "server" {
  ...
  user_data = file("user-data.sh")
}

Random_Shuffle Provider.

Эта функция позволяет переключать список значений и возврата x количество значений обратно. Я думал, что это было гораздо более умным, чем просто предоставление единого значения и более гибко!

https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/shuffle

variable "subnet" {
  description = "subnet ids"
  type = object({
    private = list(string)
    public  = list(string)
  })
}

subnet = {
  ...
  public  = [
    "subnet-01b36f97fa8490e43",
    "subnet-0a4272a81af160127",
    "subnet-03939599dd92f0f07",
    "subnet-0b6f2c6a35b31e4d5"
  ]
}

resource "random_shuffle" "public_subnet" {
  input        = var.subnet.public
  result_count = 1
}

subnet_id = random_shuffle.public_subnet.result[0]

Счет мета-аргумент

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

https://www.terraform.io/docs/language/meta-arguments/count.html

resource "aws_subnet" "public" {
  count = length(local.cidr_public_blocks)
  cidr_block        = local.cidr_public_blocks[count.index]
  ...
}

GitHub (террафор)

Колбу, боевика и стили

Я изменил приложение по умолчанию, которое было предоставлено David Thomas для использования некоторых новых знаний о связанных темах.

https://github.com/ACloudGuru/elastic-cache-challenge

Jinja выражения

Это позволило мне поставить логику в мои HTML-шаблоны, похожие на NGIF для угловых. Я в основном сделал это потому, что при тестировании я не хотел видеть пустые разделы, нарисованные на экране. Теперь они будут скрыты, если значения не передаются в Render_template функция.

{% if db_host %}
Database Host {{ db_host }}
{% endif %}

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

debug = os.environ.get('DEBUG')
debug = debug.lower() in ['1', 't', 'true', 'y', 'yes'] if debug is not None else False

...
try:
    config = ini('postgres')
    db_host = config['host']
    db_version = select_version()

except Exception as e:
    print('index() error:', e)
    error = e if debug else "we're currently experiencing technical difficulties"

return render_template(
    html,
    error=error,
    db_host=db_host,
    db_version=db_version
)

Jinja наследование

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


  
  
  CloudGuruChallenge_21.06


  {% block content %}
  {% endblock %}

{% extends 'base.html' %}
{% block content %}
...
Elapsed Time {{ g.request_time() }}
{% endblock %}

Сервер Gunicorn

Я быстро узнал, что встроенный сервер флэкса не предназначен для работы в производстве. Хотя, возможно, это было хорошо для этого простого проекта, я хотел бы пойти на лишнюю милю, чтобы настроить Gunicorn вместо этого.

После установки я просто запустил приложение как демон в моем сценарии Bootstrap. например Приложение Gunicorn -D: приложение

Стиль

Я не мог выдержать горючее HTML-страницу и решил использовать некоторые CSS, чтобы елить его на тапу. В дополнение к стилю, я хотел использовать колбу статический Активы и URL_FOR Также и затвердевать эти знания.

Github (python)

Вывод

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

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

Ваше здоровье!

Github https://github.com/wheelers-websites/CloudGuruChallenge_21.06

LinkedIn https://www.linkedin.com/in/justin-wheeer-the-cloud-architect/

Оригинал: “https://dev.to/wheelerswebsites/jun-21-cloudguruchallenge-2k11”