Friday, November 22, 2024

[AWS] Kết nối AWS với Terraform

-

Kết nối Terraform với AWS dùng để quản lý và tự động hóa quá trình cấu hình và quản lý tài nguyên trên AWS. Bạn có thể sử dụng Terraform để:

  • Tạo và quản lý các tài nguyên AWS như EC2 instances, RDS databases, v.v.
  • Cấu hình và quản lý các dịch vụ AWS như VPC, security groups, v.v.
  • Tự động hóa việc cấu hình và quản lý tài nguyên trên AWS bằng cách sử dụng các pipeline CI/CD.
  • Quản lý các tài nguyên trên AWS theo cách dễ dàng và dễ quản lý hơn bằng cách sử dụng code thay vì dùng giao diện web AWS.
  • Dễ dàng quản lý và theo dõi các thay đổi trong cấu hình và tài nguyên trên AWS bằng cách sử dụng version control và state file.

Để kết nối Terraform với AWS bạn cần 2 thông tin của AWS đó là AWS Access Key ID và AWS Secret Access Key. Vậy AWS Access Key ID và AWS Secret Access Key là hai chuỗi định danh mà AWS cung cấp cho bạn để xác thực với AWS.

  • AWS Access Key ID là một chuỗi định danh duy nhất để xác định tài khoản AWS của bạn.
  • AWS Secret Access Key là một chuỗi bí mật được sử dụng kết hợp với AWS Access Key ID để xác thực với AWS.

Bạn cần sử dụng cả hai thông tin này để thực hiện các yêu cầu đến AWS từ AWS CLI hoặc bất kỳ công cụ khác sử dụng API của AWS. Hãy cẩn thận khi quản lý và bảo vệ AWS Secret Access Key của bạn, vì nếu ai đó có thể truy cập vào nó, họ có thể truy cập vào tài khoản AWS của bạn mà không cần sự cho phép của bạn.

Bạn có thể sử dụng AWS Access Key ID và AWS Secret Access Key để truy cập vào các dịch vụ AWS từ bất kỳ nơi nào, bao gồm các công cụ bên ngoài như AWS CLI, SDK, hoặc API. Nó cũng cung cấp một cấp độ bảo mật cao cho việc truy cập vào tài nguyên AWS của bạn, bằng cách yêu cầu xác thực với AWS cho mỗi yêu cầu truy cập.

Ngoài ra, bạn có thể sử dụng AWS IAM (Identity and Access Management) để quản lý quyền truy cập của người dùng hoặc hệ thống đến tài nguyên AWS của bạn. Bằng cách sử dụng IAM, bạn có thể đảm bảo rằng chỉ có những người dùng hoặc hệ thống mà bạn cho phép mới có thể truy cập vào tài nguyên AWS của bạn.

Có 2 cách để kết nối Terraform với AWS:

  • Sử dụng AWS CLI: Bạn cần phải cài đặt AWS CLI và cấu hình truy cập tài khoản AWS của bạn bằng AWS Access Key ID và AWS Secret Access Key. Sau đó, bạn có thể sử dụng lệnh aws configure để cấu hình truy cập.
  • Sử dụng credentials file: Bạn có thể tạo một tập tin credentials trong thư mục của máy chủ Terraform với nội dung sau:
provider "aws" {
  access_key = "ACCESS_KEY"
  secret_key = "SECRET_KEY"
  region     = "REGION"
}

Trong đó, ACCESS_KEY và SECRET_KEY là AWS Access Key ID và AWS Secret Access Key của bạn, và REGION là vùng AWS mà bạn muốn sử dụng. Bạn cần phải chỉ định tập tin này trong file terraform với lệnh provider “aws” {}.

Sau khi kết nối Terraform với AWS, bạn có thể sử dụng các resource của Terraform để tạo và quản lý các tài nguyên trong AWS. Ví dụ, bạn có thể tạo một EC2 instance bằng cách sử dụng những dòng code sau:

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

Ví dụ file main.tf đầy đủ của mình sẽ là.

cat > ./main << 'OEF'
# Configure the AWS provider
provider "aws" {
  access_key = "AKIA5NMGK2KJKLSNNCLA"
  secret_key = "yxMj2h85Fh/Wo9xpCpUJMFpIcJIdsncDJASKCJLj"
  region = "us-east-1"
}

# Create an EC2 instance
resource "aws_instance" "example" {
  ami           = "ami-0aa7d40eeae50c9a9"
  instance_type = "t2.micro"
}
OEF

Sau khi tạo file main.tf thành công, bạn có thể sử dụng lệnh terraform init, lệnh này trong Terraform được sử dụng để khởi tạo một environment Terraform trong thư mục hiện tại.

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Using previously-installed hashicorp/aws v4.52.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.

Sau đó sử dụng lệnh terraform plan, lệnh này trong Terraform được sử dụng để xem một bản dự toán của các thay đổi mà Terraform sẽ thực hiện trên infrastructure. Nó tạo ra một bản đồ dự kiến của tình trạng mới của infrastructure sau khi Terraform được áp dụng.

$ 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.example will be created
  + resource "aws_instance" "example" {
      + ami                                  = "ami-0aa7d40eeae50c9a9"
      + arn                                  = (known after apply)
      + associate_public_ip_address          = (known after apply)
      + 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                        = "t2.micro"
      + 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)
            }
        }

      + 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)
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Sau khi viết code, bạn có thể sử dụng lệnh terraform apply để tạo các tài nguyên trong AWS. Bạn cũng có thể sử dụng lệnh terraform show để hiển thị các tài nguyên được quản lý bởi Terraform hoặc sử dụng lệnh terraform destroy để xóa các tài nguyên.

Lưu ý: Việc sử dụng Terraform với AWS còn có một số điểm quan trọng cần lưu ý:

  • Sử dụng version control: Dùng Git hoặc công cụ version control khác để quản lý các thay đổi trong code Terraform của bạn.
  • Quản lý state file: State file của Terraform lưu trữ trạng thái hiện tại của tài nguyên được quản lý bởi Terraform. Để tránh rủi ro, hãy lưu trữ state file trên một nơi an toàn và dùng lệnh terraform state để quản lý state file.
  • Áp dụng best practices: Sử dụng các best practices để viết code Terraform, ví dụ, sử dụng modules để tái sử dụng code và quản lý các tài nguyên theo nhóm.
  • Sử dụng tài nguyên tối ưu: Chọn tài nguyên AWS phù hợp với nhu cầu của bạn và sử dụng tài nguyên tối ưu để tiết kiệm chi phí.
  • Đồng bộ hóa với pipeline: Kết hợp Terraform với các pipeline như CI/CD để tự động hóa quá trình deploy và quản lý tài nguyên.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories