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”