Рубрики
Uncategorized

Автоматизация сценариев освоения сети для Amazon VPC с помощью Anisible

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

Автор оригинала: 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)

В этом примере я хочу иметь четыре группы безопасности.

  1. Для балансировщика нагрузки, который принимает http . и https Отказ

  2. Для коробки прыжка в общественной подсети, так что я могу SSH. к этой коробке, а пинг , авторизоваться и устранение неполадок Мои экземпляры приложений. Таким образом, мне нужно открыть SSH и ICMP на серверах приложений из этой коробки.

  3. Для самого коробки прыжка, как я хочу ограничить доступ к коробку прыжка от моего офиса IP (при условии, что ваш шлюз имеет публичный IP-адрес 1.2.3.4)

  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»