Hãy đối mặt với sự thật: một loạt bài gồm 3 phần về kỹ thuật như IaC có thể là một thách thức. Tôi chắc chắn rằng bạn đã bị kéo ra khỏi điều này một vài lần. Chuyển sang phần 3 thật thú vị - đó là lúc phần thú vị bắt đầu. Đó là cao su chạm vào thời điểm trên đường. Nếu bạn cảm thấy mình gần như không thể tiếp tục và nghi ngờ liệu mình có thể hoàn thành phần này hay không, có lẽ cũng tốt khi biết rằng hầu hết mọi người cũng cảm thấy như vậy. Rất ít người bước vào một thứ gì đó trừu tượng như thế này và thành công trong lần thử đầu tiên (hoặc lần thứ ba). Hãy bắt tay vào công việc!
Đối với lần triển khai đầu tiên này, hãy sử dụng thứ mà tất cả chúng ta đều biết tên, Splunk. Trong tập lệnh này, chúng tôi sẽ triển khai một máy chủ duy nhất đã được cài đặt và định cấu hình Splunk. Điều này sẽ sử dụng Hình ảnh máy Amazon (AMI). Có rất nhiều AMI để lựa chọn. Một số là hệ điều hành khác nhau, như Windows hoặc Linux; một số là các bản phân phối khác nhau của Linux, như Ubuntu, CentOS, v.v. và một số là các ứng dụng dựng sẵn như ứng dụng này.
Chúng tôi sẽ khởi động máy chủ Splunk EC2 ("phiên bản Splunk"), tạo quyền truy cập mạng để chỉ cho phép địa chỉ IP công cộng của bạn tiếp cận nó trên cổng TCP 8000 (cổng Splunk UI mặc định), sau đó hủy bỏ tất cả điều này bằng một Terraform đơn giản ra lệnh khi chúng tôi làm xong.
Tôi sẽ chia tệp terraform (main.tf) thành một vài phần nhỏ để chúng ta có thể dễ dàng xem qua từng phần hơn. Sau đó, cuối cùng, tôi sẽ tập hợp tất cả lại để chúng ta có thể thực hiện nó.
Trước khi chúng ta bắt đầu, điều quan trọng là bạn biết mình có thể đến đâu để tìm câu trả lời cho những câu hỏi mà tôi chưa xem xét ở đây. Ví dụ: khi bắt đầu xây dựng trong Terraform, tôi đã tự hỏi: "Làm cách nào để biết đối số nào (đây là cách bạn xác định tài nguyên, chẳng hạn như loại máy ảo trong phiên bản EC2 hoặc các giao thức xâm nhập được phép trong nhóm bảo mật) . Trong ví dụ này và đối với NHIỀU câu hỏi khác chưa được trả lời ở đây, bạn có thể truy cập sổ đăng ký Terraform để tìm hiểu thêm về các nhà cung cấp, tài nguyên, đối số và cú pháp có sẵn.
Ví dụ: trong sổ đăng ký, tôi có thể tìm tài nguyên "Nhóm bảo mật" (mà chúng tôi sẽ sử dụng trong hướng dẫn này), sau đó chuyển đến tab Đầu vào để xem tất cả các đối số có sẵn (họ gọi chúng là biến, FYI) sẽ là được phép khi chúng tôi định cấu hình tài nguyên. Được rồi...đi vòng hoàn tất, vào cấu hình triển khai TF đầu tiên của bạn!
Bước đầu tiên, chúng ta cần xác định nhà cung cấp mà chúng ta muốn sử dụng. Chúng tôi đang làm việc trên AWS nên nhà cung cấp sẽ là "AWS". Chúng tôi cũng sẽ xác định khu vực mà chúng tôi muốn làm việc ở đây.
provider "aws" { region = "us-west-1" }
Nếu bạn còn nhớ, tôi đã nói rằng chúng ta sẽ sử dụng Hình ảnh máy tuyệt vời (AMI) cho máy ảo (EC2). Ở đây, chúng tôi sử dụng từ khóa "data" Terraform để tìm kiếm tài nguyên "aws_ami.” Ngoài ra, chúng tôi đặt tên cho bất kỳ dữ liệu nào được trả về như một phần của tìm kiếm này - "Splunk." Điều này là để chúng tôi có thể tham chiếu dữ liệu này ở nơi khác trong mã của mình (hãy ghi nhớ điều này sau)...
Vì việc tìm kiếm bất kỳ thứ gì đều yêu cầu một số cách để giới hạn kết quả tìm kiếm chỉ ở những gì chúng tôi muốn tìm, nên chúng tôi sử dụng từ khóa bộ lọc và sau đó chuyển cho nó hai đối số, "tên" và "giá trị". Ở đây, chúng tôi hướng dẫn tìm kiếm "aws_ami" để tìm kiếm trường "name" cho bất kỳ thứ gì bắt đầu bằng "Splunk." Mặc dù điều này có thể cần được điều chỉnh để cụ thể hơn nhưng trong trường hợp này, bộ lọc này rất tốt.
data "aws_ami" "splunk" { most_recent = true filter { name = "name" values = ["splunk*"] } }
Trong AWS, quyền truy cập mạng vào tài nguyên thường được kiểm soát thông qua tài nguyên được gọi là " Nhóm bảo mật ." Trong ví dụ của chúng tôi, chúng tôi sẽ sử dụng một nhóm bảo mật cho phép cổng TCP 8000 vào ("xâm nhập") từ địa chỉ IP của tôi (hoặc của bạn, khi bạn tạo tập lệnh này). Bởi vì chúng tôi đang sử dụng Splunk trong tài khoản riêng tư với thông tin không nhạy cảm, Tôi sẽ cho phép nó giao tiếp ra bên ngoài ("egress"). Tuy nhiên, nếu đây là môi trường sản xuất, bạn sẽ cần xác định các phạm vi IP và cổng cần thiết và hạn chế quyền truy cập chỉ vào chúng để tuân theo các phương pháp hay nhất.
Lưu ý rằng tôi xác định các tham số xâm nhập, bao gồm giao thức và "cidr_blocks". Điều này rất quan trọng vì cấu hình sai ở đây có thể vô tình mở ra một môi trường cho Internet rộng hơn. Nếu bạn muốn tìm hiểu về cách cung cấp bảo mật mạng bổ sung cho môi trường AWS của mình, hãy cho tôi biết - Tôi có thể tạo một hướng dẫn về cách thêm Cân bằng tải ứng dụng ( ALB) vào cấu hình này để cung cấp các tính năng bảo mật bổ sung.
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"] } }
Cuối cùng, lý do tất cả chúng ta ở đây - máy ảo sẽ chạy Splunk. Như trường hợp của tất cả các phần khác của mã Terraform, chúng tôi bắt đầu bằng cách xác định tài nguyên, trong trường hợp này là "aws_instance" và đặt tên là "splunk_ec2", sau đó tiếp tục xác định các tham số khác bên dưới tài nguyên đó bằng các đối số.
Bạn có nhớ từ khóa "dữ liệu" mà chúng tôi đã sử dụng ở trên để tìm kiếm "aws_ami" cho AMI "Splunk*" gần đây nhất không? Chúng tôi có tên "Splunk". Ở đây, trong cấu hình phiên bản EC2, chúng ta có thể tham chiếu dữ liệu có trong truy vấn đó. Chúng tôi tham chiếu nó bằng cách sử dụng đối số "ami" và nói rằng nó bằng bất cứ thứ gì có trong "data.aws_ami.splunk.id". Đây là một khái niệm thực sự quan trọng cần hiểu, vì vậy hãy dành hai phút để phân tích nó:
Di chuyển xuống dưới, chúng tôi nói security_group cho EC2 này là nhóm bảo mật "splunksg" mà chúng tôi đã xác định ở trên. Điều này sử dụng logic tương tự như cách đặt tên "dữ liệu" AMI. IE, nó bắt đầu bằng tên tài nguyên, tên đối tượng mà chúng tôi đã xác định và sau đó là biến ".name", mà chúng tôi cũng đã xác định là " SplunkSecGroup ,” Ngoài ra, xin lưu ý rằng bạn có thể sử dụng instance_type của t2.micro cho việc này và nó hoạt động - nó chỉ rất chậm, vì vậy tôi chọn t2.medium.
Cuối cùng, chúng tôi áp dụng thẻ cho phiên bản này. Điều này rất hữu ích khi tài khoản AWS phát triển và việc theo dõi tài sản trở nên khó khăn hơn.
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" } }
Bây giờ, tôi biết bạn có thể bỏ qua phần này và đưa phần này vào hệ thống tệp rồi chạy nó và cảm thấy yên tâm với thế giới kể từ khi bạn "hoàn thành" phần hướng dẫn, nhưng đừng làm vậy. Đừng lười biếng thế. Giá trị của việc dành thời gian đọc và xây dựng cùng tôi nằm ở nỗi đau khi mắc sai lầm và niềm vui khi sửa chữa những sai lầm đó.
Kết hợp tất cả lại với nhau, chúng ta sẽ có một tập lệnh địa hình trông như thế này:
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" } }
Wow, nhìn kìa, 43 dòng mã! Nghe có vẻ nhiều, nhưng bạn đã hoàn thành nó - bạn có thể cập nhật, tạo, hủy hoặc chia sẻ nó!
Bởi vì chúng tôi đã thiết lập tất cả các phần cần thiết để thực hiện công việc này trong Phần 2 của Mở khóa IaC tại thời điểm này, tất cả những gì cần thiết là lưu tệp với phần mở rộng chính xác (hãy sử dụng main.tf).
Mở CMD hoặc PowerShell với tư cách quản trị viên (CTRL+SHIFT+CLICK hoặc nhấp chuột phải và “chạy dưới dạng…”), “CD” hoặc thay đổi thư mục vào cùng vị trí với tệp chúng ta vừa tạo (main.tf) và đưa ra thông báo sau lệnh:
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
khởi tạo Terraform trong thư mục đó. Điều này thực chất là khởi động 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>
Sau khi hoàn tất, bạn nên chạy terraform plan
, đây là một phương pháp để xem bản dựng Terraform của bạn sẽ làm gì mà không thực sự thực hiện bất kỳ thay đổi nào đối với môi trường đám mây của bạn. Hãy xem xét cẩn thận kết quả này và đảm bảo những gì bạn thấy phù hợp với những gì bạn mong đợi.
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>
Cuối cùng, việc chạy terraform apply
sẽ lấy mã và áp dụng mã đó vào tài khoản AWS của bạn. Quá trình này có thể mất vài giây đến một phút nhưng bạn sẽ nhận được thông báo thành công sau khi hoàn tất. Nếu bạn gặp bất kỳ lỗi nào, hãy xem xét cẩn thận lỗi đó. Lỗi Terraform thường có chất lượng cao và sẽ đưa ra manh mối mà không cần nghiên cứu nhiều (nếu có) để hiểu.
Tại thời điểm này, máy chủ Splunk của bạn có thể đã sẵn sàng để đăng nhập (phải mất một hoặc hai phút để giao diện người dùng có sẵn trên Splunk). Để đăng nhập vào Splunk, bạn sẽ cần ba thông tin:
admin
SPLUNK-<instanceid>
http://10.10.10.10:8000
)
Mặc dù có thể trích xuất địa chỉ IP từ Terraform và gửi nó cho bạn dưới dạng ĐẦU RA của tập lệnh hoặc sử dụng AWS CLI để thu thập thông tin này, nhưng chúng tôi không làm điều đó ở đây vì mục đích đơn giản. Để có được địa chỉ IP và ID phiên bản, bạn sẽ cần đăng nhập vào bảng điều khiển AWS của mình.
Tìm kiếm EC2 trong menu dịch vụ, sau đó nhấp vào EC2, sau đó nhấp vào Phiên bản (đang chạy). Ở chế độ xem này, bạn sẽ thấy danh sách các phiên bản EC2 đang chạy. Đây chỉ là một danh sách trừ khi bạn có nội dung thú vị khác đang diễn ra.
Nhấp vào phiên bản chính xác (hoặc phiên bản duy nhất) và trong chế độ xem này, bạn sẽ thấy “ID phiên bản” phía trên bên trái, có thể được sao chép bằng cách nhấp vào nút sao chép ở bên trái và ở bên phải, bạn sẽ thấy Địa chỉ IP.
Lấy địa chỉ IP đó và sử dụng trình duyệt bạn chọn, nhập http://[instanceIP]:8000
rồi nhấn enter. Bạn sẽ thấy thông tin đăng nhập Splunk - nếu không, hãy đợi thêm một hoặc hai phút nữa - Splunk mất (theo nghĩa đen) 2-3 phút để khởi chạy lần đầu tiên. Hãy nhớ username = admin
và password = SPLUNK-[instanceID]
.
Việc xây dựng là điều tuyệt vời và việc học những nội dung mới cũng rất thú vị - quên tắt tài nguyên đám mây của bạn khi bạn đã vui chơi xong thật tệ. Việc phá hủy Terraform thực hiện ngược lại việc áp dụng terraform. Nó phá bỏ cơ sở hạ tầng được chỉ định trong tệp terraform. Để sử dụng tính năng hủy terraform mà bạn nên làm ngay bây giờ, hãy quay lại dòng lệnh của bạn và nhập terraform destroy
. Việc chạy terraform destroy thành công sẽ được ghi nhận là do thiếu Splunk UI (nó có thể sẽ thông báo cho bạn rằng nó bị ngắt kết nối) và cũng do đầu ra của lệnh hủy.
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>
Để hoàn thành phần hướng dẫn về quái vật như thế này không phải là điều dễ dàng. Xin chúc mừng nếu bạn đã làm được điều này! Nếu tôi bỏ lỡ điều gì đó, rất có thể, xin lỗi! Tại thời điểm này, bạn nên tiếp tục thử nghiệm kỹ năng mới tìm thấy này - thay đổi tập lệnh địa hình của mình và thêm ổ đĩa EBS vào phiên bản EC2 để có thêm dung lượng lưu trữ. Thêm S3 để lưu trữ lâu dài. Tìm hiểu cách tự động thêm cặp khóa SSH vào VM để bạn có thể SSH vào đó và sử dụng giao diện người dùng. Điều quan trọng là tiếp tục chơi đùa với điều này mỗi ngày, dù chỉ một chút.
Thời điểm bạn dừng lại là thời điểm bạn bắt đầu mất đi kỹ năng này một cách chậm rãi.