Автор оригинала: Vyacheslav.
Вступление
Долгое время Amazon Web Services была одной из наиболее часто используемых платформ для развертывания и запуска новых проектов. Для более сложных проектов вы обычно начинаете с освоения вашей сетевой инфраструктуры. К счастью, Amazon предоставляет окончательное руководство по самым подержанным топологиям сети. Вы можете просмотреть некоторые в http://docs.aws.az.amazon.com/amazonvpc/latest/userguide/vpc_scenarios.html Отказ
По некоторым причинам, в большинстве случаев я видел, клиент всегда настраивает настройку вручную, а затем документирует шаги с помощью скриншотов в проекте Wiki. Затем, через некоторое время оригинальные знания теряются и перемещающиеся или развертывающие приложение снова приводят к тщательному ручным шагам.
В этой статье я продемонстрирую, как я автоматизурую создание сети с помощью Anbible для приложений в соответствии с требованиями проекта, и хранить логику создания сети наряду с проектом. Таким образом, ваша проектная инфраструктура развивается и выпускает вместе с выпусками ваших приложений.
Фон
Для демонстрации, давайте выберем более сложную установку, как описано здесь VPC с государственными и частными подсетью (NAT) Отказ
Давайте посмотрим на определение, а топология сети:
Конфигурация для этого сценария включает в себя виртуальное частное облако (VPC) с публичной подсетью и частной подсетью. Мы рекомендуем этот сценарий, если вы хотите запустить веб-приложение, обращенное общедоступным, при сохранении автономных серверов, которые не являются общедоступными. Общим примером является многоуровневый веб-сайт с веб-серверами в общедоступной подсети и серверах баз данных в частной подсети. Вы можете настроить безопасность и маршрутизацию, чтобы веб-серверы могли взаимодействовать с серверами баз данных.
Исполнения в общественной подсети могут получить входящий трафик непосредственно из Интернета, тогда как экземпляры в частной подсети не могут. Инстанции в общедоступной подсети могут отправлять исходящий трафик непосредственно в Интернет, тогда как экземпляры в частной подсети не могут. Вместо этого экземпляры в частной подсети могут получить доступ к Интернету, используя шлюз трансляции сетевого адреса (NAT), который находится в общедоступной подсети. Серверы баз данных могут подключаться к Интернету для обновлений программного обеспечения с использованием Gateway NAT, но Интернет не может инициировать соединения с серверами баз данных.
Давайте реализовать немного более сложного примера, чем то, что было описано: сделать приложение, доступное высоко доступное, поместив серверы приложений в несколько подсетей. Таким образом, в общественной подсети у нас будет упругий балансировщик нагрузки, который будет связан с несколькими подсети, которые мы создаем.
В нашем сценарии мы будем использовать обе функции из модуля Anbible AWS и Direct awscli
Команды, где Anisible еще не поддерживает.
В начале у нас не было бы VPC в нашем счете:
Определить VPC
Препараты
В качестве регионов есть различие в наборах зон доступности, давайте создадим два константа, чтобы исправить имеющиеся имени AZ зон для обеспечения + Обеспечить некоторое разумное имя для окружающей среды.
--- vpc_availability_zone_t1: b vpc_availability_zone_t2: c readable_env_name: "app-{{env}}"
Состав
Давайте определим VPC в соответствии со сценарием 2 картинки. Чтобы быть как можно ближе к примеру Amazon, я бы сделал 0,0 и 2,0 подсети публичными, и 1,0 и 3.0 частный; Как вы можете видеть в конфигурациях VPC, мы уже даем удобное читаемое имя и теги. Для двух общедоступных сетей мы указываем таблицу маршрутизации по умолчанию.
vpc_cidr_block: 10.0.0.0/16 vpc_subnets: - cidr: 10.0.0.0/24 az: "{{aws_region}}{{vpc_availability_zone_t1}}" resource_tags: {"Name": "{{readable_env_name}}-sb-pub-{{aws_region}}-{{vpc_availability_zone_t1}}", "Environment":"{{readable_env_name}}", "AZ" : "{{vpc_availability_zone_t1}}" } - cidr: 10.0.2.0/24 az: "{{aws_region}}{{vpc_availability_zone_t2}}" resource_tags: { "Name": "{{readable_env_name}}-sb-pub-{{aws_region}}-{{vpc_availability_zone_t2}}", "Environment":"{{readable_env_name}}", "AZ" : "{{vpc_availability_zone_t2}}" } - cidr: 10.0.1.0/24 az: "{{aws_region}}{{vpc_availability_zone_t1}}" resource_tags: {"Name": "{{readable_env_name}}-sb-priv-{{aws_region}}-{{vpc_availability_zone_t1}}", "Environment":"{{readable_env_name}}", "AZ" : "{{vpc_availability_zone_t1}}" } - cidr: 10.0.3.0/24 az: "{{aws_region}}{{vpc_availability_zone_t2}}" resource_tags: { "Name": "{{readable_env_name}}-sb-priv-{{aws_region}}-{{vpc_availability_zone_t2}}", "Environment":"{{readable_env_name}}", "AZ" : "{{vpc_availability_zone_t2}}" } vpc_internet_gateway: "yes" vpc_route_tables_public: - subnets: - 10.0.0.0/24 - 10.0.2.0/24 routes: - dest: 0.0.0.0/0 gw: igw
Создание VPC.
Чтобы создать VPC, мы используем уже доступный модуль Ansible, EC2_VPC
; При запуске мы предоставляем параметры для него, используя настройку выше.
- name: NETWORK | Create the VPC ec2_vpc: state: present region: "{{ aws_region }}" resource_tags: Environment: "{{ readable_env_name }}" Name: "{{ readable_env_name }}-vpc-{{aws_region}}" cidr_block: "{{ vpc_cidr_block }}" subnets: "{{ vpc_subnets }}" dns_support: true dns_hostnames: true internet_gateway: "{{ vpc_internet_gateway|string }}" route_tables: "{{ vpc_route_tables_public }}" wait: yes register: vpc
После выполнения этой части у нас будет VPC, созданный рядом с подсетью:
Посмотрите на Gateways Nat Gateways — как вы видите, у нас есть 1 шлюз NAT на публичную подсеть.
Посмотрите на таблицу маршрута. Как вы видите — общественные подсети имеют интернет-шлюз набор,
В то время как частная подсеть имеет запись маршрута, которая пересылает исходящие запросы через NAT.
NAT экземпляры магии
В настоящее время Amazon рекомендует создавать шлюзы Nat, а затем экземпляры NAT. Чтобы овладеть шлюзом Nat, нам нужно
- выделить упругий IP
- Создайте шлюз NAT и свяжитесь с воротами NAT с подсети
- Дождитесь частично доступна ворота NAT для создания таблицы маршрута для частной подсети.
- Создайте таблицу маршрута для частной подсети и установить шлюз NAT для исходящего трафика
Чтобы выделить упругий IP, мы бы использовали существующий модуль из Anisible:, ec2_eip.
. Обратите внимание, что по умолчанию каждая учетная запись ограничена 5 эластичными IPS в регионе.
- name: NETWORK | allocate a new elastic IP without associating it to anything - 1 ec2_eip: in_vpc=yes reuse_existing_ip_allowed=yes state=present region="{{aws_region}}"
Для того, чтобы создать шлюз NAT, в Anisible V1 мы должны использовать awscli
:
- name: NETWORK | Create NAT instance for subnet 1 shell: "aws ec2 create-nat-gateway --region {{aws_region}} --subnet-id {{aws_vpc_pubsubnet1_runtime}} --allocation-id {{aws_vpc_privsubnet1_allocation}}"
Здесь мало взлома: если вам нужно немедленно использовать Nat Gateway, например, для создания пользовательской таблицы маршрутизации. Дайте AWS Time частично инициализировать и зарегистрировать его:
Теперь мы можем создавать пользовательские таблицы маршрута:
- name: NETWORK | Create new route table for the private subnet 1 shell: "aws ec2 create-route-table --region {{aws_region}} --vpc-id {{aws_vpc_id_runtime}}" - name: NETWORK | Associate route table with private subnet 1 shell: "aws ec2 associate-route-table --region {{aws_region}} --route-table-id {{routetable_private_1}} --subnet-id {{aws_vpc_privsubnet1_runtime}}" - name: NETWORK | Create NAT route record for private subnet 1 shell: "aws ec2 create-route --region {{aws_region}} --route-table-id {{routetable_private_1}} --destination-cidr-block '0.0.0.0/0' --nat-gateway-id {{nat_instance1}}"
Группы безопасности
Мы можем определить требования к группам безопасности наряду с правилами брандмауэра. Обратите внимание на приведенные ниже примеры, особенно как вы можете создавать правило как для блока CIDR, так и для конкретной группы безопасности (S)
В этом примере я хочу иметь четыре группы безопасности.
Для балансировщика нагрузки, который принимает
http
. иhttps
ОтказДля коробки прыжка в общественной подсети, так что я могу
SSH.
к этой коробке, апинг
,авторизоваться
иустранение неполадок
Мои экземпляры приложений. Таким образом, мне нужно открыть SSH и ICMP на серверах приложений из этой коробки.Для самого коробки прыжка, как я хочу ограничить доступ к коробку прыжка от моего офиса IP (при условии, что ваш шлюз имеет публичный IP-адрес 1.2.3.4)
Для моей коробки базы данных обычно RDS. Предполагая, что мы используем MySQL — мне нужно открыть порт 3306 из серверов приложений.
vpc_security_groups: - name: "{{readable_env_name}}-public-LOADBALANCER" desc: "security group for public access" rules: - proto: tcp from_port: 80 to_port: 80 cidr_ip: 0.0.0.0/0 - proto: tcp from_port: 443 to_port: 443 cidr_ip: 0.0.0.0/0 - name: "{{readable_env_name}}-public-JUMPBOX" desc: "security group that allows access from dedicated jump box in public network to internal resources" rules: - proto: tcp from_port: 22 to_port: 22 cidr_ip: "1.2.3.4/32" #Your office private ip - name: "{{readable_env_name}}-private-APP" desc: "Network for internal app servers" rules: - proto: tcp from_port: 22 to_port: 22 group_id: "{{readable_env_name}}-public-JUMPBOX" - proto: tcp from_port: 80 to_port: 80 group_id: "{{readable_env_name}}-public-LOADBALANCER" - proto: tcp from_port: 443 to_port: 443 group_id: "{{readable_env_name}}-public-LOADBALANCER" - proto: icmp from_port: -1 # icmp type, -1 = any type to_port: -1 # icmp subtype, -1 = any subtype group_id: "{{readable_env_name}}-public-JUMPBOX" - name: "{{readable_env_name}}-private-DATABASE" desc: "resources that are private" rules: - proto: tcp from_port: 3306 # MYSQL to_port: 3306 group_id: "{{readable_env_name}}-private-APP"
Разве вы не найдете настройку, читаемые из определения? Я делаю.
Давайте проверим созданную настройку:
Список созданных групп безопасности:
Группа государственной безопасности с входящими правилами:
Частные серверы приложений Группа с входящими правилами:
Группа безопасности доступа к базе данных с входящими правилами:
Группа безопасности Jump Box с входящими правилами:
Запуск оказания
Запуск Anisible Provisioning так же просто, как выполнение файла оболочки структуры ниже.
Как видите, мы указываем имя окружающей среды (DEMO), желаемый регион для создания VPC в (US-East-1) и установить безопасные учетные данные AWS в качестве переменных среды для предоставления.
#!/bin/sh # Static parameters WORKSPACE=$PWD BOX_PLAYBOOK=$WORKSPACE/bin/network_create.yml BOX_NAME=awsnetwork echo $BOX_NAME prudentia local <
Удивительно, сколько времени это займет? Меньше, чем 1 минута. Сравните на ручную настройку ….
PLAY RECAP ******************************************************************** 127.0.0.1 : ok=42 changed=12 unreachable=0 failed=0
В конце концов, у вас будет вся информация о созданной сети сети, поэтому вы можете хранить ее, или шаблон ее в какой-то файле конфигурации:
Точки интереса
Я рекомендую хранить и развивать рецепты развертывания и обеспечения вашего приложений. Поверьте мне, когда вы знаете, что вы можете установить свою среду с нуля за 10-40 минут, ваш клиент будет менее нервничать
Если вы используете этот подход для реализации различных случаев сетевых установок, я был бы признателен, если вы поделитесь своим опытом. Если вам нужно реализовать непрерывную интеграцию в ваш проект — вы добро пожаловать.
Упомянутые образцы для использования с помощью Anisible V1 (1.9.4) можно увидеть на или развесел от Github Отказ
Оригинал: «https://www.codementor.io/@slavko/automating-network-creation-scenarios-aws-vpc-du107o44o»