Постановка проблемы=> Задача должна быть выполнена с использованием Terraform

Необходимо создать/запустить приложение с помощью Terraform

1. Создайте ключ и группу безопасности, которые разрешают порт 80.
2. Запустите экземпляр EC2.
3. В этом экземпляре Ec2 используйте ключ и группу безопасности, которые мы создали на шаге 1.
4. Запустите один том (EBS) и смонтируйте этот том в /var/www/html
5. Разработчик загрузил код в репозиторий github, также в репозитории есть несколько изображений.
6. Скопируйте файл код репозитория github в /var/www/html
7. Создайте корзину S3, скопируйте/разверните образы из репозитория github в корзину s3 и измените разрешение на общедоступное чтение.
8 Создайте Cloudfront с помощью ведро s3 (содержащее изображения) и используйте URL-адрес Cloudfront для обновления кода в /var/www/html.

*Необязательно*
1) Те, кто знаком с jenkins или занимается devops AL, должны интегрировать jenkins в эту задачу везде, где, по вашему мнению, можно интегрировать
2) создать снапшот ebs

Решение =›
Здравствуйте, читатели
В этом проекте я решил вышеуказанную постановку задачи.

Во-первых, установка Terraform готова =>

Здесь сначала мы загружаем терраформ здесь ссылка, если вы еще не скачали, пожалуйста, скачайте здесь — →



После загрузки извлеките Zip-файл и сохраните любую папку, скопируйте путь и установите переменную пути среды.

После проверки в командной строке будет работать или для проверки вы должны использовать

версия для терраформирования

здесь они показывают версию Terraform
Теперь наша установка готова

— — — — — — — — — — — — — — — — — — — — — — —

Теперь после этого у нас есть Создать файл terraform

Во-первых, у нас есть конфигурация aws с профилем

aws configure — профиль PrincePrashantSaini

после этого профиля дайте свой ключ доступа и секретный ключ и регион и запустите
затем мы запускаем блокнот, чтобы написать код и с именем файла и расширением .tf

Блокнот finalcode.tf

здесь вы используете любое имя, мы используем окончательный код, это не имеет значения. но расширение должно быть .tfбез tf ваш terraform не работает или не читает код

приведенная выше команда откроет файл блокнота, здесь мы начинаем работать над нашим кодом.

— — — — — — — — — — — — — — — — — — — — — — — —

Теперь работаем с кодом или постановкой задачи

во-первых, у нас есть провайдер, который является нашим провайдером, мы должны сообщить нашей терраформе о предоставлении, здесь мой провайдер - AWS, поэтому мы даем aws, мы даем имя провайдера и регион, который мы должны выбрать, поэтому мы выбираем затем имя моего профиля
вы также дайте ключ доступа и секретный ключ на ваш выбор, я даю профиль из-за области безопасности суммы

провайдер «aws» {
region = «ap-south-1»
profile = «PrincePrashantSaini»
}

группа безопасности и ключи для наших экземпляров
для этого нам нужны два ресурса группы безопасности. в этом нам нужно разрешить SSH и HTTP-сервер, работающий на порту номер 80
для этого у нас есть команда use, потому что нам нужна автоматизация

#создание группы безопасности
resource «aws_security_group» «allow_tls» {
name = «allow_tls»
description = «allow ssh and httpd»

ingress {
> описание = «Порт SSH»
from_port = 22
to_port = 22
protocol = «tcp»
cidr_blocks = [«0.0.0.0/0»]
}
ingress {
description = "HTTPD Port"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0 /0”]
}
ingress {
description = “Localhost”
from_port = 8080
to_port = 8080
protocol = “tcp”
> cidr_blocks = ["0.0.0.0/0"]
}
выход {
from_port = 0
to_port = 0
протокол = "-1"
> cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "allow_tls"
}
}
#создание ключа переменная
переменная «enter_ur_key_name» {
type = string
default = «mykey»
}

теперь, после обеспечения безопасности, мы создаем экземпляры или возвращаем экземпляры EC2, мы даем ресурс экземпляра с именем или идентификатором ami, который мы взяли с amazone.

#создать ресурс EC2
«aws_instance» «myinstance» {
ami = «ami-005956c5f0f757d37»
instance_type = «t2.micro»

Но наша третья проблема заключается в использовании того же имени ключа и идентификатора безопасности, которые мы создали, поэтому мы также даем то же самое здесь

#create EC2
ресурс «aws_instance» «myinstance» {
ami = «ami-005956c5f0f757d37»
instance_type = «t2.micro»
key_name = var.enter_ur_key_name
security_groups = ["${aws_security_group.allow_tls.name}"]

tags = {
Name = «ПринцПрашант»
}
}

теперь у нас есть обеденный том EBS и мы монтируем папку для этого сначала мы создаем том, затем мы монтируем, мы создали 1Gb жесткий диск или том EBS

ресурс «aws_ebs_volume» «esb2» {
доступность_зона = aws_instance.myinstance.availability_zone
размер = 1

теги = {
Имя = «myebs1»
}
}

ресурс «aws_volume_attachment» «ebs_att» {
device_name = «/dev/sdd»
volume_id = «${aws_ebs_volume.esb2.id}»
instance_id = «${aws_instance.myinstance.id }”
force_detach = true
}

вывод «myoutebs» {
значение = aws_ebs_volume.esb2.id
}

теперь разработчик загружает веб-код или HTML-код в github, поэтому создайте репозиторий, затем загрузите git bash и используйте его

Откройте Git Bash

Измените текущий рабочий каталог на ваш локальный проект.

Инициализируйте локальный каталог как репозиторий Git.
git init

Добавьте файлы в новый локальный репозиторий. Это ставит их перед первым коммитом.
git add

Зафиксируйте файлы, которые вы подготовили, в локальном репозитории.
git commit -m "initial commit"

Скопируйте URL-адрес https вашего недавно созданного репо.

В командной строке добавьте URL-адрес удаленного репозитория, в который будет помещен ваш локальный репозиторий.

git remote add origin remote repository URL

git remote -v

Отправьте изменения из локального репозитория на GitHub.

git push -f origin master

вы можете напрямую загрузить с помощью графического интерфейса

теперь скопируйте код git или загрузите этот код в папку /var/www/html

provisioner remote-exec {
inline = [
sudo mkfs.ext4 /dev/xvdh,
sudo mount /dev/xvdh /var/www/html,
sudo rm -rf /var/www/html/*,
sudo git clone «https://github.com/Prashantsaini25/workspace.git /var/www/html/»
]
}
}

для этого мы используем указанную выше команду, но для загрузки с github нам нужна пустая папка, поэтому сначала мы принудительно удаляем все мысли или данные с помощью команды rm, а затем загружаем

теперь для создания ведра s3 и переноса его на облачный фронт, но здесь я загружаю изображение вручную, а не для кода

ресурс «aws_s3_bucket» «pps-prince» {
Bucket = «PPS-prince1»
acl = «private»
tags = {
Name = «pps-prince»
}
}
// Блокировать публичный доступ
resource «aws_s3_bucket_public_access_block» «s3Public» {
Bucket = «${aws_s3_bucket.pps-prince.id}»
block_public_acls = true
block_public_policy = true
limited_public_buckets = true
}

locals {
s3_origin_id = «princes3»
}
// Создание удостоверения Origin Access для CloudFront
resource «aws_cloudfront_origin_access_identity» «origin_access_identity» {
comment = «pps-bucket ”
}
ресурс «aws_cloudfront_distribution» «pps» {
origin {
domain_name = «${aws_s3_bucket.pps-prince.bucket_regional_domain_name}»
origin_id = «$ {local.s3_origin_id}”
s3_origin_config {

origin_access_identity = «${aws_cloudfront_origin_access_identity.origin_access_identity.cloudfront_access_identity_path}»
}
}
enabled = true
is_ipv6_enabled = true
comment = «pps-access»
default_cache_behavior {
allow_methods = ["УДАЛИТЬ", "ПОЛУЧИТЬ", "ГОЛОВА", "ОПЦИИ", "ИСПРАВИТЬ", "ПОСТАВИТЬ", "ПОСТАВИТЬ"]
cached_methods = ["ПОЛУЧИТЬ", " HEAD»]
target_origin_id = «${local.s3_origin_id}»
forwarded_values ​​{
query_string = false
cookies {
forward = «none»
}
}
viewer_protocol_policy = «allow-all»
min_ttl = 0
default_ttl = 3600
max_ttl = 86400
}
# Поведение кэша с приоритет 0
order_cache_behavior {
path_pattern = "/content/immutable/*"
allow_methods = ["GET", "HEAD", "OPTIONS"]
cached_methods = ["GET », «HEAD», «OPTIONS»]
target_origin_id = «${local.s3_origin_id}»
forwarded_values ​​{
query_string = false
headers = [«Происхождение»]
готовить ies {
forward = «none»
}
}
min_ttl = 0
default_ttl = 86400
max_ttl = 31536000
compress = true< br /> viewer_protocol_policy = «redirect-to-https»
}
# Поведение кэширования с приоритетом 1
ordered_cache_behavior{
path_pattern = «/content/*»
allowed_methods = ["GET", "HEAD", "OPTIONS"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "${local.s3_origin_id}"
forwarded_values ​​{< br /> query_string = false
cookies {
forward = “none”
}
}
min_ttl = 0
default_ttl = 3600
max_ttl = 86400
compress = true
viewer_protocol_policy = «redirect-to-https»
}
price_class = «PriceClass_200»
ограничения {
geo_restriction {
ограничение_тип = «черный список»
местоположения = [«CA»]
}
}
теги = {
среда = «производство»
}< br /> viewer_certificate {
cloudfront_default_certificate = true
}
сохранить _on_delete = true
}

Мой снимок, созданный с помощью кода, также создан автоматически

ресурс «aws_ebs_snapshot» «my_snapshot» {
volume_id = «${aws_ebs_volume.esb2.id}»

tags = {
Name = «HelloWorld_snap»
}
}

Некоторые испытания

служба httpd

cd /var/www/html git скачает код или нет

код будет работать или нет

проверить с айпи

наконец раздел

Теперь все успешно выглядит хорошо и работает

Теперь окончательный код

провайдер «aws» {
region = «ap-south-1»
profile = «PrincePrashantSaini»
}

#создание группы безопасности
resource «aws_security_group» «allow_tls» {
name = «allow_tls»
description = «allow ssh and httpd»

ingress {
> описание = «Порт SSH»
from_port = 22
to_port = 22
protocol = «tcp»
cidr_blocks = [«0.0.0.0/0»]
}
ingress {
description = "HTTPD Port"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0 /0”]
}
ingress {
description = “Localhost”
from_port = 8080
to_port = 8080
protocol = “tcp”
> cidr_blocks = ["0.0.0.0/0"]
}
выход {
from_port = 0
to_port = 0
протокол = "-1"
> cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "allow_tls"
}
}
#создание ключа переменная
переменная «enter_ur_key_name» {
type = string
default = «mykey»
}

#create EC2
ресурс «aws_instance» «myinstance» {
ami = «ami-0447a12f28fddb066»
instance_type = «t2.micro»
key_name = var.enter_ur_key_name
security_groups = ["${aws_security_group.allow_tls.name}"]

соединение {
type = "ssh"
user = "ec2-user"
private_key = file("C:/Users/Prashant Saini/Downloads/mykey.pem")
host = aws_instance.myinstance.public_ip
}
provisioner «remote-exec» {
inline = [
«sudo yum install httpd php git -y»,
« sudo systemctl перезапустить httpd»,
«sudo systemctl включить httpd»,
]
}

tags = {
Name = «ПринцПрашант»
}
}

вывод «мявзон» {
значение = aws_instance.myinstance.availability_zone
}

вывод «my_sec_public_ip» {
значение = aws_instance.myinstance.public_ip
}

ресурс «aws_ebs_volume» «esb2» {
доступность_зона = aws_instance.myinstance.availability_zone
размер = 1

теги = {
Имя = «myebs1»
}
}

ресурс «aws_volume_attachment» «ebs_att» {
device_name = «/dev/sdd»
volume_id = «${aws_ebs_volume.esb2.id}»
instance_id = «${aws_instance.myinstance.id }”
force_detach = true
}

вывод «myoutebs» {
значение = aws_ebs_volume.esb2.id
}

ресурс «null_resource» «nulllocal2» {
поставщик «local-exec» {
команда = «echo ${aws_instance.myinstance.public_ip} › publicip.txt»
}
}

ресурс «null_resource» «nullremote3» {

depend_on = [
aws_volume_attachment.ebs_att,
]

соединение {
type = "ssh"
user = "ec2-user"
private_key = file("C:/Users/Prashant Saini/Downloads/mykey.pem")
host = aws_instance.myinstance.public_ip
}

provisioner remote-exec {
inline = [
sudo mkfs.ext4 /dev/xvdh,
sudo mount /dev/xvdh /var/www/html,
sudo rm -rf /var/www/html/*,
sudo git clone «https://github.com/Prashantsaini25/workspace.git /var/www/html/»
]
}
}

ресурс «aws_ebs_snapshot» «my_snapshot» {
volume_id = «${aws_ebs_volume.esb2.id}»

tags = {
Name = «HelloWorld_snap»
}
}

ресурс «null_resource» «nulllocal1» {

depend_on = [
null_resource.nullremote3,
]

provisioner «local-exec» {
command = «chrome ${aws_instance.myinstance.public_ip}»
}
}

СПАСИБО, ЧТО ПРОЧИТАЛИ

я работаю с частью Дженкинса, когда это будет сделано, я загружу