• Stars
    star
    183
  • Rank 210,154 (Top 5 %)
  • Language HCL
  • License
    Apache License 2.0
  • Created almost 4 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Terraform module which calculates price of AWS infrastructure (from Terraform state and plan) πŸ‡ΊπŸ‡¦

Terraform AWS pricing module

Terraform module, which calculates the AWS infrastructure cost in a variety of ways. This is not a traditional Terraform module because it does not create AWS infrastructure resources but using Terraform plan and Terraform states as input.

cost.modules.tf is entirely free cost estimation service, which is part of modules.tf that is currently in active development.

Join the mailing list on modules.tf to stay updated!

If you are looking into alternative ways calculating AWS infrastructure costs (for free), you can use terraform-cost-estimation.com or terraform-cost-estimation.

This is not an official HashiCorp product.

Supported Features

  • Calculate costs before creation (tfplan)
  • Calculate costs after creation (tfstate)
  • Calculate costs from multiple sources (local, remote states, specified resources)
  • Optionally, using cost.modules.tf
  • Can be executed on restricted CI/CD platforms where Terraform can run

Supported Resources

  • EC2 instances (on-demand) and Autoscaling Groups (Launch Configurations and Launch Templates):
    • aws_instance
  • EBS Volumes, Snapshots, Snapshot Copies
    • aws_ebs_volume
    • aws_ebs_snapshot
    • aws_ebs_snapshot_copy
  • Elastic Load Balancing (ELB, ALB, NLB)
    • aws_elb
    • aws_alb / aws_lb
  • NAT Gateways
    • aws_nat_gateway
  • Redshift Clusters
    • aws_redshift_cluster

Feature Roadmap

  • More EC2 instances (on-demand) and Autoscaling Groups (Launch Configurations and Launch Templates)
    • aws_autoscaling_group
    • aws_launch_configuration
    • aws_launch_template
  • EC2 Fleets (on-demand)
    • aws_ec2_fleet

Usages

Using AWS Pricing API: Terraform state or plan as JSON

provider "aws" {
  region = "us-east-1"
}

module "pricing" {
  source = "terraform-aws-modules/pricing/aws//modules/pricing"
  
  # content can be Terraform state or plan as JSON fetched from any source (see examples)
  content = jsondecode("{\"version\": 4, \"terraform_version\": \"0.14.4\", ...")
}

Using AWS Pricing API: Terraform plan as JSON from local file

provider "aws" {
  region = "us-east-1"
}

data "local_file" "local_plan" {
  filename = "local_plan.json"
}

module "pricing" {
  source = "terraform-aws-modules/pricing/aws//modules/pricing"
  
  content = jsondecode(data.local_file.local_plan.content)
}

Using AWS Pricing API: Specified resources

provider "aws" {
  region = "us-east-1"
}

module "pricing" {
  source = "terraform-aws-modules/pricing/aws//modules/pricing"
  
  resources = {
    "aws_instance.this#5" = { # Note: This means 5 instances (`count = 5`)
      instanceType = "c5.xlarge"
      location     = "eu-west-2"
    }
    "aws_instance.this2" = {
      instanceType = "c4.xlarge"
      location     = "eu-central-1"
    }
  }
}

Run in automation

@todo: Describe in more details...

# Project1 (with real EC2 resources):
terraform plan -out=plan.tfplan > /dev/null && terraform show -json plan.tfplan > plan.json

# Project2 (terraform-aws-pricing module):
TF_VAR_file_path=plan.json terraform apply
HOURLY_PRICE=$(terraform output -raw total_price_per_hour)

if HOURLY_PRICE < 10 then
  terraform apply plan.json # (from Project1)
else
  echo "Crash! Boom! Bang!"
end

Notes

AWS provider

Set AWS provider's region to us-east-1 or sa-east-1 when using modules/pricing because AWS Pricing service is only available in these regions.

You can also pass provider explicitly as described in the official documentation.

Debug & development tips

  1. debug_output = true will return more output which is often helpful only for development and debug purposes.

  2. call_aws_pricing_api = false will not call AWS Pricing API. Wrong filters produce a lot of noise, so it makes sense to disable this option when developing new filters.

  3. AWS Pricing API should always return one response for the filter. Running these commands can help identify available filters to put into modules/pricing/filters.tf (see dev directory also):

    aws pricing describe-services --service-code AmazonEC2 --format-version aws_v1 --max-items 1 --region us-east-1

    aws pricing get-products --region us-east-1 --filters file://filters.json --format-version aws_v1 --service-code AmazonEC2

Ephemeral Terraform backend

Sometimes, you may want to not store Terraform state in backend when dealing with pricing, you can use backend "inmem":

terraform {
  backend "inmem" {}
}

When you use this type of backend, there is no way to run terraform output.

Known issues/limitations

  1. Autoscaling groups resources
  2. When changing values price is sometimes higher after the first run because it is calculated based on keys and there can be some previous keys. Solution is to update code to include some unique key/prefix. Or just disable terraform state (no state = no past).
  3. At some point later, maybe add support for other providers like Azure and Google Cloud

Examples

Authors

Module created and managed by Anton Babenko.

Please reach out to Betajob if you are looking for commercial support for your Terraform, AWS, or serverless project.

License

Apache 2 Licensed. See LICENSE for full details.

More Repositories

1

terraform-aws-eks

Terraform module to create Amazon Elastic Kubernetes (EKS) resources πŸ‡ΊπŸ‡¦
HCL
4,372
star
2

terraform-aws-vpc

Terraform module to create AWS VPC resources πŸ‡ΊπŸ‡¦
HCL
2,949
star
3

terraform-aws-lambda

Terraform module, which takes care of a lot of AWS Lambda/serverless tasks (build dependencies, packages, updates, deployments) in countless combinations πŸ‡ΊπŸ‡¦
HCL
899
star
4

terraform-aws-rds

Terraform module to create AWS RDS resources πŸ‡ΊπŸ‡¦
HCL
879
star
5

terraform-aws-iam

Terraform module to create AWS IAM resources πŸ‡ΊπŸ‡¦
HCL
779
star
6

terraform-aws-ec2-instance

Terraform module to create AWS EC2 instance(s) resources πŸ‡ΊπŸ‡¦
HCL
751
star
7

terraform-aws-security-group

Terraform module to create AWS Security Group resources πŸ‡ΊπŸ‡¦
HCL
563
star
8

terraform-aws-ecs

Terraform module to create AWS ECS resources πŸ‡ΊπŸ‡¦
HCL
555
star
9

terraform-aws-atlantis

Terraform module to deploy Atlantis on AWS Fargate πŸ‡ΊπŸ‡¦
HCL
519
star
10

terraform-aws-s3-bucket

Terraform module to create AWS S3 resources πŸ‡ΊπŸ‡¦
HCL
511
star
11

terraform-aws-notify-slack

Terraform module to create AWS resources for sending notifications to Slack πŸ‡ΊπŸ‡¦
Python
466
star
12

terraform-aws-alb

Terraform module to create AWS Application/Network Load Balancer (ALB/NLB) resources πŸ‡ΊπŸ‡¦
HCL
433
star
13

terraform-aws-rds-aurora

Terraform module to create AWS RDS Aurora resources πŸ‡ΊπŸ‡¦
HCL
384
star
14

terraform-aws-autoscaling

Terraform module to create AWS Auto Scaling resources πŸ‡ΊπŸ‡¦
HCL
292
star
15

terraform-aws-acm

Terraform module to create AWS ACM resources πŸ‡ΊπŸ‡¦
HCL
182
star
16

terraform-aws-cloudwatch

Terraform module to create AWS Cloudwatch resources πŸ‡ΊπŸ‡¦
HCL
163
star
17

terraform-aws-elb

Terraform module to create AWS ELB resources πŸ‡ΊπŸ‡¦
HCL
148
star
18

terraform-aws-apigateway-v2

Terraform module to create AWS API Gateway v2 (HTTP/WebSocket) πŸ‡ΊπŸ‡¦
HCL
146
star
19

terraform-aws-eventbridge

Terraform module to create AWS EventBridge resources πŸ‡ΊπŸ‡¦
HCL
142
star
20

terraform-aws-transit-gateway

Terraform module to create AWS Transit Gateway resources πŸ‡ΊπŸ‡¦
HCL
141
star
21

terraform-aws-route53

Terraform module to create AWS Route53 resources πŸ‡ΊπŸ‡¦
HCL
126
star
22

terraform-aws-cloudfront

Terraform module to create AWS CloudFront resources πŸ‡ΊπŸ‡¦
HCL
119
star
23

terraform-aws-vpn-gateway

Terraform module to create AWS VPN gateway resources πŸ‡ΊπŸ‡¦
HCL
111
star
24

terraform-aws-dynamodb-table

Terraform module to create AWS DynamoDB resources πŸ‡ΊπŸ‡¦
HCL
100
star
25

terraform-aws-sns

Terraform module to create AWS SNS resources πŸ‡ΊπŸ‡¦
HCL
95
star
26

terraform-aws-sqs

Terraform module to create AWS SQS resources πŸ‡ΊπŸ‡¦
HCL
92
star
27

terraform-aws-key-pair

Terraform module to create AWS EC2 key pair resources πŸ‡ΊπŸ‡¦
HCL
83
star
28

terraform-aws-redshift

Terraform module to create AWS Redshift resources πŸ‡ΊπŸ‡¦
HCL
81
star
29

meta

Meta-configurations for repositories, teams, files in terraform-aws-modules organization πŸ‡ΊπŸ‡¦
HCL
76
star
30

terraform-aws-solutions

Set of standalone and reusable AWS/DevOps solutions implemented as Terraform modules πŸ‡ΊπŸ‡¦
HCL
75
star
31

terraform-aws-step-functions

Terraform module to create AWS Step Functions πŸ‡ΊπŸ‡¦
HCL
70
star
32

terraform-aws-dms

Terraform module to create AWS DMS (Database Migration Service) resources πŸ‡ΊπŸ‡¦
HCL
62
star
33

terraform-aws-rds-proxy

Terraform module to create AWS RDS Proxy resources πŸ‡ΊπŸ‡¦
HCL
56
star
34

terraform-aws-msk-kafka-cluster

Terraform module to create AWS MSK (Managed Streaming for Kafka) resources πŸ‡ΊπŸ‡¦
HCL
55
star
35

terraform-aws-datadog-forwarders

Terraform module to create resources on AWS to forward logs/metrics to Datadog πŸ‡ΊπŸ‡¦
HCL
53
star
36

terraform-aws-eks-pod-identity

Terraform module to create AWS EKS Pod Identity resources πŸ‡ΊπŸ‡¦
HCL
52
star
37

terraform-aws-appsync

Terraform module to create AWS AWS AppSync resources πŸ‡ΊπŸ‡¦
HCL
50
star
38

terraform-aws-kms

Terraform module to create AWS KMS resources πŸ‡ΊπŸ‡¦
HCL
49
star
39

terraform-aws-ecr

Terraform module to create AWS ECR resources πŸ‡ΊπŸ‡¦
HCL
49
star
40

terraform-aws-managed-service-grafana

Terraform module to create AWS Managed Service for Grafana (AMG) resources πŸ‡ΊπŸ‡¦
HCL
36
star
41

terraform-aws-batch

Terraform module to create AWS Batch resources πŸ‡ΊπŸ‡¦
HCL
35
star
42

terraform-aws-app-runner

Terraform module to create AWS App Runner resources πŸ‡ΊπŸ‡¦
HCL
32
star
43

terraform-aws-secrets-manager

Terraform module to create AWS Secrets Manager resources πŸ‡ΊπŸ‡¦
HCL
28
star
44

terraform-aws-appconfig

Terraform module to create AWS AppConfig resources πŸ‡ΊπŸ‡¦
HCL
27
star
45

terraform-aws-managed-service-prometheus

Terraform module to create AWS Managed Service for Prometheus (AMP) resources πŸ‡ΊπŸ‡¦
HCL
26
star
46

terraform-aws-efs

Terraform module to create AWS EFS resources πŸ‡ΊπŸ‡¦
HCL
24
star
47

terraform-aws-emr

Terraform module to create AWS EMR resources πŸ‡ΊπŸ‡¦
HCL
23
star
48

.github

Meta-GitHub repository for all terraform-aws-modules repositories πŸ‡ΊπŸ‡¦
22
star
49

terraform-aws-ssm-parameter

Terraform module to create AWS SSM Parameter resources πŸ‡ΊπŸ‡¦
HCL
20
star
50

terraform-aws-s3-object

Terraform module which creates S3 object resources on AWS
HCL
17
star
51

terraform-aws-ebs-optimized

Terraform module to determine if an instance can be flagged for EBS optimization
HCL
17
star
52

terraform-aws-customer-gateway

Terraform module to create AWS Customer Gateway resources πŸ‡ΊπŸ‡¦
HCL
17
star
53

terraform-aws-global-accelerator

Terraform module to create AWS Global Accelerator resources πŸ‡ΊπŸ‡¦
HCL
16
star
54

terraform-aws-memory-db

Terraform module to create AWS MemoryDB resources πŸ‡ΊπŸ‡¦
HCL
16
star
55

terraform-aws-opensearch

Terraform module to create AWS OpenSearch resources πŸ‡ΊπŸ‡¦
HCL
15
star
56

terraform-aws-elasticache

Terraform module to create AWS ElastiCache resources πŸ‡ΊπŸ‡¦
HCL
12
star
57

terraform-aws-network-firewall

Terraform module to create AWS Network Firewall resources πŸ‡ΊπŸ‡¦
HCL
12
star
58

terraform-aws-fsx

Terraform module to create AWS FSx resources πŸ‡ΊπŸ‡¦
HCL
4
star
59

atlantis-demo

Demo repository for Atlantis
3
star