Kabul edelim: IaC gibi teknik bir konuda 3 bölümlük bir seri zorlayıcı olabilir. Eminim şimdiye kadar birkaç kez bundan uzaklaşmışsınızdır. 3. bölüme gelmek heyecan verici; işte o zaman eğlenceli kısım başlıyor. Kauçuğun yola çarpma anı. Eğer zar zor dayanabildiğinizi hissediyorsanız ve bu kısmı bitirebileceğinizden şüphe ediyorsanız, çoğu insanın da böyle hissettiğini bilmek muhtemelen iyi olacaktır. Çok az kişi bunun kadar soyut bir şeye adım atar ve ilk (veya üçüncü) denemede başarıya ulaşır. Haydi işe koyulalım!
Bu ilk dağıtım için hepimizin adıyla bildiği bir şeyi kullanalım: Splunk. Bu komut dosyasında, Splunk'un önceden kurulu ve yapılandırılmış olduğu tek bir sunucuyu konuşlandıracağız. Bu bir Amazon Machine Image (AMI) kullanacaktır. Aralarından seçim yapabileceğiniz birçok AMI var. Bazıları Windows veya Linux gibi farklı işletim sistemleridir; bazıları Linux'un Ubuntu, CentOS vb. gibi farklı dağıtımlarıdır ve bazıları bunun gibi önceden oluşturulmuş uygulamalardır.
Splunk EC2 sunucusunu ("Splunk örneği") çalıştıracağız, yalnızca genel IP adresinizin TCP bağlantı noktası 8000'de (varsayılan Splunk UI bağlantı noktası) erişmesine izin verecek ağ erişimi oluşturacağız ve ardından tüm bunları basit bir Terraform ile yok edeceğiz. işimiz bittiğinde komut verin.
Tek terraform dosyasını (main.tf) birkaç küçük parçaya böleceğim, böylece her parçayı daha kolay inceleyebiliriz. Daha sonra, sonunda hepsini bir araya getireceğim, böylece uygulayabiliriz.
Başlamadan önce, burada ele almadığım soruların yanıtlarını bulmak için nereye gidebileceğinizi bilmeniz önemlidir. Örnek olarak, Terraform'da oluşturmaya başladığımda şunu merak ettim: "Hangi argümanları nasıl bilebilirim (bu, EC2 örneğindeki sanal makinenin türü veya bir güvenlik grubunda izin verilen giriş protokolleri gibi kaynakları bu şekilde tanımlarsınız) Bu örnekte ve burada yanıtlanmayan BİRÇOK diğer soru için, mevcut sağlayıcılar, kaynaklar, bağımsız değişkenler ve sözdizimi hakkında daha fazla bilgi edinmek için Terraform kayıt defterine gidebilirsiniz.
Örneğin, kayıt defterinde gidip "Güvenlik Grubu" kaynağını bulabilirim (bu eğitimde kullanacağız), ardından Girişler sekmesine giderek mevcut tüm argümanları görüntüleyebilirim (onlara değişkenler diyorlar, bilginize) kaynağı yapılandırdığımızda izin verilir. Tamam... dolambaçlı yol tamamlandı, ilk TF konuşlandırmanızın yapılandırmasına geçin!
İlk adım olarak kullanmak istediğimiz sağlayıcıyı tanımlamamız gerekiyor. AWS'de çalışıyoruz, dolayısıyla sağlayıcı "AWS" olacak. Çalışmak istediğimiz bölgeyi de burada tanımlayacağız.
provider "aws" { region = "us-west-1" }
Hatırlarsanız sanal makine (EC2) için Amazing Machine Image (AMI) kullanacağımızı söylemiştim. Burada Terraform "data" anahtar kelimesini kullanarak "aws_ami" kaynağına gidip arama yapıyoruz. Ek olarak, bu aramanın bir parçası olarak döndürülen her türlü veriye bir ad veriyoruz - "Splunk." Bu, bu verilere kodumuzun başka bir yerinde referans verebilmemiz içindir (bunu daha sonra aklınızda bulundurun)...
Herhangi bir şeyi aramak, arama sonuçlarını yalnızca bulmak istediğimiz şeyle sınırlamanın bir yolunu gerektirdiğinden, filtre anahtar sözcüğünü kullanırız ve ardından ona "ad" ve "değerler" olmak üzere iki bağımsız değişken iletiriz. Burada, "aws_ami" aramasına "name" alanında "Splunk" ile başlayan herhangi bir şeyi arama talimatını veriyoruz. Bunun daha spesifik olacak şekilde ayarlanması gerekebilir, ancak bu durumda bu filtre iyidir.
data "aws_ami" "splunk" { most_recent = true filter { name = "name" values = ["splunk*"] } }
AWS'de kaynaklara ağ erişimi genellikle " Güvenlik Grubu " adı verilen bir kaynak aracılığıyla kontrol edilir. Örneğimizde, benim IP adresimden (veya bu betiği oluşturduğunuzda sizin adresinizden) TCP bağlantı noktası 8000'in ("giriş") gelmesine izin veren bir güvenlik grubu kullanacağız. Çünkü Splunk'u hassas olmayan bilgilere sahip özel bir hesapta kullanıyoruz. Giden iletişim ("çıkış") yapmasına izin vereceğim. Ancak bu bir üretim ortamı olsaydı, gerekli IP ve bağlantı noktası aralıklarını tanımlamanız ve en iyi uygulamaları takip etmek için erişimi yalnızca bunlarla kısıtlamanız gerekirdi.
Dikkat edin, protokol ve "cidr_blocks" dahil olmak üzere giriş parametrelerini tanımlıyorum. Buradaki yanlış yapılandırmalar yanlışlıkla daha geniş bir internet ortamına açılabileceğinden bu önemlidir. AWS ortamınız için ek ağ güvenliği sağlama konusunda bilgi edinmek istiyorsanız bana bildirin - Application Load Balancer ekleme konusunda bir eğitim oluşturabilirim ( ALB) ek güvenlik özellikleri sağlamak için bu yapılandırmaya.
resource "aws_security_group" "splunksg" { name = "SplunkSecGroup" description = "Allow-on-port-8000" ingress { from_port = 8000 to_port = 8000 protocol = "tcp" cidr_blocks = ["YOUR_IP_HERE"] # Replace 'YOUR_PUBLIC_HERE' with your public IP address } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } }
Son olarak hepimizin burada olmasının nedeni Splunk'u çalıştıracak sanal makine. Terraform kodunun diğer tüm bölümlerinde olduğu gibi, bir kaynağı (bu durumda "aws_instance") tanımlayarak ve ona "splunk_ec2" adını vererek başlıyoruz, ardından argümanları kullanarak altındaki diğer parametreleri tanımlamaya devam ediyoruz.
En güncel "Splunk*" AMI'sini "aws_ami" olarak aramak için yukarıda kullandığımız "data" anahtar kelimesini hatırlıyor musunuz? "Splunk" ismimiz var. Burada EC2 bulut sunucusu yapılandırmasında o sorgunun içerdiği verilere referans verebiliriz. "Ami" argümanını kullanarak ve bunun "data.aws_ami.splunk.id" içindeki her şeye eşit olduğunu söyleyerek ona atıfta bulunuruz. Bu anlaşılması gereken gerçekten önemli bir kavramdır, o yüzden iki dakikamızı onu parçalara ayırmaya ayıralım:
Aşağıya indiğimizde bu EC2'nin güvenlik_grubunun yukarıda tanımladığımız "splunksg" güvenlik grubu olduğunu söylüyoruz. Bu, AMI "veri" adlandırmayla aynı mantığı kullanır. IE, kaynak adı, tanımladığımız nesne adı ve ardından " SplunkSecGroup " olarak da tanımladığımız ".name" değişkeniyle başlar. Ayrıca bunun için t2.micro'nun example_type'ını kullanabileceğinizi unutmayın ve bu çalışıyor - sadece çok yavaş, bu yüzden t2.medium'u tercih ediyorum.
Son olarak, bu örneğe etiketler uyguluyoruz; bu, bir AWS hesabı büyüdüğünde ve varlıkları takip etmek zorlaştığında yararlı olur.
resource "aws_instance" "splunk_ec2" { ami = data.aws_ami.splunk.id instance_type = "t2.medium" security_groups = [aws_security_group.splunksg.name] tags = { Name = "SplunkInstance" } }
Şimdi, bu kısmı atlayıp bunu dosya sistemine yerleştirip çalıştırabileceğinizi ve öğreticiyi "tamamladığınızdan" beri dünyayla barışık olabileceğinizi biliyorum, ancak bunu yapmayın. Bu kadar tembel olma. Benimle okumaya ve birlikte inşa etmeye zaman ayırmanın değeri, hata yapmanın acısı ve bu hataları düzeltmenin sevincidir.
Hepsini bir araya getirdiğimizde şuna benzer bir terraform komut dosyasına sahip olmalıyız:
provider "aws" { region = "us-west-1" } data "aws_ami" "splunk" { most_recent = true filter { name = "name" values = ["splunk*"] } } resource "aws_security_group" "splunksg" { name = "SplunkSecGroup" description = "Allow-on-port-8000" ingress { from_port = 8000 to_port = 8000 protocol = "tcp" cidr_blocks = ["YOUR_PUBLIC_HERE/32"] # Replace 'YOUR_PUBLIC_HERE' with your public IP address } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_instance" "splunk_ec2" { ami = data.aws_ami.splunk.id instance_type = "t2.medium" security_groups = [aws_security_group.splunksg.name] tags = { Name = "SplunkInstance" } }
Vay be, şuna bakın, 43 satır kod! Kulağa çok gibi geliyor ama artık işiniz bitti; güncelleyebilir, onunla oluşturabilir, yok edebilir veya paylaşabilirsiniz!
Bu noktada IaC'nin Kilidini Açma bölümünün 2. Bölümünde bunun çalışması için gerekli tüm parçaları zaten kurduğumuzdan, gereken tek şey dosyayı doğru uzantıyla kaydetmektir (haydi main.tf kullanalım).
CMD veya PowerShell'i yönetici olarak açın (CTRL+SHIFT+CLICK veya sağ tıklayıp "farklı çalıştır..."), "CD" veya dizini az önce oluşturduğumuz dosyayla (main.tf) aynı konuma değiştirin ve aşağıdaki komutu verin komutlar:
c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>terraform init Initializing the backend... Initializing provider plugins... - Reusing previous version of hashicorp/aws from the dependency lock file - Using previously-installed hashicorp/aws v5.1.0 Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
Terraform init
bu dizinde Terraform'u başlatır. Bu aslında Terraform'u başlatıyor.
c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>terraform plan Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # aws_instance.splunk_server will be created + resource "aws_instance" "splunk_server" { + ami = "ami-0b5cb59327b8d7e1f" + arn = (known after apply) + associate_public_ip_address = true + availability_zone = (known after apply) + cpu_core_count = (known after apply) + cpu_threads_per_core = (known after apply) + disable_api_stop = (known after apply) + disable_api_termination = (known after apply) + ebs_optimized = (known after apply) + get_password_data = false + host_id = (known after apply) + host_resource_group_arn = (known after apply) + iam_instance_profile = (known after apply) + id = (known after apply) + instance_initiated_shutdown_behavior = (known after apply) + instance_state = (known after apply) + instance_type = "t3.large" + ipv6_address_count = (known after apply) + ipv6_addresses = (known after apply) + key_name = (known after apply) + monitoring = (known after apply) + outpost_arn = (known after apply) + password_data = (known after apply) + placement_group = (known after apply) + placement_partition_number = (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_all = (known after apply) + tenancy = (known after apply) + user_data = (known after apply) + user_data_base64 = (known after apply) + user_data_replace_on_change = false + vpc_security_group_ids = (known after apply) + capacity_reservation_specification { + capacity_reservation_preference = (known after apply) + capacity_reservation_target { + capacity_reservation_id = (known after apply) + capacity_reservation_resource_group_arn = (known after apply) } } + cpu_options { + amd_sev_snp = (known after apply) + core_count = (known after apply) + threads_per_core = (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) + tags = (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) } + maintenance_options { + auto_recovery = (known after apply) } + metadata_options { + http_endpoint = (known after apply) + http_put_response_hop_limit = (known after apply) + http_tokens = (known after apply) + instance_metadata_tags = (known after apply) } + network_interface { + delete_on_termination = (known after apply) + device_index = (known after apply) + network_card_index = (known after apply) + network_interface_id = (known after apply) } + private_dns_name_options { + enable_resource_name_dns_a_record = (known after apply) + enable_resource_name_dns_aaaa_record = (known after apply) + hostname_type = (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) + tags = (known after apply) + throughput = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } } # aws_security_group.splunk_server will be created + resource "aws_security_group" "splunk_server" { + arn = (known after apply) + description = "Managed by Terraform" + egress = (known after apply) + id = (known after apply) + ingress = [ + { + cidr_blocks = [ + "[redacted]/32", ] + description = "" + from_port = 22 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + protocol = "tcp" + security_groups = [] + self = false + to_port = 22 }, + { + cidr_blocks = [ + "[redacted]/32", ] + description = "" + from_port = 8000 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + protocol = "tcp" + security_groups = [] + self = false + to_port = 8000 }, ] + name = (known after apply) + name_prefix = "splunk-group" + owner_id = (known after apply) + revoke_rules_on_delete = false + tags_all = (known after apply) + vpc_id = (known after apply) } # aws_subnet.splunk_server will be created + resource "aws_subnet" "splunk_server" { + arn = (known after apply) + assign_ipv6_address_on_creation = false + availability_zone = (known after apply) + availability_zone_id = (known after apply) + cidr_block = "172.31.1.0/28" + enable_dns64 = false + enable_resource_name_dns_a_record_on_launch = false + enable_resource_name_dns_aaaa_record_on_launch = false + id = (known after apply) + ipv6_cidr_block_association_id = (known after apply) + ipv6_native = false + map_public_ip_on_launch = false + owner_id = (known after apply) + private_dns_hostname_type_on_launch = (known after apply) + tags_all = (known after apply) + vpc_id = "vpc-[redacted]" } Plan: 3 to add, 0 to change, 0 to destroy. ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now. c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>
Bu tamamlandıktan sonra, bulut ortamınızda herhangi bir değişiklik yapmadan Terraform yapınızın ne yapacağını görmenin bir yöntemi olan terraform plan
çalıştırmak iyi bir fikirdir. Bu çıktıyı dikkatle inceleyin ve gördüklerinizin beklentilerinizle eşleştiğinden emin olun.
c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>terraform apply Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # aws_instance.splunk_server will be created + resource "aws_instance" "splunk_server" { + ami = "ami-0b5cb59327b8d7e1f" + arn = (known after apply) + associate_public_ip_address = true + availability_zone = (known after apply) + cpu_core_count = (known after apply) + cpu_threads_per_core = (known after apply) + disable_api_stop = (known after apply) + disable_api_termination = (known after apply) + ebs_optimized = (known after apply) + get_password_data = false + host_id = (known after apply) + host_resource_group_arn = (known after apply) + iam_instance_profile = (known after apply) + id = (known after apply) + instance_initiated_shutdown_behavior = (known after apply) + instance_state = (known after apply) + instance_type = "t3.large" + ipv6_address_count = (known after apply) + ipv6_addresses = (known after apply) + key_name = (known after apply) + monitoring = (known after apply) + outpost_arn = (known after apply) + password_data = (known after apply) + placement_group = (known after apply) + placement_partition_number = (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_all = (known after apply) + tenancy = (known after apply) + user_data = (known after apply) + user_data_base64 = (known after apply) + user_data_replace_on_change = false + vpc_security_group_ids = (known after apply) + capacity_reservation_specification { + capacity_reservation_preference = (known after apply) + capacity_reservation_target { + capacity_reservation_id = (known after apply) + capacity_reservation_resource_group_arn = (known after apply) } } + cpu_options { + amd_sev_snp = (known after apply) + core_count = (known after apply) + threads_per_core = (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) + tags = (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) } + maintenance_options { + auto_recovery = (known after apply) } + metadata_options { + http_endpoint = (known after apply) + http_put_response_hop_limit = (known after apply) + http_tokens = (known after apply) + instance_metadata_tags = (known after apply) } + network_interface { + delete_on_termination = (known after apply) + device_index = (known after apply) + network_card_index = (known after apply) + network_interface_id = (known after apply) } + private_dns_name_options { + enable_resource_name_dns_a_record = (known after apply) + enable_resource_name_dns_aaaa_record = (known after apply) + hostname_type = (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) + tags = (known after apply) + throughput = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } } # aws_security_group.splunk_server will be created + resource "aws_security_group" "splunk_server" { + arn = (known after apply) + description = "Managed by Terraform" + egress = (known after apply) + id = (known after apply) + ingress = [ + { + cidr_blocks = [ + "[redacted]/32", ] + description = "" + from_port = 22 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + protocol = "tcp" + security_groups = [] + self = false + to_port = 22 }, + { + cidr_blocks = [ + "[redacted]/32", ] + description = "" + from_port = 8000 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + protocol = "tcp" + security_groups = [] + self = false + to_port = 8000 }, ] + name = (known after apply) + name_prefix = "splunk-group" + owner_id = (known after apply) + revoke_rules_on_delete = false + tags_all = (known after apply) + vpc_id = (known after apply) } # aws_subnet.splunk_server will be created + resource "aws_subnet" "splunk_server" { + arn = (known after apply) + assign_ipv6_address_on_creation = false + availability_zone = (known after apply) + availability_zone_id = (known after apply) + cidr_block = "172.31.1.0/28" + enable_dns64 = false + enable_resource_name_dns_a_record_on_launch = false + enable_resource_name_dns_aaaa_record_on_launch = false + id = (known after apply) + ipv6_cidr_block_association_id = (known after apply) + ipv6_native = false + map_public_ip_on_launch = false + owner_id = (known after apply) + private_dns_hostname_type_on_launch = (known after apply) + tags_all = (known after apply) + vpc_id = "vpc-[redacted]" } Plan: 3 to add, 0 to change, 0 to destroy. Changes to Outputs: + splunk_server_public_ip = (known after apply) Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes aws_subnet.splunk_server: Creating... aws_security_group.splunk_server: Creating... aws_subnet.splunk_server: Creation complete after 1s [id=subnet-053c39ae3dcc97112] aws_security_group.splunk_server: Creation complete after 2s [id=sg-03bf97ed2524e4aee] aws_instance.splunk_server: Creating... aws_instance.splunk_server: Still creating... [10s elapsed] aws_instance.splunk_server: Creation complete after 13s [id=i-050c4bad2d2a6ba93] Apply complete! Resources: 3 added, 0 changed, 0 destroyed. c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>
Son olarak, terraform apply
çalıştırmak kodu alır ve AWS hesabınıza uygular. Bu işlem birkaç saniyeden bir dakikaya kadar sürebilir, ancak işlem tamamlandığında bir başarı mesajı alacaksınız. Herhangi bir hata alırsanız hatayı dikkatlice inceleyin. Terraform hataları genellikle yüksek kalitededir ve anlaşılması (eğer varsa) çok fazla araştırma gerektirmeyen ipuçları verir.
Bu noktada, Splunk sunucunuz muhtemelen oturum açmaya hazırdır (kullanıcı arayüzünün Splunk'ta kullanılabilir hale gelmesi bir veya iki dakika sürer). Splunk'a giriş yapmak için üç parça bilgiye ihtiyacınız olacak:
admin
SPLUNK-<instanceid>
olacak şifrehttp://10.10.10.10:8000
)
IP adresini Terraform'dan çıkarıp size betiğin ÇIKIŞI olarak teslim etmesini sağlamak veya bu bilgiyi toplamak için AWS CLI'yi kullanmak mümkün olsa da, basitlik açısından bunu burada yapmadık. IP adresinizi ve örnek kimliğinizi almak için AWS konsolunuzda oturum açmanız gerekir.
Hizmetler menüsünde EC2'yi arayın, ardından EC2'ye ve ardından Bulut Sunucuları (çalışıyor) seçeneğine tıklayın. Bu görünümde, çalışan EC2 bulut sunucularının bir listesini göreceksiniz; başka eğlenceli şeyler yapmadığınız sürece bu yalnızca liste olmalıdır.
Doğru örneği (veya tek örneği) tıklayın; bu görünümde, sol üstte, soldaki kopyala düğmesine tıklanarak kopyalanabilen “Örnek Kimliği”ni göreceksiniz ve sağda, IP adresi.
Bu IP adresini alın ve tercih ettiğiniz tarayıcıyı kullanarak http://[instanceIP]:8000
yazıp enter tuşuna basın. Splunk girişini görmelisiniz - eğer görmezseniz, bir veya iki dakika daha bekleyin - Splunk'un ilk kez başlatılması (kelimenin tam anlamıyla) 2-3 dakika sürer. username = admin
ve password = SPLUNK-[instanceID]
unutmayın.
İnşa etmek harikadır ve yeni şeyler öğrenmek eğlencelidir; eğlenmeyi bitirdiğinizde bulut kaynaklarınızı kapatmayı unutmak berbat bir şeydir. Terraform yok etme, terraform uygulamasının tersini gerçekleştirir. Terraform dosyasında belirtilen altyapıyı yıkar. Şu anda yapmanız gereken terraform destroy özelliğini kullanmak için komut satırınıza geri dönün ve terraform destroy
girin. Terraform imhasının başarılı bir şekilde gerçekleştirilmesi, Splunk kullanıcı arayüzünün olmaması (muhtemelen bağlantının kesildiğini size bildirecektir) ve ayrıca yok etme komutunun çıktısı ile fark edilecektir.
c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>terraform destroy aws_subnet.splunk_server: Refreshing state... [id=subnet-053c39ae3dcc97112] aws_security_group.splunk_server: Refreshing state... [id=sg-03bf97ed2524e4aee] aws_instance.splunk_server: Refreshing state... [id=i-050c4bad2d2a6ba93] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: - destroy Terraform will perform the following actions: # aws_instance.splunk_server will be destroyed - resource "aws_instance" "splunk_server" { - ami = "ami-0b5cb59327b8d7e1f" -> null - arn = "arn:aws:ec2:us-west-2:625982356191:instance/i-050c4bad2d2a6ba93" -> null - associate_public_ip_address = true -> null - availability_zone = "us-west-2b" -> null - cpu_core_count = 1 -> null - cpu_threads_per_core = 2 -> null - disable_api_stop = false -> null - disable_api_termination = false -> null - ebs_optimized = false -> null - get_password_data = false -> null - hibernation = false -> null - id = "i-050c4bad2d2a6ba93" -> null - instance_initiated_shutdown_behavior = "stop" -> null - instance_state = "running" -> null - instance_type = "t3.large" -> null - ipv6_address_count = 0 -> null - ipv6_addresses = [] -> null - monitoring = false -> null - placement_partition_number = 0 -> null - primary_network_interface_id = "eni-059f68aecb53fc4bb" -> null - private_dns = "ip-172-31-1-11.us-west-2.compute.internal" -> null - private_ip = "172.31.1.11" -> null - public_dns = "[redacted].us-west-2.compute.amazonaws.com" -> null - public_ip = "[redacted]" -> null - secondary_private_ips = [] -> null - security_groups = [ - "splunk-group20230929124520702900000001", ] -> null - source_dest_check = true -> null - subnet_id = "subnet-053c39ae3dcc97112" -> null - tags = {} -> null - tags_all = {} -> null - tenancy = "default" -> null - user_data_replace_on_change = false -> null - vpc_security_group_ids = [ - "sg-03bf97ed2524e4aee", ] -> null - capacity_reservation_specification { - capacity_reservation_preference = "open" -> null } - cpu_options { - core_count = 1 -> null - threads_per_core = 2 -> null } - credit_specification { - cpu_credits = "unlimited" -> null } - enclave_options { - enabled = false -> null } - maintenance_options { - auto_recovery = "default" -> null } - metadata_options { - http_endpoint = "enabled" -> null - http_put_response_hop_limit = 1 -> null - http_tokens = "optional" -> null - instance_metadata_tags = "disabled" -> null } - private_dns_name_options { - enable_resource_name_dns_a_record = false -> null - enable_resource_name_dns_aaaa_record = false -> null - hostname_type = "ip-name" -> null } - root_block_device { - delete_on_termination = true -> null - device_name = "/dev/xvda" -> null - encrypted = false -> null - iops = 100 -> null - tags = {} -> null - throughput = 0 -> null - volume_id = "vol-0e283fb892f5fe38a" -> null - volume_size = 20 -> null - volume_type = "gp2" -> null } } # aws_security_group.splunk_server will be destroyed - resource "aws_security_group" "splunk_server" { - arn = "arn:aws:ec2:us-west-2:625982356191:security-group/sg-03bf97ed2524e4aee" -> null - description = "Managed by Terraform" -> null - egress = [] -> null - id = "sg-03bf97ed2524e4aee" -> null - ingress = [ - { - cidr_blocks = [ - "[redacted]/32", ] - description = "" - from_port = 22 - ipv6_cidr_blocks = [] - prefix_list_ids = [] - protocol = "tcp" - security_groups = [] - self = false - to_port = 22 }, - { - cidr_blocks = [ - "[redacted]/32", ] - description = "" - from_port = 8000 - ipv6_cidr_blocks = [] - prefix_list_ids = [] - protocol = "tcp" - security_groups = [] - self = false - to_port = 8000 }, ] -> null - name = "splunk-group20230929124520702900000001" -> null - name_prefix = "splunk-group" -> null - owner_id = "625982356191" -> null - revoke_rules_on_delete = false -> null - tags = {} -> null - tags_all = {} -> null - vpc_id = "vpc-002c2876364b2b282" -> null } # aws_subnet.splunk_server will be destroyed - resource "aws_subnet" "splunk_server" { - arn = "arn:aws:ec2:us-west-2:625982356191:subnet/subnet-053c39ae3dcc97112" -> null - assign_ipv6_address_on_creation = false -> null - availability_zone = "us-west-2b" -> null - availability_zone_id = "usw2-az1" -> null - cidr_block = "172.31.1.0/28" -> null - enable_dns64 = false -> null - enable_lni_at_device_index = 0 -> null - enable_resource_name_dns_a_record_on_launch = false -> null - enable_resource_name_dns_aaaa_record_on_launch = false -> null - id = "subnet-053c39ae3dcc97112" -> null - ipv6_native = false -> null - map_customer_owned_ip_on_launch = false -> null - map_public_ip_on_launch = false -> null - owner_id = "625982356191" -> null - private_dns_hostname_type_on_launch = "ip-name" -> null - tags = {} -> null - tags_all = {} -> null - vpc_id = "vpc-002c2876364b2b282" -> null } Plan: 0 to add, 0 to change, 3 to destroy. Do you really want to destroy all resources? Terraform will destroy all your managed infrastructure, as shown above. There is no undo. Only 'yes' will be accepted to confirm. Enter a value: yes aws_instance.splunk_server: Destroying... [id=i-050c4bad2d2a6ba93] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 10s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 20s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 30s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 40s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 51s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m1s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m11s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m21s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m31s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m41s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m51s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m1s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m11s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m21s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m31s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m41s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m51s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 3m1s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 3m11s elapsed] aws_instance.splunk_server: Destruction complete after 3m14s aws_subnet.splunk_server: Destroying... [id=subnet-053c39ae3dcc97112] aws_security_group.splunk_server: Destroying... [id=sg-03bf97ed2524e4aee] aws_subnet.splunk_server: Destruction complete after 0s aws_security_group.splunk_server: Destruction complete after 0s Destroy complete! Resources: 3 destroyed. c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>
Bunun gibi bir canavar eğitiminin sonuna gelmek kolay değil. Bu noktaya kadar gelebildiyseniz tebrikler! Eğer bir şeyi kaçırdıysam ki muhtemelen özür dilerim! Bu noktada, bu yeni keşfedilen beceriyle oynamaya devam etmek faydalı olacaktır: Terraform komut dosyanızı değiştirin ve ek depolama için EC2 bulut sunucusuna bir EBS birimi ekleyin. Uzun süreli depolama için S3'ü ekleyin. SSH'yi kullanabilmeniz ve kullanıcı arayüzünü kullanabilmeniz için sanal makineye otomatik olarak bir SSH anahtar çiftini nasıl ekleyeceğinizi öğrenin. Önemli olan her gün biraz da olsa bununla oynamaya devam etmektir.
Durduğunuz an bu becerinizi yavaş yavaş kaybetmeye başladığınız andır.