From 575e4a080beaf412fa96ff6dc0809376e66d32c9 Mon Sep 17 00:00:00 2001 From: dannc Date: Mon, 30 Jan 2023 11:01:15 +0700 Subject: [PATCH] homework 15.1: partially complete task 1 --- readme.md | 1 + .../15-cloud-providers/15.1/readme.md | 186 ++++++++++++++++++ .../15.1/terraform/.gitignore | 38 ++++ .../15-cloud-providers/15.1/terraform/main.tf | 128 ++++++++++++ .../15.1/terraform/variables.tf.example | 16 ++ 5 files changed, 369 insertions(+) create mode 100644 src/homework/15-cloud-providers/15.1/readme.md create mode 100644 src/homework/15-cloud-providers/15.1/terraform/.gitignore create mode 100644 src/homework/15-cloud-providers/15.1/terraform/main.tf create mode 100644 src/homework/15-cloud-providers/15.1/terraform/variables.tf.example diff --git a/readme.md b/readme.md index e1a14d7..52e9a08 100644 --- a/readme.md +++ b/readme.md @@ -72,3 +72,4 @@ * [14.3. Карты конфигураций](/src/homework/14-kubernetes-security/14.3) * [14.4. Сервис-аккаунты](/src/homework/14-kubernetes-security/14.4) * [14.5. SecurityContext, NetworkPolicies](/src/homework/14-kubernetes-security/14.5) +* [15.1. Организация сети](/src/homework/15-cloud-providers/15.1) diff --git a/src/homework/15-cloud-providers/15.1/readme.md b/src/homework/15-cloud-providers/15.1/readme.md new file mode 100644 index 0000000..3e00a57 --- /dev/null +++ b/src/homework/15-cloud-providers/15.1/readme.md @@ -0,0 +1,186 @@ +Выполнение [домашнего задания](https://github.com/netology-code/clokub-homeworks/blob/clokub-5/15.1/README.md) +по теме "15.1. Организация сети" + +## Q/A + +> Домашнее задание будет состоять из обязательной части, которую необходимо выполнить на провайдере Яндекс.Облако и дополнительной части в AWS по желанию. +> Все домашние задания в 15 блоке связаны друг с другом и в конце представляют пример законченной инфраструктуры. +> Все задания требуется выполнить с помощью Terraform, результатом выполненного домашнего задания будет код в репозитории. + +### Задача 1 + +> Яндекс.Облако + +Вся конфигурация terraform прописана в директории [terraform](./terraform). Для запуска необходимо скопировать файл +[variables.tf.example](./terraform/variables.tf.example) в [variables.tf](./terraform/variables.tf) и проставить актуальные +значения для всех переменных: `yandex_cloud_id`, `yandex_folder_id`, `yandex_cloud_token`. +Последнее значение можно получить выполнив команду `yc iam create-token`. + +> 1. Создать VPC. +> - Создать пустую VPC. Выбрать зону. + +В качестве зоны выбрана `ru-central1-a`. Для создания новой VPC необходимо добавить следующий конфиг terraform: + +```terraform +resource "yandex_vpc_network" "network-vpc" { + name = "network-vpc" +} +``` + +> 2. Публичная подсеть. +> - Создать в vpc subnet с названием public, сетью 192.168.10.0/24. + +```terraform +resource "yandex_vpc_subnet" "public" { + name = "subnet-public" + zone = "ru-central1-a" + network_id = yandex_vpc_network.network-vpc.id + v4_cidr_blocks = ["192.168.10.0/24"] +} +``` + +> - Создать в этой подсети NAT-инстанс, присвоив ему адрес 192.168.10.254. В качестве image_id использовать fd80mrhj8fl2oe87o4e1 + +```terraform +resource "yandex_compute_instance" "nat-instance" { + name = "nat-instance" + + resources { + cores = 2 + memory = 2 + } + + boot_disk { + initialize_params { + image_id = "fd80mrhj8fl2oe87o4e1" # nat-instance-ubuntu-1559218207 + size = "20" + } + } + + network_interface { + subnet_id = yandex_vpc_subnet.public.id + ip_address = "192.168.10.254" + nat = true + } + + metadata = { + ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}" + } +} +``` + +> - Создать в этой публичной подсети виртуалку с публичным IP и подключиться к ней, убедиться что есть доступ к интернету. + +```terraform +resource "yandex_compute_instance" "public-instance" { + name = "public-instance" + + resources { + cores = 2 + memory = 2 + } + + boot_disk { + initialize_params { + image_id = "fd8kdq6d0p8sij7h5qe3" # ubuntu-20-04-lts-v20220822 + size = "20" + } + } + + network_interface { + subnet_id = yandex_vpc_subnet.public.id + nat = true + } + + metadata = { + ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}" + } +} +``` + +После применения конфигурации `terraform apply` необходимо подключится к `public-instance` через `ssh`: + +```shell +ssh ubuntu@ +``` + +Чтобы убедиться, что есть доступ в интернет, необходимо сделать `curl` запрос на внешний ресурс, например, `google.com`: + +```shell +curl -sS -D - -o /dev/null https://google.com +``` + +```text +HTTP/2 301 +location: https://www.google.com/ +<...> +``` + +> 3. Приватная подсеть. +> - Создать в vpc subnet с названием private, сетью 192.168.20.0/24. + +```terraform +resource "yandex_vpc_subnet" "private" { + name = "subnet_private" + zone = "ru-central1-a" + network_id = yandex_vpc_network.network-vpc.id + v4_cidr_blocks = ["192.168.20.0/24"] +} +``` + +> - Создать route table. Добавить статический маршрут, направляющий весь исходящий трафик private сети в NAT-инстанс + +```shell +resource "yandex_vpc_route_table" "private_egress" { + name = "private_egress" + network_id = yandex_vpc_network.network-vpc.id + + static_route { + destination_prefix = "0.0.0.0/0" + next_hop_address = yandex_compute_instance.nat-instance.network_interface.0.ip_address + } +} +``` + +> - Создать в этой приватной подсети виртуалку с внутренним IP, подключиться к ней через виртуалку, созданную ранее и убедиться что есть доступ к интернету + +```terraform +resource "yandex_compute_instance" "private-instance" { + name = "private-instance" + + resources { + cores = 2 + memory = 2 + } + + boot_disk { + initialize_params { + image_id = "fd8kdq6d0p8sij7h5qe3" # ubuntu-20-04-lts-v20220822 + size = "20" + } + } + + network_interface { + subnet_id = yandex_vpc_subnet.private.id + } + + metadata = { + ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}" + } +} +``` + +После `terraform apply` необходимо сначала подключится к машине `nat-instance` по `ssh`, +а затем произвести подключение к `private-instance` и выполнить `curl` запрос к внешнему ресурсу. + +Подключение к приватной машине через `nat-instance` можно произвести одной командой `ssh`, используя ключ `-J`: + +```shell +ssh -J ubuntu@ ubuntu@ + +curl -sS -D - -o /dev/null https://google.com +``` + +```text +todo Что-то идёт не так и запрос не проходит. tracepath виснет на _gateway шаге (сразу после localhost). +``` diff --git a/src/homework/15-cloud-providers/15.1/terraform/.gitignore b/src/homework/15-cloud-providers/15.1/terraform/.gitignore new file mode 100644 index 0000000..3309aee --- /dev/null +++ b/src/homework/15-cloud-providers/15.1/terraform/.gitignore @@ -0,0 +1,38 @@ +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sentitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +# +*.tfvars + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc +.terraform.lock.hcl + +variables.tf diff --git a/src/homework/15-cloud-providers/15.1/terraform/main.tf b/src/homework/15-cloud-providers/15.1/terraform/main.tf new file mode 100644 index 0000000..12c8f0d --- /dev/null +++ b/src/homework/15-cloud-providers/15.1/terraform/main.tf @@ -0,0 +1,128 @@ +terraform { + required_providers { + yandex = { + source = "yandex-cloud/yandex" + } + } + required_version = ">= 0.13" +} + +provider "yandex" { + token = var.yandex_cloud_token + cloud_id = var.yandex_cloud_id + folder_id = var.yandex_folder_id + zone = "ru-central1-a" +} + +resource "yandex_vpc_network" "network-vpc" { + name = "network-vpc" +} + +resource "yandex_vpc_subnet" "public" { + name = "subnet-public" + zone = "ru-central1-a" + network_id = yandex_vpc_network.network-vpc.id + v4_cidr_blocks = ["192.168.10.0/24"] +} + +resource "yandex_vpc_subnet" "private" { + name = "subnet_private" + zone = "ru-central1-a" + network_id = yandex_vpc_network.network-vpc.id + v4_cidr_blocks = ["192.168.20.0/24"] +} + +resource "yandex_vpc_route_table" "private_egress" { + name = "private_egress" + network_id = yandex_vpc_network.network-vpc.id + + static_route { + destination_prefix = "0.0.0.0/0" + next_hop_address = yandex_compute_instance.nat-instance.network_interface.0.ip_address + } +} + +resource "yandex_compute_instance" "nat-instance" { + name = "nat-instance" + + resources { + cores = 2 + memory = 2 + } + + boot_disk { + initialize_params { + image_id = "fd80mrhj8fl2oe87o4e1" # nat-instance-ubuntu-1559218207 + size = "20" + } + } + + network_interface { + subnet_id = yandex_vpc_subnet.public.id + ip_address = "192.168.10.254" + nat = true + } + + metadata = { + ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}" + } +} + +resource "yandex_compute_instance" "public-instance" { + name = "public-instance" + + resources { + cores = 2 + memory = 2 + } + + boot_disk { + initialize_params { + image_id = "fd8kdq6d0p8sij7h5qe3" # ubuntu-20-04-lts-v20220822 + size = "20" + } + } + + network_interface { + subnet_id = yandex_vpc_subnet.public.id + nat = true + } + + metadata = { + ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}" + } +} + +resource "yandex_compute_instance" "private-instance" { + name = "private-instance" + + resources { + cores = 2 + memory = 2 + } + + boot_disk { + initialize_params { + image_id = "fd8kdq6d0p8sij7h5qe3" # ubuntu-20-04-lts-v20220822 + size = "20" + } + } + + network_interface { + subnet_id = yandex_vpc_subnet.private.id + } + + metadata = { + ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}" + } +} + +output "ips" { + value = { + nat_internal_ip = yandex_compute_instance.nat-instance.network_interface.0.ip_address + nat_external_ip = yandex_compute_instance.nat-instance.network_interface.0.nat_ip_address + public_internal_ip = yandex_compute_instance.public-instance.network_interface.0.ip_address + public_external_ip = yandex_compute_instance.public-instance.network_interface.0.nat_ip_address + private_internal_ip = yandex_compute_instance.private-instance.network_interface.0.ip_address + } +} diff --git a/src/homework/15-cloud-providers/15.1/terraform/variables.tf.example b/src/homework/15-cloud-providers/15.1/terraform/variables.tf.example new file mode 100644 index 0000000..244f0f4 --- /dev/null +++ b/src/homework/15-cloud-providers/15.1/terraform/variables.tf.example @@ -0,0 +1,16 @@ +# Заменить на ID своего облака +# https://console.cloud.yandex.ru/cloud?section=overview +variable "yandex_cloud_id" { + default = "b1gu1gt5nqi6lqgu3t7s" +} + +# Заменить на Folder своего облака +# https://console.cloud.yandex.ru/cloud?section=overview +variable "yandex_folder_id" { + default = "b1gaec42k169jqpo02f7" +} + +# OAuth токен, используемый утилитой yc. Применялся на этапе с packer. +variable "yandex_cloud_token" { + default = "" +}