“Berinteraksi dengan Modul Terraform GCP”
Daftar Isi
Pengantar
Menggunakan modul dapat membantu mengurangi kesalahan ini. Misalnya, Anda dapat membuat modul untuk menjelaskan bagaimana semua bucket situs web publik organisasi Anda akan dikonfigurasi, dan modul lain untuk bucket pribadi yang digunakan untuk aplikasi logging. Juga, jika konfigurasi untuk jenis sumber daya perlu diperbarui, menggunakan modul memungkinkan Anda membuat pembaruan itu di satu tempat dan menerapkannya ke semua kasus di mana Anda menggunakan modul itu.
Persyaratan
- Aktifkan Cloud Shell
Apa itu Terraform module?
Modul Terraform adalah kumpulan file konfigurasi Terraform dalam satu direktori. Bahkan konfigurasi sederhana yang terdiri dari satu direktori dengan satu atau lebih file .tf adalah sebuah modul. Ketika Anda menjalankan perintah Terraform langsung dari direktori seperti itu, itu dianggap sebagai modul root. Jadi dalam pengertian ini, setiap konfigurasi Terraform adalah bagian dari sebuah modul. Anda mungkin memiliki satu set sederhana file konfigurasi Terraform seperti ini:
$ tree minimal-module/ . ├── LICENSE ├── README.md ├── main.tf ├── variables.tf ├── outputs.tf
Menggunakan modules dari Registry
Membuat Terraform configuration
- Clone modul dari registry
git clone https://github.com/terraform-google-modules/terraform-google-network cd terraform-google-network git checkout tags/v3.3.0 -b v3.3.0
- Buka Open Editor -> buka
terraform-google-network/examples/simple_project
, Buka main.tf
provider "google" { version = "~> 3.45.0" } provider "null" { version = "~> 2.1" } module "test-vpc-module" { source = "terraform-google-modules/network/google" version = "~> 3.2.0" project_id = var.project_id network_name = "my-custom-mode-network" mtu = 1460 subnets = [ { subnet_name = "subnet-01" subnet_ip = "10.10.10.0/24" subnet_region = "us-west1" }, { subnet_name = "subnet-02" subnet_ip = "10.10.20.0/24" subnet_region = "us-west1" subnet_private_access = "true" subnet_flow_logs = "true" }, { subnet_name = "subnet-03" subnet_ip = "10.10.30.0/24" subnet_region = "us-west1" subnet_flow_logs = "true" subnet_flow_logs_interval = "INTERVAL_10_MIN" subnet_flow_logs_sampling = 0.7 subnet_flow_logs_metadata = "INCLUDE_ALL_METADATA" } ] }
- Edit file
variables.tf
, ganti dengan project ID
variable "project_id" { description = "The project ID to host the network in" default = "FILL IN YOUR PROJECT ID HERE" } variable "network_name" { description = "The name of the VPC network being created" default = "example-vpc" }
- Untuk melihat project ID
gcloud config list --format 'value(core.project)'
- Edit output.tf
output "network_name" { value = module.test-vpc-module.network_name description = "The name of the VPC being created" } output "network_self_link" { value = module.test-vpc-module.network_self_link description = "The URI of the VPC being created" } output "project_id" { value = module.test-vpc-module.project_id description = "VPC project id" } output "subnets_names" { value = module.test-vpc-module.subnets_names description = "The names of the subnets being created" } output "subnets_ips" { value = module.test-vpc-module.subnets_ips description = "The IP and cidrs of the subnets being created" } output "subnets_regions" { value = module.test-vpc-module.subnets_regions description = "The region where subnets will be created" } output "subnets_private_access" { value = module.test-vpc-module.subnets_private_access description = "Whether the subnets will have access to Google API's without a public IP" } output "subnets_flow_logs" { value = module.test-vpc-module.subnets_flow_logs description = "Whether the subnets will have VPC flow logs enabled" } output "subnets_secondary_ranges" { value = module.test-vpc-module.subnets_secondary_ranges description = "The secondary ranges associated with these subnets" } output "route_names" { value = module.test-vpc-module.route_names description = "The routes associated with this VPC" }
Provide infrastructure
- Pada cloud shell berganti ke folder berikut
cd ~/terraform-google-network/examples/simple_project
- initialize
terraform init
- Buat VPC -> yes
terraform apply
Cara Membersihkan Infrastruktur
terraform destroy
Build module
Buat struktur modul seperti berikut :
$ tree minimal-module/ . ├── LICENSE ├── README.md ├── main.tf ├── variables.tf ├── outputs.tf
Buat Modul baru
- Buat folder dan file main.tf
cd ~ touch main.tf mkdir -p modules/gcs-static-website-bucket
- Buat beberapa file
cd modules/gcs-static-website-bucket touch website.tf touch variables.tf touch outputs.tf
- Buat file
README.md
# GCS static website bucket This module provisions Cloud Storage buckets configured for static website hosting.
- Buat File
LICENSE
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- Tambahkan code berikut pada website.tf
resource "google_storage_bucket" "bucket" { name = var.name project = var.project_id location = var.location storage_class = var.storage_class labels = var.labels force_destroy = var.force_destroy uniform_bucket_level_access = true versioning { enabled = var.versioning } dynamic "retention_policy" { for_each = var.retention_policy == null ? [] : [var.retention_policy] content { is_locked = var.retention_policy.is_locked retention_period = var.retention_policy.retention_period } } dynamic "encryption" { for_each = var.encryption == null ? [] : [var.encryption] content { default_kms_key_name = var.encryption.default_kms_key_name } } dynamic "lifecycle_rule" { for_each = var.lifecycle_rules content { action { type = lifecycle_rule.value.action.type storage_class = lookup(lifecycle_rule.value.action, "storage_class", null) } condition { age = lookup(lifecycle_rule.value.condition, "age", null) created_before = lookup(lifecycle_rule.value.condition, "created_before", null) with_state = lookup(lifecycle_rule.value.condition, "with_state", null) matches_storage_class = lookup(lifecycle_rule.value.condition, "matches_storage_class", null) num_newer_versions = lookup(lifecycle_rule.value.condition, "num_newer_versions", null) } } } }
- Tambahkan code berikut pada variables.tf
variable "name" { description = "The name of the bucket." type = string } variable "project_id" { description = "The ID of the project to create the bucket in." type = string } variable "location" { description = "The location of the bucket." type = string } variable "storage_class" { description = "The Storage Class of the new bucket." type = string default = null } variable "labels" { description = "A set of key/value label pairs to assign to the bucket." type = map(string) default = null } variable "bucket_policy_only" { description = "Enables Bucket Policy Only access to a bucket." type = bool default = true } variable "versioning" { description = "While set to true, versioning is fully enabled for this bucket." type = bool default = true } variable "force_destroy" { description = "When deleting a bucket, this boolean option will delete all contained objects. If false, Terraform will fail to delete buckets which contain objects." type = bool default = true } variable "iam_members" { description = "The list of IAM members to grant permissions on the bucket." type = list(object({ role = string member = string })) default = [] } variable "retention_policy" { description = "Configuration of the bucket's data retention policy for how long objects in the bucket should be retained." type = object({ is_locked = bool retention_period = number }) default = null } variable "encryption" { description = "A Cloud KMS key that will be used to encrypt objects inserted into this bucket" type = object({ default_kms_key_name = string }) default = null } variable "lifecycle_rules" { description = "The bucket's Lifecycle Rules configuration." type = list(object({ # Object with keys: # - type - The type of the action of this Lifecycle Rule. Supported values: Delete and SetStorageClass. # - storage_class - (Required if action type is SetStorageClass) The target Storage Class of objects affected by this Lifecycle Rule. action = any # Object with keys: # - age - (Optional) Minimum age of an object in days to satisfy this condition. # - created_before - (Optional) Creation date of an object in RFC 3339 (e.g. 2017-06-13) to satisfy this condition. # - with_state - (Optional) Match to live and/or archived objects. Supported values include: "LIVE", "ARCHIVED", "ANY". # - matches_storage_class - (Optional) Storage Class of objects to satisfy this condition. Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, STANDARD, DURABLE_REDUCED_AVAILABILITY. # - num_newer_versions - (Optional) Relevant only for versioned objects. The number of newer versions of an object to satisfy this condition. condition = any })) default = [] }
- Tambahkan code berikut pada output.tf
output "bucket" { description = "The created storage bucket" value = google_storage_bucket.bucket }
- Kembali ke root directory dan tambahkan code berikut pada main.tf
module "gcs-static-website-bucket" { source = "./modules/gcs-static-website-bucket" name = var.name project_id = var.project_id location = "us-east1" lifecycle_rules = [{ action = { type = "Delete" } condition = { age = 365 with_state = "ANY" } }] }
- Buat file beberapa file berikut pada root dir.
cd ~ touch outputs.tf tambahkan code output "bucket-name" { description = "Bucket names." value = "module.gcs-static-website-bucket.bucket" }
cd ~ touch variables.tf tambahkan code variable "project_id" { description = "The ID of the project in which to provision resources." type = string default = "FILL IN YOUR PROJECT ID HERE" } variable "name" { description = "Name of the buckets to create." type = string default = "FILL IN YOUR (UNIQUE) BUCKET NAME HERE" }
Install local module
terraform init terraform apply
Upload files ke bucket
- Download sample
cd ~ curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/master/modules/aws-s3-static-website-bucket/www/index.html > index.html curl https://raw.githubusercontent.com/hashicorp/learn-terraform-modules/blob/master/modules/aws-s3-static-website-bucket/www/error.html > error.html
- Copy ke bucket -> ganti dengan nama bucket
gsutil cp *.html gs://YOUR-BUCKET-NAME
- coba akses via browser
https://storage.cloud.google.com/YOUR-BUCKET-NAME/index.html
Clean up website dan infrastructure
terraform destroy
Penutup
Sahabat Blog Learning & Doing demikianlah penjelasan mengenai Berinteraksi dengan Modul Terraform GCP. Semoga Bermanfaat . Sampai ketemu lagi di postingan berikut nya