📑

Infracostでのリージョンの指定

2022/09/20に公開

Infracostは最近一番お気に入りのツールです。

https://www.infracost.io/

Terraformを書くだけで、クラウドのお値段を出してくれます(※未対応のリソースはある)。

terraform init なしでコスト計算してくれるので、認証に関わりそうなところにはいっさい触れない様にしているのかなと思っています。思ってるだけです。

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

のようにTerraformのコードに明示的に書く必要がありましたが、環境変数で上書きできるようになりました。

https://www.infracost.io/docs/features/environment_variables/#environment-variables-to-override-cloud-provider-region

基本的にはterraformファイル側でリージョンを指定するのがよさそうか?その上で上書きしたい場合は、環境変数を使って上書きできます。

マルチリージョンな時にどうするかはちょっとわからn

メンテナさん、わざわざメンションありがとうございました!!メールで通知が来て気づけた!!
https://github.com/infracost/infracost/issues/1796#issuecomment-1339690840


ここからは先は過去の話

色々便利なのですが、現在、Infracostでは、Infracost側の仕組みでリージョンを指定する方法が現在ありません。環境変数なんかも見てくれていないです。

先に書いておくと、現在色々と議論中です。正座して待ちます。
https://github.com/infracost/infracost/issues/1796

で、本当に例えば環境変数なんかで指定できないか試してみました。結論から言うとできません。AWSしか試してないけど。

Infracostはクレデンシャルを一切見ないため、terraformファイル上でリージョンを指定する必要があります。

$ echo $AWS_DEFAULT_REGION
ap-northeast-1
$ cat ~/.aws/config
[default]
region=ap-northeast-1

環境変数、設定ファイルともに ap-northeast-1を指定しています。いやこれでスペル間違ってたら笑う…3度見くらいして確認しています。

以下の terraformコードで現在のリージョンを確認します。

data "aws_region" "current" {}

output "region" {
  value = data.aws_region.current
}

terraform initterraform planします。

$ terraform plan
data.aws_region.current: Reading...
data.aws_region.current: Read complete after 0s [id=ap-northeast-1]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_instance.foo will be created
  + resource "aws_instance" "foo" {
      + ami                                  = "asdf"
(snip)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + region = {
      + description = "Asia Pacific (Tokyo)"
      + endpoint    = "ec2.ap-northeast-1.amazonaws.com"
      + id          = "ap-northeast-1"
      + name        = "ap-northeast-1"
    }

─────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
$ infracost breakdown --path .
Evaluating Terraform directory at .
  ✔ Downloading Terraform modules
  ✔ Evaluating Terraform directory
  ✔ Retrieving cloud prices to calculate costs

Project: .

 Name                                                 Monthly Qty  Unit   Monthly Cost

 aws_instance.foo
 ├─ Instance usage (Linux/UNIX, on-demand, t2.micro)          730  hours         $8.47
 └─ root_block_device
    └─ Storage (general purpose SSD, gp2)                       8  GB            $0.80

 OVERALL TOTAL                                                                   $9.27
──────────────────────────────────
1 cloud resource was detected:
∙ 1 was estimated, it includes usage-based costs, see https://infracost.io/usage-file

先ほどのterraformコードに以下の行を追加して、infracostコマンドを実行するとお値段は同じです。

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

では、リージョンを ap-northeast-1にして実行してみます。

provider "aws" {
  region = "ap-northeast-1"
}

いっけえ~

$ infracost breakdown --path .
Evaluating Terraform directory at .
  ✔ Downloading Terraform modules
  ✔ Evaluating Terraform directory
  ✔ Retrieving cloud prices to calculate costs

Project: .

 Name                                                 Monthly Qty  Unit   Monthly Cost

 aws_instance.foo
 ├─ Instance usage (Linux/UNIX, on-demand, t2.micro)          730  hours        $11.10
 └─ root_block_device
    └─ Storage (general purpose SSD, gp2)                       8  GB            $0.96

 OVERALL TOTAL                                                                  $12.06
──────────────────────────────────
1 cloud resource was detected:
∙ 1 was estimated, it includes usage-based costs, see https://infracost.io/usage-file

というわけで、環境変数や設定ファイルを見てないという証明?でした。ここはご注意ください。

設定ファイルもあるのですが、そちらでも設定うまくいかないし、ドキュメントも眺めてみましたがないので、本当にデフォルトのリージョンを設定する方法はないのでしょう。

Discussion