# Домашнее задание к занятию "7.2. Облачные провайдеры и синтаксис Терраформ." Зачастую разбираться в новых инструментах гораздо интересней понимая то, как они работают изнутри. Поэтому в рамках первого *необязательного* задания предлагается завести свою учетную запись в AWS (Amazon Web Services). ## Задача 1. Регистрация в aws и знакомство с основами (необязательно, но крайне желательно). Остальные задания можно будет выполнять и без этого аккаунта, но с ним можно будет увидеть полный цикл процессов. AWS предоставляет достаточно много бесплатных ресурсов в первых год после регистрации, подробно описано [здесь](https://aws.amazon.com/free/). 1. Создайте аккаут aws. 1. Установите c aws-cli https://aws.amazon.com/cli/. 1. Выполните первичную настройку aws-sli https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html. 1. Создайте IAM политику для терраформа c правами * AmazonEC2FullAccess * AmazonS3FullAccess * AmazonDynamoDBFullAccess * AmazonRDSFullAccess * CloudWatchFullAccess * IAMFullAccess 1. Добавьте переменные окружения ``` export AWS_ACCESS_KEY_ID=(your access key id) export AWS_SECRET_ACCESS_KEY=(your secret access key) ``` 1. Создайте, остановите и удалите ec2 инстанс (любой с пометкой `free tier`) через веб интерфейс. В виде результата задания приложите вывод команды `aws configure list`. ## Ответ 1. ## Задача 2. Созданием ec2 через терраформ. 1. В каталоге `terraform` вашего основного репозитория, который был создан в начале курсе, создайте файл `main.tf` и `versions.tf`. 1. Зарегистрируйте провайдер для [aws](https://registry.terraform.io/providers/hashicorp/aws/latest/docs). В файл `main.tf` добавьте блок `provider`, а в `versions.tf` блок `terraform` с вложенным блоком `required_providers`. Укажите любой выбранный вами регион внутри блока `provider`. 1. Внимание! В гит репозиторий нельзя пушить ваши личные ключи доступа к аккаунта. Поэтому в предыдущем задании мы указывали их в виде переменных окружения. 1. В файле `main.tf` воспользуйтесь блоком `data "aws_ami` для поиска ami образа последнего Ubuntu. 1. В файле `main.tf` создайте рессурс [ec2 instance](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance). Постарайтесь указать как можно больше параметров для его определения. Минимальный набор параметров указан в первом блоке `Example Usage`, но желательно, указать большее количество параметров. 1. Добавьте data-блоки `aws_caller_identity` и `aws_region`. 1. В файл `outputs.tf` поместить блоки `output` с данными об используемых в данный момент: * AWS account ID, * AWS user ID, * AWS регион, который используется в данный момент, * Приватный IP ec2 инстансы, * Идентификатор подсети в которой создан инстанс. 1. Если вы выполнили первый пункт, то добейтесь того, что бы команда `terraform plan` выполнялась без ошибок. В качестве результата задания предоставьте: 1. Ответ на вопрос: при помощи какого инструмента (из разобранных на прошлом занятии) можно создать свой образ ami? 1. Ссылку на репозиторий с исходной конфигурацией терраформа. ## Ответ 2. Если честно - я не очень увидел связь между этими 8-ми пунктами по созданию ec2 instance и моими ответами на вопросы.. ;) 1. Это можно сделать с помощью Packer + Ansible например (прочитал это по ссылке ниже - офигеть как круто автоматизировано) - если я правильно понял вопрос. https://notessysadmin.com/packer-ansible-terraform-or-deploy-without-shit-and-sms И нашёл ещё один вариант - `aws ec2 create-snapshot` Как делать - нашёл вот тут - https://habr.com/ru/company/epam_systems/blog/169331/ 2. https://github.com/Vahhhh/devops-netology/tree/master/terraform С горем пополам и с помощью гугла нашёл последний image с помощью команды ``` aws ec2 describe-images --filters "Name=architecture,Values=x86_64" "Name=is-public,Values=true" "Name=name,Values=*Ubuntu*" --query "reverse(sort_by(Images, &CreationDate))[:1].ImageId" --output text ami-0228cb4efad5331c4 ``` Ну и с помощью этой команды посмотрел что он в себе содержит: ``` aws ec2 describe-images --image-ids ami-0228cb4efad5331c4 { "Images": [ { "Architecture": "x86_64", "CreationDate": "2021-01-01T20:56:43.000Z", "ImageId": "ami-0228cb4efad5331c4", "ImageLocation": "amazon/Cloud9Ubuntu-2021-01-01T19-54", "ImageType": "machine", "Public": true, "OwnerId": "585441382316", "PlatformDetails": "Linux/UNIX", "UsageOperation": "RunInstances", "State": "available", "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "DeleteOnTermination": true, "SnapshotId": "snap-0267cf52f0b160efe", "VolumeSize": 10, "VolumeType": "gp2", "Encrypted": false } }, { "DeviceName": "/dev/sdb", "VirtualName": "ephemeral0" }, { "DeviceName": "/dev/sdc", "VirtualName": "ephemeral1" } ], "Description": "Cloud9 Cloud9Ubuntu AMI", "EnaSupport": true, "Hypervisor": "xen", "ImageOwnerAlias": "amazon", "Name": "Cloud9Ubuntu-2021-01-01T19-54", "RootDeviceName": "/dev/sda1", "RootDeviceType": "ebs", "SriovNetSupport": "simple", "VirtualizationType": "hvm" } ] } ``` Вот мой вывод `terraform plan` ``` $ terraform plan An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # aws_instance.first_instance will be created + resource "aws_instance" "first_instance" { + ami = "ami-067576226513a2737" + arn = (known after apply) + associate_public_ip_address = (known after apply) + availability_zone = (known after apply) + cpu_core_count = 1 + cpu_threads_per_core = (known after apply) + get_password_data = false + host_id = (known after apply) + id = (known after apply) + instance_state = (known after apply) + instance_type = "t2.micro" + ipv6_address_count = (known after apply) + ipv6_addresses = (known after apply) + key_name = "key-1" + outpost_arn = (known after apply) + password_data = (known after apply) + placement_group = (known after apply) + primary_network_interface_id = (known after apply) + private_dns = (known after apply) + private_ip = (known after apply) + public_dns = (known after apply) + public_ip = (known after apply) + secondary_private_ips = (known after apply) + security_groups = (known after apply) + source_dest_check = true + subnet_id = (known after apply) + tags = { + "Name" = "Temp_tag" } + tenancy = (known after apply) + volume_tags = (known after apply) + vpc_security_group_ids = (known after apply) + ebs_block_device { + delete_on_termination = (known after apply) + device_name = (known after apply) + encrypted = (known after apply) + iops = (known after apply) + kms_key_id = (known after apply) + snapshot_id = (known after apply) + throughput = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } + enclave_options { + enabled = (known after apply) } + ephemeral_block_device { + device_name = (known after apply) + no_device = (known after apply) + virtual_name = (known after apply) } + metadata_options { + http_endpoint = (known after apply) + http_put_response_hop_limit = (known after apply) + http_tokens = (known after apply) } + network_interface { + delete_on_termination = (known after apply) + device_index = (known after apply) + network_interface_id = (known after apply) } + root_block_device { + delete_on_termination = (known after apply) + device_name = (known after apply) + encrypted = (known after apply) + iops = (known after apply) + kms_key_id = (known after apply) + throughput = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } } # aws_key_pair.key1 will be created + resource "aws_key_pair" "key1" { + arn = (known after apply) + fingerprint = (known after apply) + id = (known after apply) + key_name = "key-1" + key_pair_id = (known after apply) + public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 email@example.com" } Plan: 2 to add, 0 to change, 0 to destroy. Changes to Outputs: + account_id = "070311527656" + caller_user = "AIDARAXXEYTUNLEJ6TXHV" + data_region = { + description = "US East (Ohio)" + endpoint = "ec2.us-east-2.amazonaws.com" + id = "us-east-2" + name = "us-east-2" } + instance_network_id = (known after apply) + instance_private_ip_addr = (known after apply) ------------------------------------------------------------------------ Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run. ```