आइए इसका सामना करें: IaC जैसी तकनीकी चीज़ पर 3 भाग की श्रृंखला एक चुनौती हो सकती है। मुझे यकीन है कि आप अब तक कई बार इससे दूर हो चुके होंगे। इसे भाग 3 में बनाना रोमांचक है - तभी मज़ेदार भाग शुरू होता है। यह वह क्षण है जब रबर सड़क से टकराता है। यदि आपको ऐसा लगता है कि आप मुश्किल से रुके हैं और आपको संदेह है कि आप इस भाग को पूरा कर पाएंगे, तो शायद यह जानना अच्छा होगा कि अधिकांश लोग भी ऐसा ही महसूस करते हैं। बहुत कम लोग इस जैसी अमूर्त चीज़ में प्रवेश करते हैं और पहले प्रयास (या तीसरे) में ही सफल हो जाते हैं। चलो पहले कारोबार करें!
इस पहली तैनाती के लिए, आइए उस चीज़ का उपयोग करें जिसे हम सभी स्प्लंक नाम से जानते हैं। इस स्क्रिप्ट में, हम एक एकल सर्वर तैनात करेंगे जिसमें स्प्लंक पहले से ही स्थापित और कॉन्फ़िगर किया गया है। यह अमेज़ॅन मशीन इमेज (एएमआई) का उपयोग करेगा। चुनने के लिए कई एएमआई हैं। कुछ भिन्न OS हैं, जैसे Windows या Linux; कुछ लिनक्स के अलग-अलग डिस्ट्रो हैं, जैसे उबंटू, सेंटओएस इत्यादि, और कुछ इस जैसे पूर्वनिर्मित एप्लिकेशन हैं।
हम स्प्लंक EC2 सर्वर ("स्प्लंक इंस्टेंस") को स्पिन करेंगे, केवल आपके सार्वजनिक आईपी पते को टीसीपी पोर्ट 8000 (डिफ़ॉल्ट स्प्लंक यूआई पोर्ट) तक पहुंचने की अनुमति देने के लिए नेटवर्क एक्सेस बनाएंगे, और फिर एक साधारण टेराफॉर्म के साथ यह सब नष्ट कर देंगे। जब हमारा काम पूरा हो जाए तो आदेश दें।
मैं एकल टेराफ़ॉर्म फ़ाइल (main.tf) को कुछ छोटे टुकड़ों में तोड़ दूँगा ताकि हम प्रत्येक भाग पर अधिक आसानी से चल सकें। फिर, अंत में, मैं यह सब एक साथ रखूंगा ताकि हम इसे निष्पादित कर सकें।
आरंभ करने से पहले, यह महत्वपूर्ण है कि आप जानें कि आप उन प्रश्नों के उत्तर खोजने के लिए कहां जा सकते हैं जिन पर मैंने यहां विचार नहीं किया है। उदाहरण के तौर पर, जब मैंने टेराफॉर्म में निर्माण शुरू किया, तो मुझे आश्चर्य हुआ, "मुझे कैसे पता चलेगा कि कौन से तर्क हैं (इस तरह आप संसाधनों को परिभाषित करते हैं, जैसे ईसी 2 उदाहरण में वर्चुअल मशीन का प्रकार या सुरक्षा समूह में अनुमत प्रवेश प्रोटोकॉल) इस उदाहरण में, और कई अन्य प्रश्नों का उत्तर यहां नहीं दिया गया है, आप उपलब्ध प्रदाताओं, संसाधनों, तर्कों और वाक्यविन्यास के बारे में अधिक जानने के लिए टेराफॉर्म रजिस्ट्री पर जा सकते हैं।
उदाहरण के लिए, रजिस्ट्री में, मैं जा सकता हूं और "सुरक्षा समूह" संसाधन ढूंढ सकता हूं (जिसे हम इस ट्यूटोरियल में उपयोग करेंगे), फिर सभी उपलब्ध तर्कों को देखने के लिए इनपुट टैब पर जाएं (वे उन्हें चर कहते हैं, FYI करें) जो होगा जब हम संसाधन को कॉन्फ़िगर करते हैं तो अनुमति दी जाती है। ठीक है...अपनी पहली टीएफ तैनाती की कॉन्फ़िगरेशन पर पूरा चक्कर लगाएं!
पहला कदम, हमें उस प्रदाता को परिभाषित करना होगा जिसका हम उपयोग करना चाहेंगे। हम AWS में काम कर रहे हैं, इसलिए प्रदाता "AWS" होगा। हम यहां उस क्षेत्र को भी परिभाषित करेंगे जिस पर हम काम करना चाहते हैं।
provider "aws" { region = "us-west-1" }
यदि आपको याद हो, तो मैंने कहा था कि हम एक वर्चुअल मशीन (EC2) के लिए एक अमेजिंग मशीन इमेज (AMI) का उपयोग करने जा रहे हैं। यहां, हम संसाधन "aws_ami" पर जाने और खोजने के लिए टेराफॉर्म "डेटा" कीवर्ड का उपयोग करते हैं। इसके अलावा, हम इस खोज के हिस्से के रूप में जो भी डेटा लौटाते हैं उसे एक नाम देते हैं - "स्प्लंक।" ऐसा इसलिए है ताकि हम इस डेटा को अपने कोड में कहीं और संदर्भित कर सकें (इसे बाद में ध्यान में रखें)...
चूँकि किसी भी चीज़ को खोजने के लिए खोज परिणामों को केवल वही तक सीमित करने की आवश्यकता होती है जो हम खोजना चाहते हैं, हम फ़िल्टर कीवर्ड का उपयोग करते हैं और फिर इसे दो तर्क, "नाम" और "मान" पास करते हैं। यहां, हम "स्प्लंक" से शुरू होने वाली किसी भी चीज़ के लिए "नाम" फ़ील्ड में खोज करने के लिए "aws_ami" की खोज का निर्देश देते हैं। हालांकि इसे और अधिक विशिष्ट बनाने की आवश्यकता हो सकती है, इस मामले में, यह फ़िल्टर अच्छा है।
data "aws_ami" "splunk" { most_recent = true filter { name = "name" values = ["splunk*"] } }
AWS में, संसाधनों तक नेटवर्क पहुंच को अक्सर " सुरक्षा समूह " नामक संसाधन के माध्यम से नियंत्रित किया जाता है। हमारे उदाहरण में, हम एक सुरक्षा समूह का उपयोग करेंगे जो मेरे आईपी पते (या आपके, जब आप यह स्क्रिप्ट बनाते हैं) से टीसीपी पोर्ट 8000 इनबाउंड ("प्रवेश") की अनुमति देता है। क्योंकि हम गैर-संवेदनशील जानकारी के साथ एक निजी खाते में स्प्लंक का उपयोग कर रहे हैं, मैं इसे आउटबाउंड ("एग्रेस") संचार करने की अनुमति दूंगा। हालाँकि, यदि यह एक उत्पादन वातावरण होता, तो आपको आवश्यक आईपी और पोर्ट श्रेणियों की पहचान करने और सर्वोत्तम प्रथाओं का पालन करने के लिए केवल उन तक पहुंच को प्रतिबंधित करने की आवश्यकता होगी।
ध्यान दें कि मैं प्रोटोकॉल और "cidr_blocks" सहित प्रवेश मापदंडों को परिभाषित करता हूं। यह महत्वपूर्ण है, क्योंकि यहां ग़लत कॉन्फ़िगरेशन व्यापक इंटरनेट के लिए आकस्मिक रूप से एक वातावरण खोल सकता है। यदि आप अपने AWS वातावरण के लिए अतिरिक्त नेटवर्क सुरक्षा प्रदान करने के बारे में सीखने में रुचि रखते हैं, तो मुझे बताएं - मैं एप्लिकेशन लोड बैलेंसर जोड़ने पर एक ट्यूटोरियल बना सकता हूं ( अतिरिक्त सुरक्षा सुविधाएँ प्रदान करने के लिए इस कॉन्फ़िगरेशन में ALB)।
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"] } }
अंत में, हम सभी के यहाँ होने का कारण - वर्चुअल मशीन जो स्प्लंक चलाएगी। जैसा कि टेराफॉर्म कोड के अन्य सभी भागों के मामले में है, हम एक संसाधन को परिभाषित करके शुरू करते हैं, इस मामले में, "aws_instance," और इसे "splunk_ec2" नाम देते हुए, फिर तर्कों का उपयोग करके इसके नीचे अन्य मापदंडों को परिभाषित करने के लिए आगे बढ़ते हैं।
क्या आपको वह "डेटा" कीवर्ड याद है जिसका उपयोग हमने नवीनतम "स्प्लंक*" एएमआई के लिए "aws_ami" खोजने के लिए ऊपर किया था? हमारा नाम "स्प्लंक" है। यहां, EC2 इंस्टेंस कॉन्फ़िगरेशन में, हम उस क्वेरी में मौजूद डेटा का संदर्भ दे सकते हैं। हम इसे "ami" तर्क का उपयोग करके संदर्भित करते हैं और कहते हैं कि यह "data.aws_ami.splunk.id" में जो कुछ भी है उसके बराबर है। यह समझने के लिए वास्तव में एक महत्वपूर्ण अवधारणा है, तो आइए इसे समझने में दो मिनट बिताएँ:
नीचे जाते हुए, हम कहते हैं कि इस EC2 के लिए सुरक्षा समूह "स्प्लंक्सग" सुरक्षा समूह है जिसे हमने ऊपर परिभाषित किया है। यह एएमआई "डेटा" नामकरण के समान तर्क का उपयोग करता है। IE, यह संसाधन नाम, हमारे द्वारा परिभाषित ऑब्जेक्ट नाम और फिर वेरिएबल ".name" से शुरू होता है, जिसे हमने " स्प्लंकसेकग्रुप " के रूप में भी परिभाषित किया है, यह भी ध्यान दें, आप इसके लिए t2.micro के इंस्टेंस_टाइप का उपयोग कर सकते हैं, और यह काम करता है - यह बहुत धीमा है, इसलिए मैं t2.medium चुनता हूं।
अंत में, हम इस उदाहरण पर टैग लागू करते हैं, जो तब सहायक होता है जब AWS खाता बढ़ता है और संपत्तियों पर नज़र रखना अधिक कठिन हो जाता है।
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" } }
अब, मुझे पता है कि आप बस इस भाग पर आगे बढ़ सकते थे और इसे फ़ाइल सिस्टम में डाल सकते थे और इसे चला सकते थे और ट्यूटोरियल को "पूरा" करने के बाद दुनिया के साथ शांति महसूस कर सकते थे, लेकिन ऐसा न करें। इतना आलसी मत बनो. मेरे साथ पढ़ने और निर्माण करने के लिए समय निकालने का महत्व गलतियाँ करने के दर्द और उन गलतियों को ठीक करने की खुशी में है।
यह सब एक साथ रखने पर, हमारे पास एक टेराफॉर्म स्क्रिप्ट होनी चाहिए जो इस तरह दिखे:
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" } }
वाह, वह देखो, कोड की 43 पंक्तियाँ! यह बहुत कुछ लगता है, लेकिन आपने इसे पूरा कर लिया है - आप इसे अपडेट कर सकते हैं, इसके साथ बना सकते हैं, इसे नष्ट कर सकते हैं, या इसे साझा कर सकते हैं!
चूँकि हमने इस बिंदु पर IaC को अनलॉक करने के भाग 2 में इस कार्य को करने के लिए सभी आवश्यक टुकड़े पहले ही सेट कर लिए हैं, बस फ़ाइल को सही एक्सटेंशन के साथ सहेजना है (आइए main.tf का उपयोग करें)।
सीएमडी या पावरशेल को व्यवस्थापक के रूप में खोलें (CTRL + SHIFT + क्लिक करें या राइट क्लिक करें और "इस रूप में चलाएं ..."), "सीडी" या निर्देशिका को उसी स्थान पर बदलें जिस फ़ाइल को हमने अभी बनाया है (main.tf) और निम्नलिखित जारी करें आदेश:
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
उस निर्देशिका में टेराफॉर्म को आरंभ करता है। यह अनिवार्य रूप से टेराफॉर्म शुरू कर रहा है।
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>
एक बार यह पूरा हो जाने के बाद terraform plan
चलाना एक अच्छा विचार है जो यह देखने का एक तरीका है कि आपका टेराफॉर्म बिल्ड वास्तव में आपके क्लाउड वातावरण में कोई बदलाव किए बिना क्या करेगा। इस आउटपुट की सावधानीपूर्वक समीक्षा करें और सुनिश्चित करें कि आप जो देखते हैं वह आपकी अपेक्षा से मेल खाता है।
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>
अंत में, terraform apply
चलाने से कोड लिया जाता है और इसे आपके AWS खाते पर लागू किया जाता है। इसमें कुछ सेकंड से लेकर एक मिनट तक का समय लग सकता है, लेकिन यह पूरा होने पर आपको एक सफलता संदेश प्राप्त होना चाहिए। यदि आपको कोई त्रुटि मिलती है, तो त्रुटि की सावधानीपूर्वक समीक्षा करें। टेराफ़ॉर्म त्रुटियाँ आमतौर पर उच्च गुणवत्ता वाली होती हैं और ऐसे सुराग देती हैं जिन्हें समझने के लिए अधिक (यदि कोई हो) शोध की आवश्यकता नहीं होती है।
इस बिंदु पर, आपका स्प्लंक सर्वर संभवतः लॉग इन करने के लिए तैयार है (यूआई को स्प्लंक पर उपलब्ध होने में एक या दो मिनट लगते हैं)। स्प्लंक में लॉग इन करने के लिए, आपको तीन जानकारी की आवश्यकता होगी:
admin
हैSPLUNK-<instanceid>
होगाhttp://10.10.10.10:8000
)
हालांकि टेराफॉर्म से आईपी एड्रेस निकालना और इसे स्क्रिप्ट के आउटपुट के रूप में आप तक पहुंचाना या इस जानकारी को इकट्ठा करने के लिए एडब्ल्यूएस सीएलआई का उपयोग करना संभव है, हमने यहां सरलता के लिए ऐसा नहीं किया है। अपना आईपी पता और इंस्टेंस आईडी प्राप्त करने के लिए, आपको अपने AWS कंसोल में लॉग इन करना होगा।
सेवा मेनू में EC2 खोजें, फिर EC2 पर क्लिक करें, फिर इंस्टेंस (रनिंग) पर क्लिक करें। इस दृश्य में, आपको चल रहे EC2 उदाहरणों की एक सूची दिखाई देगी, जो केवल एक ही होनी चाहिए जब तक कि आपके पास अन्य मज़ेदार चीज़ें न चल रही हों।
सही उदाहरण (या केवल एक) पर क्लिक करें, और इस दृश्य में, आपको ऊपरी बाईं ओर "इंस्टेंस आईडी" दिखाई देगी, जिसे बाईं ओर कॉपी बटन पर क्लिक करके कॉपी किया जा सकता है, और दाईं ओर, आप अपना देखेंगे आईपी पता।
वह आईपी पता लें और अपनी पसंद के ब्राउज़र का उपयोग करके http://[instanceIP]:8000
टाइप करें और फिर एंटर दबाएं। आपको स्प्लंक लॉगिन देखना चाहिए - यदि आप नहीं देखते हैं, तो एक या दो मिनट और प्रतीक्षा करें - पहली बार लॉन्च होने में स्प्लंक को (वस्तुतः) 2-3 मिनट लगते हैं। username = admin
और password = SPLUNK-[instanceID]
याद रखें।
निर्माण करना बढ़िया है, और नई चीज़ें सीखना मज़ेदार है - जब आप मौज-मस्ती कर लें तो अपने क्लाउड संसाधनों को बंद करना भूल जाना बेकार है। टेराफॉर्म डिस्ट्रॉय, टेराफॉर्म अप्लाई के विपरीत कार्य करता है। यह टेराफॉर्म फ़ाइल में निर्दिष्ट बुनियादी ढांचे को नष्ट कर देता है। टेराफॉर्म डिस्ट्रॉय का उपयोग करने के लिए, जो आपको अभी करना चाहिए, अपनी कमांड लाइन पर वापस जाएं और terraform destroy
दर्ज करें। टेराफॉर्म डिस्ट्रॉय का सफल संचालन स्प्लंक यूआई की कमी (यह संभवतः आपको सूचित करेगा कि यह डिस्कनेक्ट हो गया है) और डिस्ट्रॉय कमांड के आउटपुट द्वारा भी नोट किया जाएगा।
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>
इस तरह के राक्षस ट्यूटोरियल के अंत तक इसे बनाना आसान नहीं है। यदि आप यहाँ तक पहुँचे हैं तो बधाई हो! यदि मुझसे कुछ छूट गया हो, जिसकी संभावना हो, तो क्षमा करें! इस बिंदु पर, इस नए कौशल के साथ काम करते रहना सार्थक होगा - अपनी टेराफ़ॉर्म स्क्रिप्ट को बदलें और अतिरिक्त भंडारण के लिए EC2 इंस्टेंस में एक EBS वॉल्यूम जोड़ें। दीर्घकालिक भंडारण के लिए S3 जोड़ें। वीएम में स्वचालित रूप से एसएसएच कुंजी जोड़ी जोड़ने का तरीका जानें ताकि आप इसमें एसएसएच कर सकें और यूआई का उपयोग कर सकें। मुख्य बात यह है कि हर दिन, थोड़ा सा ही सही, इसके साथ खेलते रहें।
जिस क्षण आप रुकते हैं, वही क्षण होता है जब आप धीरे-धीरे इस कौशल को खोना शुरू कर देते हैं।