Sionの技術ブログ

SREとして日々の学習を書いて行きます。twitterは@sion_cojp

terraform 0.13でローカルproviderを利用する方法

はじめに

terraform 0.13からproviderが https://registry.terraform.io/ から配布され、下記のように記述すると自動取得するようになりました。

# ref: https://www.terraform.io/upgrade-guides/0-13.html#explicit-provider-source-locations
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 2.12"
    }
    newrelic = {
      source  = "newrelic/newrelic"
      version = "~> 2.1.1"
    }
  }
}

0.13でprovider開発などでローカルで利用する場合や、まだregistryに上がってないcommunity providerはどうするのか?

0.12では ~/.terraform.d/plugins に置いてました。

しかし、これをやっても読み込めずエラーが出てしまいます。それを私が実際にどうやって解決したかを書きます。

他に良い方法を知ってる方がいらっしゃれば別途記事を書いてもらえると有難いです。

今回は https://github.com/anasinnyk/terraform-provider-1password を例として紹介します。

1. providerのバイナリを配置します

### https://github.com/anasinnyk/terraform-provider-1password/releases/tag/1.1.0
### をダウンロードして下記のように配置します。このファイル名形式じゃないとダメです
/Users/sion_cojp/.terraform.d/plugins/registry.terraform.io/hashicorp/onepassword/1.1.0/darwin_amd64/terraform-provider-onepassword_v1.1.0


### hashicorp じゃないと下記エラーが出ます
# Error: Failed to query available provider packages
# 
# Could not retrieve the list of available versions for provider
# anasinnyk/onepassword: provider registry.terraform.io/anasinnyk/onepassword
# was not found in any of the search locations
# 
# - /Users/sion_cojp/.terraform.d/plugins

2. required_providerを書きます

$ vim backend.tf
terraform {
  backend "s3" {
    必要であれば書く
  }

  required_providers {
    onepassword = {
      source  = "hashicorp/onepassword"
      email = "sion_cojp@xxxxx"
      password = "xxxxxxx"
      secret_key = "xxxxxx"
      subdomain = "organization_name"
    }
  }
}

3. 1passwordにcliからsign inしてセッションキーをexportします

### signinしたらOP_SESSIONが出力されます
$ op signin organization_name.1password.com sion_cojp@xxxxx

export OP_SESSION_organization_name="xxxxxxxx"

### OP_SESSION_myに変えてexportする必要があります。理由はわかりませんが、やらないと下記エラーのどれかがでます
# 1. Error: email, password or secret_key is empty and environment variable OP_SESSION_my is not set
# 2. Output: [ERROR] 2020/10/13 17:07:29 You are not currently signed in. Please run `op signin --help` for instructions
export OP_SESSION_my="xxxxxxxx"

4. applyやshowをします

$ vim main.tf
data onepassword_user this {
  email = "sion_cojp@xxx"
}

### initでpluginの場所を指定するのがポイント。絶対パスじゃないとダメです
$ terraform init -plugin-dir=/Users/sion_cojp/.terraform.d/plugins
$ terraform show
# module.users.data.onepassword_user.this:
data "onepassword_user" "this" {
    email     = "sion_cojp@xxxxxx"
    firstname = "Shohei Koyama"
    id        = "xxxxx"
    state     = "A"
}

Reference