Introducció a IBM Cloudability Governance
IBM Cloudability Governance és una eina que permet realitzar estimacions de costos basades en infraestructura definida com a codi amb Terraform. Aquesta eina ajuda a preveure els costos associats als recursos que es van a aprovisionar al núvol, facilitant la gestió i optimització de la despesa en serveis cloud, i anticipar-nos (shift-left) a possibles sobrecostos no desitjats.
A continuació s’adjunten enllaços d’interès de la documentació oficial de Cloudability en el seu Centre de Suport o Help Center Cloudability CostGuard Documentation, la qual s’anirà actualitzant per part del fabricant a mesura que s’afegeixin noves funcionalitats a l’eina. En aquest altre enllaç també es pot trobar informació sobre la Configuració de IBM Cloudability Governance.
Integració IBM Cloudability Governance en els workflows d’IaC a SIC+
El workflow de CI en moment de Pull Request (PR) a la branca develop/release dels workflows d’infraestructura a SIC+, s’ha actualitzat per incloure un pas que executa l’acció de CostGuard de Cloudability. Aquesta acció analitza els fitxers de Terraform i el fitxer usage.yaml
(si està present) per generar una estimació de costos basada en els recursos i consums definits.
El pas afegit al workflow de CI és el següent:
- name: Cloudability Governance Cost Estimation, Policy Evaluation and Recommendations
uses: ctti-actions/cloudability-governance@v1
with:
fd_url: ${{ env.APPTIO_FD_URL }}
fd_public_key: ${{ env.APPTIO_FD_KEY }}
fd_secret_key: ${{ env.APPTIO_FD_SECRET }}
github_token: ${{ secrets.GITHUB_TOKEN }}
pr_number: ${{ github.event.pull_request.number }}
cloudability_host: ${{ env.APPTIO_CLOUDABILITY_HOST }}
fd_env_id: ${{ env.APPTIO_FD_ENV_ID }}
deployment_name: ${{ github.event.repository.name }}
cloud: ${{ env.CLOUD }}
aws_account_id: ${{ env.AWS_ACCOUNT_ID }}
tf_plan: "${{ env.TF_ROOT }}/tfplan.json"
continue-on-error: true
Aquest pas s’encarregarà d’interactuar amb IBM Cloudability Governance per enviar la configuració de Terraform amb el fitxer tfplan.json
generat prèviament i l’arxiu usage.yaml
(si està present) i obtenir una estimació de costos referent a aquest pla de Terraform. El resultat serà afegit com a comentari en el PR associat a l’execució del workflow. En aquest comentari s’adjuntarà una taula a mode de resum del cost dels recursos suportats per l’eina, així com un llistat dels recursos afectats en el pla de Terraform que no estan suportats i, per tant, no s’inclouran en l’estimació de costos.
Fitxer “usage.yaml” d’exemple
L’arxiu usage.yaml
permet definir l’ús esperat, el consum, dels recursos que es creen amb Terraform. Aquest ús és necessari per poder realitzar una estimació de costos més precisa, ja que molts serveis al núvol tenen un cost associat no només a la infraestructura aprovisionada, sinó també a l’ús que se’n fa (per exemple, hores d’ús, transferència de dades, operacions, etc.).
S’adjunta la documentació oficial de Cloudability sobre el format i els recursos suportats en l’arxiu usage.yaml
: Cloudability Usage File Documentation. En aquesta documentació s’aniran actualitzant els recursos suportats per l’eina a mesura que se’n vagin afegint.
A continuació es mostra un exemple d’arxiu usage.yaml
que cobreix diversos tipus de recursos comuns en AWS que són suportats actualment per l’eina. Qualsevol recurs no definit en aquest yaml d’exemple no estaria suportat per l’eina de moment.
Aquest arxiu ha d’estar ubicat en el mateix directori que els arxius de configuració de Terraform, dins del directori de l’entorn corresponent, env/dev/
, env/pre/
o env/pro/
.
version: "0.1"
resource_usage: # All resource usage values should be listed here
# The resource is identified as <terraform_resource_name>.<resource_identifier>
# Each resource field represents a specific attribute and its expected usage
# <attribute_field_name>:<expected_value>
# Compute Resources
aws_instance.example_ec2_instance:
count: 1
term_type: "compute_savings_plan"
purchase_option: "partial_upfront"
lease_contract_length: "3yr"
# aws_launch_template.example_launch_template:
# count: 3
# term_type: "reserved"
# purchase_option: "no_upfront"
# lease_contract_length: "1yr"
# Database Resources
# aws_db_instance.example_db_instance:
# term_type: "reserved"
# purchase_option: "all_upfront"
# lease_contract_length: "3"
# aws_rds_cluster.example_rds_cluster:
# acu_per_hour: 0.5
# aurora_storage_gb: 100
# aws_dynamodb_table.example_dynamodb_table:
# storage_gb: 50
# strongly_consistent_reads_per_month: 1000000
# eventually_consistent_reads_per_month: 2000000
# transaction_reads_per_month: 500000
# standard_writes_per_month: 800000
# transaction_writes_per_month: 200000
# average_item_byte_size: 1024
# aws_elasticache_cluster.example_elasticache_cluster:
# term_type: "reserved"
# purchase_option: "partial_upfront"
# lease_contract_length: "1"
# aws_elasticache_replication_group.example_elasticache_replication_group:
# term_type: "on_demand"
# purchase_option: "heavy_utilization"
# lease_contract_length: "3"
# aws_redshift_cluster.example_redshift_cluster:
# term_type: "reserved"
# backup_storage_gb: 200
# spectrum_data_scanned_tb: 5
# managed_storage_gb: 1000
# data_transfer_gb: 100
# utilization_hours: 720
# Storage Resources
# aws_ebs_volume.example_ebs_volume:
# count: 2
# iops: 3000
# throughput: 250
# aws_fsx_lustre_file_system.example_fsx_lustre:
# compression_factor: 2.5
# backup_storage_gb: 500
# aws_s3_bucket.example_s3_bucket:
# standard_storage:
# storage_gb: 1000
# rw_requests: 100000
# ro_requests: 500000
# standard_ia_storage:
# storage_gb: 500
# rw_requests: 10000
# ro_requests: 50000
# Messaging Resources
# aws_sns_topic.example_sns_topic:
# monthly_requests: 1000000
# monthly_storage: 10
# aws_sns_topic_subscription.example_sns_subscription:
# monthly_notifications: 500000
# aws_sqs_queue.example_sqs_queue:
# monthly_notifications: 2000000
# Serverless Resources
# aws_lambda_function.example_lambda_function:
# monthly_requests: 10000000
# request_duration_ms: 500
# aws_lambda_provisioned_concurrency_config.example_lambda_provisioned:
# monthly_requests: 5000000
# request_duration_ms: 300
# Big Data Resources
# aws_emrserverless_application.example_emr_serverless:
# job_runtime_hour: 100
# aws_emrcontainers_job_template.example_emr_containers:
# job_runtime_hour: 50
# job_vcpu: 4
# job_memory_gb: 16
# Event Processing Resources
# aws_schemas_schema.example_schemas:
# ingestion_count: 10000
# aws_pipes_pipe.example_pipes:
# event_count: 1000000
# aws_cloudwatch_event_bus.example_event_bus:
# event_count: 500000
# aws_cloudwatch_event_archive.example_event_archive:
# archive_processing: 100
# archive_storage: 1000
# Monitoring Resources
# aws_cloudwatch_metric_alarm.example_metric_alarm:
# avg_metrics_retrieved: 1000
# Security Resources
# aws_secretsmanager_secret.example_secret:
# monthly_requests: 100000
# aws_kms_key.example_kms_key:
# monthly_symmetric_requests: 100000
# monthly_asymmetric_requests_except_rsa2048: 1000
# monthly_asymmetric_rsa2048_requests: 500
# monthly_generatedatakeypair_ecc_requests: 100
# monthly_generatedatakeypair_rsa_requests: 50
# aws_kms_external_key.example_kms_external_key:
# monthly_symmetric_requests: 50000
# monthly_asymmetric_requests_except_rsa2048: 500
# monthly_asymmetric_rsa2048_requests: 250
# monthly_generatedatakeypair_ecc_requests: 50
# monthly_generatedatakeypair_rsa_requests: 25
# aws_kms_replica_key.example_kms_replica_key:
# monthly_symmetric_requests: 75000
# monthly_asymmetric_requests_except_rsa2048: 750
# monthly_asymmetric_rsa2048_requests: 375
# monthly_generatedatakeypair_ecc_requests: 75
# monthly_generatedatakeypair_rsa_requests: 40
# aws_kms_replica_external_key.example_kms_replica_external_key:
# monthly_symmetric_requests: 25000
# monthly_asymmetric_requests_except_rsa2048: 250
# monthly_asymmetric_rsa2048_requests: 125
# monthly_generatedatakeypair_ecc_requests: 25
# monthly_generatedatakeypair_rsa_requests: 10
# Networking Resources
# aws_nat_gateway.example_nat_gateway:
# data_transfer_month_gb: 1000
# aws_vpn_connection.example_vpn_connection:
# data_processing_month_gb: 500
# aws_ec2_transit_gateway_vpc_attachment.example_transit_gateway:
# data_processing_month_gb: 2000
# aws_ec2_client_vpn_network_association.example_client_vpn:
# active_users: 50
# hrs_active_per_month: 720
Cal destacar que per definir els recursos amb la nomenclatura <terraform_resource_name>.<resource_identifier>
, s’ha de seguir el format adequat, i si no es té clar, es pot consultar el pla de Terraform generat en el pas anterior del workflow de CI per identificar els noms correctes dels recursos. També es pot consultar en les execucions prèvies en l’estimació de costos generada per l’eina en els comentaris del PR, els noms dels recursos que sí han estat reconeguts per l’eina sense haver estat especificats en l’arxiu usage.yaml
, per iterar de nou i aquesta vegada fer l’estimació el més realista i precisa possible.
S’afegeix un exemple de comentari generat per l’eina en un PR, on es pot observar el resum del cost dels recursos suportats, així com els recursos no suportats i els recursos amb canvis que no han pogut ser estimats. A continuació es detalla un exemple d’aquest comentari generat automàticament: