Memahami penyedia Terraform - AWS Panduan Preskriptif

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memahami penyedia Terraform

Di Terraform, penyedia adalah plugin yang berinteraksi dengan penyedia cloud, alat pihak ketiga, dan API lainnya. Untuk menggunakan Terraform dengan AWS, Anda menggunakan AWS Penyedia, yang berinteraksi dengan sumber daya. AWS

Jika Anda belum pernah menggunakan AWS CloudFormation registri untuk memasukkan ekstensi pihak ketiga ke dalam tumpukan penerapan Anda, maka penyedia Terraform mungkin perlu membiasakan diri. Karena CloudFormation asli AWS, penyedia AWS sumber daya sudah ada secara default. Terraform, di sisi lain, tidak memiliki penyedia default tunggal, jadi tidak ada yang dapat diasumsikan tentang asal-usul sumber daya tertentu. Ini berarti bahwa hal pertama yang perlu dideklarasikan dalam file konfigurasi Terraform adalah persis ke mana sumber daya pergi dan bagaimana mereka akan sampai di sana.

Perbedaan ini menambahkan lapisan kompleksitas ekstra ke Terraform yang tidak ada dengannya. CloudFormation Namun, kompleksitas itu memberikan peningkatan fleksibilitas. Anda dapat mendeklarasikan beberapa penyedia dalam satu modul Terraform, dan kemudian sumber daya dasar yang dibuat dapat berinteraksi satu sama lain sebagai bagian dari lapisan penerapan yang sama.

Ini bisa berguna dalam berbagai cara. Penyedia tidak harus untuk penyedia cloud terpisah. Penyedia dapat mewakili sumber apa pun untuk sumber daya cloud. Misalnya, ambil Amazon Elastic Kubernetes Service (Amazon EKS). Saat Anda menyediakan klaster Amazon EKS, Anda mungkin ingin menggunakan bagan Helm untuk mengelola ekstensi pihak ketiga dan menggunakan Kubernetes sendiri untuk mengelola sumber daya pod. Karena AWS, Helm, dan Kubernetes semuanya memiliki penyedia Terraform sendiri, Anda dapat menyediakan dan mengintegrasikan semua sumber daya ini secara bersamaan dan kemudian meneruskan nilai di antara mereka.

Dalam contoh kode berikut untuk Terraform, AWS Provider membuat cluster Amazon EKS, dan kemudian informasi konfigurasi Kubernetes yang dihasilkan diteruskan ke penyedia Helm dan Kubernetes.

terraform { required_providers { aws = { source = "hashicorp/aws" version = ">= 4.33.0" } helm = { source = "hashicorp/helm" version = "2.12.1" } kubernetes = { source = "hashicorp/kubernetes" version = "2.26.0" } } required_version = ">= 1.2.0" } provider "aws" { region = "us-west-2" } resource "aws_eks_cluster" "example_0" { name = "example_0" role_arn = aws_iam_role.cluster_role.arn vpc_config { endpoint_private_access = true endpoint_public_access = true subnet_ids = var.subnet_ids } } locals { host = aws_eks_cluster.example_0.endpoint certificate = base64decode(aws_eks_cluster.example_0.certificate_authority.data) } provider "helm" { kubernetes { host = local.host cluster_ca_certificate = local.certificate # exec allows for an authentication command to be run to obtain user # credentials rather than having them stored directly in the file exec { api_version = "client.authentication.k8s.io/v1beta1" args = ["eks", "get-token", "--cluster-name", aws_eks_cluster.example_0.name] command = "aws" } } } provider "kubernetes" { host = local.host cluster_ca_certificate = local.certificate exec { api_version = "client.authentication.k8s.io/v1beta1" args = ["eks", "get-token", "--cluster-name", aws_eks_cluster.example_0.name] command = "aws" } }

Ada trade-off mengenai penyedia ketika datang ke dua alat IAc. Terraform sepenuhnya bergantung pada paket penyedia yang terletak di luar, yang merupakan mesin yang mendorong penerapannya. CloudFormation secara internal mendukung semua AWS proses utama. Dengan CloudFormation, Anda perlu khawatir tentang penyedia pihak ketiga hanya jika Anda ingin memasukkan ekstensi pihak ketiga. Ada pro dan kontra untuk setiap pendekatan. Mana yang tepat untuk Anda berada di luar cakupan panduan ini, tetapi penting untuk mengingat perbedaannya saat mengevaluasi kedua alat.

Menggunakan alias Terraform

Di Terraform, Anda dapat meneruskan konfigurasi khusus ke setiap penyedia. Jadi bagaimana jika Anda ingin menggunakan beberapa konfigurasi penyedia dalam modul yang sama? Dalam hal ini Anda harus menggunakan alias.  Alias membantu Anda memilih penyedia mana yang akan digunakan pada tingkat per sumber daya atau per modul. Bila Anda memiliki lebih dari satu instance dari penyedia yang sama, Anda menggunakan alias untuk menentukan instance non-default. Misalnya, instance penyedia default Anda mungkin spesifik Wilayah AWS, tetapi Anda menggunakan alias untuk menentukan wilayah alternatif.

Contoh Terraform berikut menunjukkan cara menggunakan alias untuk menyediakan bucket di berbeda. Wilayah AWS Wilayah default untuk penyedia adalahus-west-2, tetapi Anda dapat menggunakan alias timur untuk menyediakan sumber daya dius-east-2.

provider "aws" { region = "us-west-2" } provider "aws" { alias = "east" region = "us-east-2" } resource "aws_s3_bucket" "myWestS3Bucket" { bucket = "my-west-s3-bucket" } resource "aws_s3_bucket" "myEastS3Bucket" { provider = aws.east bucket = "my-east-s3-bucket" }

Bila Anda menggunakan alias bersama dengan provider meta-argumen, seperti yang ditunjukkan pada contoh sebelumnya, Anda dapat menentukan konfigurasi penyedia yang berbeda untuk sumber daya tertentu. Penyediaan sumber daya dalam beberapa Wilayah AWS dalam satu tumpukan hanyalah permulaan. Penyedia aliasing sangat nyaman dalam banyak hal.

Misalnya, sangat umum untuk menyediakan beberapa cluster Kubernetes sekaligus. Alias dapat membantu Anda mengonfigurasi penyedia Helm dan Kubernetes tambahan sehingga Anda dapat menggunakan alat pihak ketiga ini secara berbeda untuk berbagai sumber daya Amazon EKS. Contoh kode Terraform berikut menggambarkan cara menggunakan alias untuk melakukan tugas ini.

resource "aws_eks_cluster" "example_0" { name = "example_0" role_arn = aws_iam_role.cluster_role.arn vpc_config { endpoint_private_access = true endpoint_public_access = true subnet_ids = var.subnet_ids[0] } } resource "aws_eks_cluster" "example_1" { name = "example_1" role_arn = aws_iam_role.cluster_role.arn vpc_config { endpoint_private_access = true endpoint_public_access = true subnet_ids = var.subnet_ids[1] } } locals { host = aws_eks_cluster.example_0.endpoint certificate = base64decode(aws_eks_cluster.example_0.certificate_authority.data) host1 = aws_eks_cluster.example_1.endpoint certificate1 = base64decode(aws_eks_cluster.example_1.certificate_authority.data) } provider "helm" { kubernetes { host = local.host cluster_ca_certificate = local.certificate exec { api_version = "client.authentication.k8s.io/v1beta1" args = ["eks", "get-token", "--cluster-name", aws_eks_cluster.example_0.name] command = "aws" } } } provider "helm" { alias = "helm1" kubernetes { host = local.host1 cluster_ca_certificate = local.certificate1 exec { api_version = "client.authentication.k8s.io/v1beta1" args = ["eks", "get-token", "--cluster-name", aws_eks_cluster.example_1.name] command = "aws" } } } provider "kubernetes" { host = local.host cluster_ca_certificate = local.certificate exec { api_version = "client.authentication.k8s.io/v1beta1" args = ["eks", "get-token", "--cluster-name", aws_eks_cluster.example_0.name] command = "aws" } } provider "kubernetes" { alias = "kubernetes1" host = local.host1 cluster_ca_certificate = local.certificate1 exec { api_version = "client.authentication.k8s.io/v1beta1" args = ["eks", "get-token", "--cluster-name", aws_eks_cluster.example_1.name] command = "aws" } }