# Домашнее задание к занятию "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.
```