paint-brush
IaC পার্ট 3 আনলক করা: আপনার প্রথম টেরাফর্ম স্থাপনা!দ্বারা@chrisray
556 পড়া
556 পড়া

IaC পার্ট 3 আনলক করা: আপনার প্রথম টেরাফর্ম স্থাপনা!

দ্বারা Chris Ray55m2023/09/30
Read on Terminal Reader
Read this story w/o Javascript

অতিদীর্ঘ; পড়তে

টেরাফর্মের সাথে নির্মাণের জন্য সেটআপ করা কঠিন! পার্ট 3-এ আমরা ব্যবসায় নেমে পড়ি এবং Terraform ব্যবহার করে AWS-এ একটি স্প্লঙ্ক সার্ভার তৈরি করি।
featured image - IaC পার্ট 3 আনলক করা: আপনার প্রথম টেরাফর্ম স্থাপনা!
Chris Ray HackerNoon profile picture
0-item


চল মজা করি!

আসুন এটির মুখোমুখি হই: IaC এর মতো প্রযুক্তিগত কিছুতে একটি 3 অংশের সিরিজ একটি চ্যালেঞ্জ হতে পারে। আমি নিশ্চিত যে আপনি এখন পর্যন্ত এই মুষ্টিমেয় বার থেকে দূরে সরে গেছেন। এটিকে 3 ভাগে করা উত্তেজনাপূর্ণ - এটি যখন মজার অংশ শুরু হয়। এটা রাবার রাস্তার মুহূর্তে আঘাত. আপনি যদি মনে করেন যে আপনি সবেমাত্র ঝুলে আছেন এবং সন্দেহ করেন যে আপনি এই অংশটি শেষ করতে পারবেন, তবে এটি সম্ভবত জেনে রাখা ভাল যে বেশিরভাগ লোকেরাও এমন মনে করেন। খুব কম লোকই এর মতো বিমূর্ত কিছুতে প্রবেশ করে এবং প্রথম চেষ্টায় (বা তৃতীয়) পেরেক দেয়। চলো ব্যবসায় নামা যাক!

এই প্রথম স্থাপনার জন্য, আসুন এমন কিছু ব্যবহার করি যা আমরা সবাই নামে পরিচিত, স্প্লঙ্ক। এই স্ক্রিপ্টে, আমরা একটি একক সার্ভার স্থাপন করব যা স্প্লঙ্ক ইতিমধ্যে ইনস্টল এবং কনফিগার করা আছে। এটি একটি অ্যামাজন মেশিন ইমেজ (AMI) ব্যবহার করবে। বাছাই করার জন্য অনেক AMI আছে। কিছু ভিন্ন ওএস, যেমন উইন্ডোজ বা লিনাক্স; কিছু লিনাক্সের বিভিন্ন ডিস্ট্রো, যেমন উবুন্টু, সেন্টোস, ইত্যাদি, এবং কিছু এইরকম প্রি-বিল্ট অ্যাপ্লিকেশন।


আমরা Splunk EC2 সার্ভার ("Splunk instance") স্পিন আপ করব, TCP পোর্ট 8000 (ডিফল্ট স্প্লঙ্ক UI পোর্ট) তে শুধুমাত্র আপনার পাবলিক আইপি অ্যাড্রেস পৌঁছানোর অনুমতি দেওয়ার জন্য নেটওয়ার্ক অ্যাক্সেস তৈরি করব এবং তারপরে একটি সাধারণ টেরাফর্মের সাহায্যে এই সমস্ত ধ্বংস করব। আমাদের কাজ শেষ হলে আদেশ করুন।


আমি একক টেরাফর্ম ফাইল (main.tf) কে কয়েকটি ছোট খণ্ডে ভেঙ্গে দেব যাতে আমরা প্রতিটি অংশের মধ্য দিয়ে আরও সহজে চলতে পারি। তারপর, শেষে, আমি এটি সব একসাথে রাখব যাতে আমরা এটি কার্যকর করতে পারি।

টেরাফর্ম জমিতে কীভাবে নিজেরাই জিনিসগুলি বের করবেন

আমরা শুরু করার আগে, আমি এখানে বিবেচনা করিনি এমন প্রশ্নের উত্তর খুঁজতে আপনি কোথায় যেতে পারেন তা জেনে রাখা গুরুত্বপূর্ণ। উদাহরণ স্বরূপ, আমি যখন টেরাফর্মে নির্মাণ শুরু করি, তখন আমি অবাক হয়েছিলাম, "আমি কীভাবে জানব কী আর্গুমেন্ট (এইভাবে আপনি সংস্থানগুলিকে সংজ্ঞায়িত করেন, যেমন EC2 উদাহরণে ভার্চুয়াল মেশিনের ধরন বা নিরাপত্তা গোষ্ঠীতে প্রবেশের প্রোটোকল অনুমোদিত) এই উদাহরণে, এবং অন্যান্য অনেক প্রশ্নের জন্য এখানে উত্তর দেওয়া হয়নি, আপনি উপলব্ধ প্রদানকারী, সংস্থান, আর্গুমেন্ট এবং সিনট্যাক্স সম্পর্কে আরও জানতে Terraform রেজিস্ট্রিতে যেতে পারেন।


উদাহরণস্বরূপ, রেজিস্ট্রিতে, আমি গিয়ে "সিকিউরিটি গ্রুপ" রিসোর্সটি খুঁজে পেতে পারি (যেটি আমরা এই টিউটোরিয়ালটিতে ব্যবহার করব), তারপর সমস্ত উপলব্ধ আর্গুমেন্ট দেখতে ইনপুট ট্যাবে যান (তারা তাদের ভেরিয়েবল বলে, FYI) যা হবে আমরা যখন সম্পদ কনফিগার করি তখন অনুমতি দেওয়া হয়। ঠিক আছে...ভ্রমণ সম্পূর্ণ, আপনার প্রথম TF স্থাপনার কনফিগারেশনে!

Terraform সঙ্গে বিল্ডিং

প্রথম ধাপে, আমরা যে প্রদানকারীকে ব্যবহার করতে চাই তা নির্ধারণ করতে হবে। আমরা AWS-এ কাজ করছি, তাই প্রদানকারী হবে "AWS।" আমরা যে অঞ্চলটি এখানেও কাজ করতে চাই তাও সংজ্ঞায়িত করব।


 provider "aws" { region = "us-west-1" }


যদি আপনার মনে থাকে, আমি বলেছিলাম যে আমরা একটি ভার্চুয়াল মেশিন (EC2) এর জন্য একটি আশ্চর্যজনক মেশিন ইমেজ (AMI) ব্যবহার করতে যাচ্ছি। এখানে, আমরা "aws_ami" রিসোর্সে গিয়ে অনুসন্ধান করতে Terraform "data" কীওয়ার্ড ব্যবহার করি। উপরন্তু, এই অনুসন্ধানের অংশ হিসাবে যা কিছু ডেটা ফেরত দেওয়া হয় তা আমরা একটি নাম দিয়ে থাকি - "Splunk।" এটি যাতে আমরা আমাদের কোডের অন্য কোথাও এই ডেটা উল্লেখ করতে পারি (এটি পরে মনে রাখবেন)...


যেহেতু কিছু অনুসন্ধান করার জন্য অনুসন্ধানের ফলাফলগুলিকে শুধুমাত্র আমরা যা খুঁজতে চাই তার মধ্যে সীমাবদ্ধ করার জন্য কিছু উপায় প্রয়োজন, তাই আমরা ফিল্টার কীওয়ার্ড ব্যবহার করি এবং তারপরে এটি দুটি আর্গুমেন্ট পাস করি, "নাম" এবং "মান।" এখানে, আমরা "aws_ami"-এর অনুসন্ধানকে নির্দেশ দিচ্ছি "Splunk" দিয়ে শুরু হওয়া যেকোনো কিছুর জন্য "নাম" ক্ষেত্রটি অনুসন্ধান করতে৷ যদিও এটিকে আরও নির্দিষ্ট করার জন্য টিউন করা প্রয়োজন, এই ক্ষেত্রে, এই ফিল্টারটি ভাল৷


 data "aws_ami" "splunk" { most_recent = true filter { name = "name" values = ["splunk*"] } }


AWS-এ, সংস্থানগুলিতে নেটওয়ার্ক অ্যাক্সেস প্রায়শই " নিরাপত্তা গ্রুপ " নামক একটি সংস্থানের মাধ্যমে নিয়ন্ত্রিত হয়। আমাদের উদাহরণে, আমরা একটি নিরাপত্তা গোষ্ঠী ব্যবহার করব যা আমার আইপি ঠিকানা থেকে (বা আপনার, যখন আপনি এই স্ক্রিপ্টটি তৈরি করেন) থেকে TCP পোর্ট 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"] } }


অবশেষে, আমরা এখানে সব কারণ - ভার্চুয়াল মেশিন যে Splunk চালানো হবে. টেরাফর্ম কোডের অন্যান্য সমস্ত অংশের ক্ষেত্রে, আমরা একটি সংস্থান সংজ্ঞায়িত করে শুরু করি, এই ক্ষেত্রে, "aws_instance," এবং এটিকে "splunk_ec2" নামকরণ করে, তারপর আর্গুমেন্ট ব্যবহার করে এর নীচে অন্যান্য প্যারামিটারগুলিকে সংজ্ঞায়িত করতে যান।


সাম্প্রতিক "Splunk*" AMI-এর জন্য "aws_ami" অনুসন্ধান করতে আমরা উপরে যে "ডেটা" কীওয়ার্ডটি ব্যবহার করেছি তা মনে আছে? আমরা "Splunk" নাম আছে. এখানে, EC2 ইনস্ট্যান্স কনফিগারেশনে, আমরা সেই প্রশ্নের মধ্যে থাকা ডেটা উল্লেখ করতে পারি। আমরা এটিকে "ami" যুক্তি ব্যবহার করে উল্লেখ করি এবং বলি যে এটি "data.aws_ami.splunk.id"-এ যা আছে তার সমান। এটি বোঝার জন্য সত্যিই একটি গুরুত্বপূর্ণ ধারণা, তাই আসুন এটিকে ভেঙে ফেলার জন্য দুই মিনিট ব্যয় করি:


  1. " data.aws_ami. " আমরা উপরে তৈরি করা কোডের ব্লকে ডেটা কীওয়ার্ড উল্লেখ করছে।
  2. " splunk.id " আমরা এই ডেটাটি যে নাম দিয়েছি তা উল্লেখ করে, "Splunk," যখন শেষ অংশটি, "id," AMI আইডি উল্লেখ করে যা "ডেটা" কোয়েরি দ্বারা ফেরত দেওয়া হয়। এএমআই আইডি এমন একটি স্ট্রিং যা মানুষ সহজে মনে রাখে না কিন্তু মেশিনের জন্য অনন্য এবং ব্যবহার করা সহজ।


নীচে সরে গিয়ে, আমরা বলি এই EC2-এর নিরাপত্তা_গ্রুপ হল "splunksg" নিরাপত্তা গ্রুপ যা আমরা উপরে সংজ্ঞায়িত করেছি। এটি AMI "ডেটা" নামকরণের মতো একই যুক্তি ব্যবহার করে। IE, এটি রিসোর্সের নাম দিয়ে শুরু হয়, আমাদের সংজ্ঞায়িত বস্তুর নাম এবং তারপরে ".name" ভেরিয়েবল, যাকে আমরা " SplunkSecGroup " হিসাবেও সংজ্ঞায়িত করেছি, এছাড়াও মনে রাখবেন, আপনি এর জন্য t2.micro-এর instance_type ব্যবহার করতে পারেন, এবং এটি কাজ করে - এটা খুব ধীর, তাই আমি একটি 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 ব্যবহার করি)।


প্রশাসক হিসাবে CMD বা PowerShell খুলুন (CTRL+SHIFT+CLICK বা রাইট ক্লিক করুন এবং “Run as…”), “CD” বা ডাইরেক্টরীটিকে একই স্থানে পরিবর্তন করুন যে ফাইলটি আমরা তৈরি করেছি (main.tf) এবং নিম্নলিখিত ইস্যু করুন আদেশ:

Terraform INIT


 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 সেই ডিরেক্টরিতে Terraform আরম্ভ করে। এটি মূলত Terraform শুরু করছে।


টেরাফর্ম পরিকল্পনা


 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 চালানো একটি ভাল ধারণা যা আপনার ক্লাউড পরিবেশে কোনও পরিবর্তন না করেই আপনার টেরাফর্ম বিল্ড কী করবে তা দেখার একটি পদ্ধতি। এই আউটপুটটি যত্ন সহকারে পর্যালোচনা করুন এবং নিশ্চিত করুন যে আপনি যা দেখেন তা আপনার প্রত্যাশার সাথে মিলে যায়।

Terraform প্রযোজ্য


 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 অ্যাকাউন্টে প্রয়োগ করে। এটি এক মিনিট পর্যন্ত কয়েক সেকেন্ড সময় নিতে পারে, তবে এটি হয়ে গেলে আপনি একটি সফল বার্তা পাবেন৷ আপনি যদি কোনো ত্রুটি পান, সাবধানে ত্রুটি পর্যালোচনা. টেরাফর্ম ত্রুটিগুলি সাধারণত উচ্চ মানের হয় এবং সেগুলি এমন ক্লু দেয় যা বোঝার জন্য খুব বেশি (যদি থাকে) গবেষণার প্রয়োজন হয় না৷

স্প্লঙ্ক লগইন

এই মুহুর্তে, আপনার স্প্লঙ্ক সার্ভার সম্ভবত লগ ইন করার জন্য প্রস্তুত (এটি স্প্লঙ্কে UI উপলব্ধ হতে এক বা দুই মিনিট সময় নেয়)। স্প্লঙ্কে লগ ইন করতে, আপনার তিনটি তথ্যের প্রয়োজন হবে:

  1. ব্যবহারকারীর নাম, যা admin
  2. পাসওয়ার্ড, যা হবে SPLUNK-<instanceid>
  3. AWS-এ এই EC2 উদাহরণের জন্য IP ঠিকানা এবং পোর্ট (যেমন http://10.10.10.10:8000 )


যদিও Terraform থেকে IP ঠিকানা বের করা সম্ভব এবং এটি স্ক্রিপ্টের একটি আউটপুট হিসাবে আপনার কাছে বিতরণ করা বা এই তথ্য সংগ্রহ করতে AWS CLI ব্যবহার করা সম্ভব, আমরা সরলতার জন্য এখানে তা করিনি। আপনার আইপি ঠিকানা এবং ইনস্ট্যান্স আইডি পেতে, আপনাকে আপনার AWS কনসোলে লগ ইন করতে হবে।


পরিষেবা মেনুতে EC2 অনুসন্ধান করুন, তারপরে EC2 ক্লিক করুন, তারপরে ইনস্ট্যান্সে ক্লিক করুন (চলমান)৷ এই দৃশ্যে, আপনি চলমান EC2 দৃষ্টান্তগুলির একটি তালিকা দেখতে পাবেন, যেটি শুধুমাত্র একটি হওয়া উচিত যদি না আপনার অন্যান্য মজার জিনিসগুলি চলছে।

সঠিক দৃষ্টান্তে ক্লিক করুন (বা একমাত্র) এবং এই দৃশ্যে, আপনি উপরের বাম দিকে দেখতে পাবেন “ইনস্ট্যান্স আইডি”, যা বাম দিকে কপি বোতামে ক্লিক করে কপি করা যেতে পারে এবং ডানদিকে, আপনি দেখতে পাবেন আপনার আইপি ঠিকানা.


সেই আইপি ঠিকানাটি নিন এবং আপনার পছন্দের ব্রাউজার ব্যবহার করে http://[instanceIP]:8000 টাইপ করুন তারপর এন্টার টিপুন। আপনার স্প্লঙ্ক লগইন দেখতে হবে - যদি আপনি না করেন তবে আরও এক বা দুই মিনিট অপেক্ষা করুন - স্প্লঙ্ক প্রথমবার চালু হতে (আক্ষরিক অর্থে) 2-3 মিনিট সময় নেয়। username = admin এবং password = SPLUNK-[instanceID]


টেরাফর্ম ধ্বংস

বিল্ডিং দুর্দান্ত, এবং নতুন জিনিস শেখা মজার - আপনার ক্লাউড রিসোর্স বন্ধ করতে ভুলে যাওয়া যখন আপনি মজা করছেন। টেরাফর্ম ধ্বংস টেরাফর্ম প্রয়োগের বিপরীত সঞ্চালন করে। এটি টেরাফর্ম ফাইলে উল্লিখিত অবকাঠামো নষ্ট করে দেয়। টেরাফর্ম ধ্বংস ব্যবহার করতে, যা আপনার এখনই উচিত, আপনার কমান্ড লাইনে ফিরে যান এবং terraform destroy লিখুন। টেরাফর্ম ধ্বংসের একটি সফল রান স্প্লঙ্ক UI এর অভাব দ্বারা লক্ষ্য করা যাবে (এটি সম্ভবত আপনাকে বিচ্ছিন্ন বলে জানিয়ে দেবে) এবং ধ্বংস কমান্ডের আউটপুট দ্বারাও।


 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 যোগ করুন। ভিএম-এ কীভাবে স্বয়ংক্রিয়ভাবে একটি SSH কী জোড়া যুক্ত করবেন তা বের করুন যাতে আপনি এতে SSH করতে পারেন এবং UI ব্যবহার করতে পারেন। মূল জিনিসটি প্রতিদিন এটি নিয়ে খেলা চালিয়ে যাওয়া, এমনকি কিছুটা।


আপনি যে মুহূর্তটি থামবেন সেই মুহূর্তটি আপনি ধীরে ধীরে এই দক্ষতা হারাতে শুরু করবেন।