Зачастую разбираться в новых инструментах гораздо интересней понимая то, как они работают изнутри. Поэтому в рамках первого необязательного задания предлагается завести свою учетную запись в AWS (Amazon Web Services) или Yandex.Cloud. Идеально будет познакомится с обоими облаками, потому что они отличаются.
Задача 1 (вариант с AWS). Регистрация в aws и знакомство с основами (необязательно, но крайне желательно).
Остальные задания можно будет выполнять и без этого аккаунта, но с ним можно будет увидеть полный цикл процессов.
AWS предоставляет достаточно много бесплатных ресурсов в первый год после регистрации, подробно описано здесь.
- Создайте аккаут aws.
- Установите c aws-cli https://aws.amazon.com/cli/.
- Выполните первичную настройку aws-sli https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html.
- Создайте IAM политику для терраформа c правами
- AmazonEC2FullAccess
- AmazonS3FullAccess
- AmazonDynamoDBFullAccess
- AmazonRDSFullAccess
- CloudWatchFullAccess
- IAMFullAccess
- Добавьте переменные окружения
export AWS_ACCESS_KEY_ID=(your access key id) export AWS_SECRET_ACCESS_KEY=(your secret access key) - Создайте, остановите и удалите ec2 инстанс (любой с пометкой
free tier) через веб интерфейс.
В виде результата задания приложите вывод команды aws configure list.
Задача 1 (Вариант с Yandex.Cloud). Регистрация в ЯО и знакомство с основами (необязательно, но крайне желательно).
- Подробная инструкция на русском языке содержится здесь.
- Обратите внимание на период бесплатного использования после регистрации аккаунта.
- Используйте раздел "Подготовьте облако к работе" для регистрации аккаунта. Далее раздел "Настройте провайдер" для подготовки базового терраформ конфига.
- Воспользуйтесь инструкцией на сайте терраформа, что бы не указывать авторизационный токен в коде, а терраформ провайдер брал его из переменных окружений.
Токен и Cloud id берется их переменных окружения (значения изменены).
export TF_VAR_yc_token=afgafgaasfgadgagafdgasfdgsafgafg-Kg
export TF_VAR_yc_cloud_id=afdgafsdgadfgasfdgaf
или
export TF_VAR_yc_token=`yc config list | grep token | awk '{print $2}'`
export TF_VAR_yc_cloud_id=`yc config list | grep cloud_id | awk '{print $2}'`
Конфиг файлы ниже: https://github.com/AirDRoN-lab/devops-netology/tree/main/terraform/YandexC_backup
Доступные образы в YaCloud:
yc compute image list --folder-id standard-images
- В каталоге
terraformвашего основного репозитория, который был создан в начале курсе, создайте файлmain.tfиversions.tf. - Зарегистрируйте провайдер
- для aws. В файл
main.tfдобавьте блокprovider, а вversions.tfблокterraformс вложенным блокомrequired_providers. Укажите любой выбранный вами регион внутри блокаprovider. - либо для yandex.cloud. Подробную инструкцию можно найти здесь.
- для aws. В файл
- Внимание! В гит репозиторий нельзя пушить ваши личные ключи доступа к аккаунту. Поэтому в предыдущем задании мы указывали их в виде переменных окружения.
- В файле
main.tfвоспользуйтесь блокомdata "aws_amiдля поиска ami образа последнего Ubuntu. - В файле
main.tfсоздайте рессурс- либо ec2 instance.
Постарайтесь указать как можно больше параметров для его определения. Минимальный набор параметров указан в первом блоке
Example Usage, но желательно, указать большее количество параметров. - либо yandex_compute_image.
- либо ec2 instance.
Постарайтесь указать как можно больше параметров для его определения. Минимальный набор параметров указан в первом блоке
- Также в случае использования aws:
- Добавьте data-блоки
aws_caller_identityиaws_region. - В файл
outputs.tfпоместить блокиoutputс данными об используемых в данный момент:- AWS account ID,
- AWS user ID,
- AWS регион, который используется в данный момент,
- Приватный IP ec2 инстансы,
- Идентификатор подсети в которой создан инстанс.
- Добавьте data-блоки
- Если вы выполнили первый пункт, то добейтесь того, что бы команда
terraform planвыполнялась без ошибок.
В качестве результата задания предоставьте:
- Ответ на вопрос: при помощи какого инструмента (из разобранных на прошлом занятии) можно создать свой образ ami?
- Ссылку на репозиторий с исходной конфигурацией терраформа.
Для создания собственного образа (не только ami) можно использовать Packer от HashiCorp. В домашнем задании используеется один из штатных обланчных образов.
Конфигурация терраформа приведена по ссылке: https://github.com/AirDRoN-lab/devops-netology/tree/main/terraform/YandexC_backup
В outputs.tf поместил данные по IP адресации, зоне, дате создания VM и идентификаторы сети и подсети.
Результат выполнения terraform apply:
vagrant@server1:~/devops-netology/terraform$ terraform apply
yandex_vpc_network.network-1: Creating...
yandex_vpc_network.network-1: Creation complete after 3s [id=enp1h7sdftf97t7rlm17]
yandex_vpc_subnet.subnet-1: Creating...
yandex_vpc_subnet.subnet-1: Creation complete after 1s [id=e9buu8ssdfth5oeqqk1k]
yandex_compute_instance.vm-1: Creating...
yandex_compute_instance.vm-1: Still creating... [10s elapsed]
yandex_compute_instance.vm-1: Still creating... [20s elapsed]
yandex_compute_instance.vm-1: Still creating... [30s elapsed]
yandex_compute_instance.vm-1: Still creating... [40s elapsed]
yandex_compute_instance.vm-1: Still creating... [50s elapsed]
yandex_compute_instance.vm-1: Still creating... [1m0s elapsed]
yandex_compute_instance.vm-1: Still creating... [1m10s elapsed]
yandex_compute_instance.vm-1: Still creating... [1m20s elapsed]
yandex_compute_instance.vm-1: Still creating... [1m30s elapsed]
yandex_compute_instance.vm-1: Creation complete after 1m32s [id=fhmc7phjjsldsfttp6p4m]
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Outputs:
created_at_vm_1 = "2022-04-21T05:46:21Z"
external_ip_address_vm_1 = "51.250.83.0"
internal_ip_address_vm_1 = "192.168.250.6"
network_vm_1 = "enpmabmvk51ma71qcm5a"
subnet_vm_1 = "e9bd0gj2in2vhfgib3d0"
zone = "ru-central1-a"
SSH доступ есть:
vagrant@server1:~/devops-netology/terraform$ ssh 51.250.83.0
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
vagrant@fhmdvq6skoqrgjv5m35h:~$
Описание созданной инфраструктуры (в yaml):
vagrant@server1:~/devops-netology/terraform$ yc compute instance list --format=yaml
- id: fhmg8vjds9omer0m4ujk
folder_id: b1gtp2cog4lf9jgalt0p
created_at: "2022-04-21T05:46:21Z"
name: terraform
zone_id: ru-central1-a
platform_id: standard-v1
resources:
memory: "2147483648"
cores: "2"
core_fraction: "100"
status: RUNNING
boot_disk:
mode: READ_WRITE
device_name: fhmdvq6skoqrgjv5m35h
auto_delete: true
disk_id: fhmdvq6skoqrgjv5m35h
network_interfaces:
- index: "0"
mac_address: d0:0d:10:47:e6:de
subnet_id: e9bd0gj2in2vhfgib3d0
primary_v4_address:
address: 192.168.250.6
one_to_one_nat:
address: 51.250.83.0
ip_version: IPV4
fqdn: fhmg8vjds9omer0m4ujk.auto.internal
scheduling_policy: {}
network_settings:
type: STANDARD
placement_policy: {}
PS: AWS облаков в процессе получения. Возможно домашка будет дорабаота в части работы с AWS =)
Установка AWS (https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)
$ curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
Присвоение ключей (ключи изменены):
$ export AWS_ACCESS_KEY_ID=AXXXXXXXXXXXXXXDSPIMQ2
$ export AWS_SECRET_ACCESS_KEY=/QXXXXXXXXXXXXXXXXXXXXXXXXXXXPQlP/D
vagrant@server1:~/.aws$ aws configure list
Name Value Type Location
---- ----- ---- --------
profile default env ['AWS_PROFILE', 'AWS_DEFAULT_PROFILE']
access_key ****************IMQ2 env
secret_key ****************lP/D env
region us-east-1 config-file ~/.aws/config
Конфиг файлы для AWS ниже: https://github.com/AirDRoN-lab/devops-netology/tree/main/terraform/AWS_backup
Вывод terraform output:
vagrant@server1:~/devops-netology/terraform$ terraform refresh
aws_instance.netolo: Refreshing state... [id=i-0dd30ccf6d497186b]
Outputs:
AZ_names = tolist([
"us-east-1a",
"us-east-1b",
"us-east-1c",
"us-east-1d",
"us-east-1e",
"us-east-1f",
])
account_id = "297667789469"
image_id = "ami-0c4f7023847b90238"
instance_core = 1
instance_ip_addr = "172.31.16.174"
instance_ip_public_addr = "18.208.248.207"
regions_id = "aws"
regions_names = toset([
"ap-northeast-1",
"ap-northeast-2",
"ap-northeast-3",
"ap-south-1",
"ap-southeast-1",
"ap-southeast-2",
"ca-central-1",
"eu-central-1",
"eu-north-1",
"eu-west-1",
"eu-west-2",
"eu-west-3",
"sa-east-1",
"us-east-1",
"us-east-2",
"us-west-1",
"us-west-2",
])
subnet_id = "subnet-0233fe9108df5be14"