Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Terraform module which calculates price of AWS infrastructure (from Terraform state and plan) 🇺🇦

License

NotificationsYou must be signed in to change notification settings

terraform-aws-modules/terraform-aws-pricing

Terraform module, which calculates the AWS infrastructure cost in a variety of ways. This is not atraditional 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 ofmodules.tf that is currently in active development.

Join the mailing list onmodules.tf to stay updated!

If you are looking into alternative ways calculating AWS infrastructure costs (for free), you can useterraform-cost-estimation.com orterraform-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, usingcost.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 applyHOURLY_PRICE=$(terraform output -raw total_price_per_hour)if HOURLY_PRICE< 10then  terraform apply plan.json# (from Project1)elseecho"Crash! Boom! Bang!"end

Notes

AWS provider

Set AWS provider's region tous-east-1,ap-south-1 oreu-central-1 when usingmodules/pricing because AWS Pricing service is only available in these regions.

You can also pass provider explicitly as described in theofficial 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 intomodules/pricing/filters.tf (seedev 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 runterraform 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 likeAzure andGoogle Cloud

Examples

Authors

Module created and managed byAnton Babenko.

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

License

Apache 2 Licensed. See LICENSE for full details.

Sponsor this project

  •  

Packages

No packages published

Contributors9


[8]ページ先頭

©2009-2025 Movatter.jp