Gmailのフィルタを管理するためのTerraformプロバイダーを作った

少し前にこちらの記事でgmailfiltersというツールを知りました。

kakakakakku.hatenablog.com

github.com

gmailfiltersはとても良さそうなのですが、なんでもTerraformおじさん的にはTOMLよりHCLで設定を書きたいなと思ったので この土日でTerraformプロバイダーを実装してみました。

github.com

Gmailのフィルタ/ラベルを設定するTerraformプロバイダー terraform-provider-gmailfilter

Gmail APIでフィルタやラベルの登録/更新/削除が行えます。

例えばfoobar@example.comから来たメールをexampleラベルに振り分けるには以下のようなHCLコードとなります。

# ラベル"INBOX"を参照するためのデータソース
data gmailfilter_label "INBOX" {
  name = "INBOX"
}

# ラベル"example"を作成
resource gmailfilter_label "example" {
  name = "example"
}

# フィルタの登録
resource gmailfilter_filter "example" {
  criteria {
    from = "foobar@example.com"
  }
  action {
    add_label_ids    = [gmailfilter_label.example.id]
    remove_label_ids = [data.gmailfilter_label.INBOX.id]
  }
}

フィルタには以下のような項目が指定可能です。

resource gmailfilter_filter "example" {
  criteria {
    from            = "foobar@example.com"
    exclude_chats   = false
    has_attachment  = false
    negated_query   = "from:someuser@example.com rfc822msgid: is:unread"
    query           = "from:someuser@example.com rfc822msgid: is:unread"
    size            = 1000
    size_comparison = "larger"
    subject         = "example"
    to              = "example@"
  }
  action {
    add_label_ids    = [gmailfilter_label.example.id]
    remove_label_ids = ["INBOX"]
    forward          = "destination@example.com"
  }
}

利用例: 入れ子になったラベル(サブラベル)の管理

サブラベルも作成できます。

resource gmailfilter_label "top" {
  name = "top-level"
}

resource gmailfilter_label "child1" {
  name = "${gmailfilter_label.top.name}/child1"
}

resource gmailfilter_label "child2" {
  name = "${gmailfilter_label.child1.name}/child2"
}

これをterraform applyすると以下のようになります。

f:id:febc_yamamoto:20200426173455p:plain

利用例: 添付メールに Attachment ラベルを付ける

元記事にで紹介されてた例です。 こちらは以下のようなコードになります。

# Attachmentラベルの作成
resource gmailfilter_label "attachment" {
  name = "Attachment"
}

# フィルターの作成
resource gmailfilter_filter "attachment" {
  criteria {
    has_attachment  = true
  }
  action {
    add_label_ids    = [gmailfilter_label.attachment.id]
  }
}

利用例: Amazon 購買メールに Amazon ラベルを付ける

こちらも元記事で紹介されていた例です。
元記事ではqueryOrを用いてますが、このプロバイダーではqueryOrに相当するものは提供していません。
代わりにHCL上で利用できる、Terraformに組み込みのFunctionsを利用してクエリを組み立てていきます。

# 対象のメールアドレスのリスト
locals {
  addresses = [
    "from:shipment-tracking@amazon.co.jp",
    "from:auto-confirm@amazon.co.jp",
    "from:order-update@amazon.co.jp",
  ]
}

# Amazonラベルの作成
resource gmailfilter_label "amazon" {
  name = "Amazon"
}

# フィルターの作成
resource gmailfilter_filter "amazon" {
  criteria {
    query = join(" OR ", local.addresses) # joinでqueryを組み立てる
  }
  action {
    add_label_ids    = [gmailfilter_label.amazon.id]
    remove_label_ids = ["INBOX"]
  }
}

おまけ: 実装について

gmailfiltersではqueryToなどの便利機能を提供していますが、このプロバイダーではその辺を提供せず、GmailAPIをそのままTerraformでラップしたような形としました。
入力/編集できる項目や値はAPIドキュメントを見ればわかるようになっています。

Terraformを使う層であれば自分でAPIドキュメントを読むくらいするだろうという想定です。
なので出来ることの詳細はGmailAPIをみていただくのが一番早いと思います。

注意事項

このプロバイダーでは転送先アドレスの管理は実装していません。 もしフィルタで転送を行いたい場合はあらかじめWebブラウザなどから転送先アドレスを登録しておく必要があります。 参考: Gmail のメールを他のアカウントに自動転送する

また、フィルタを作成しても既存のメールには適用されないようでした。
APIで出来るのかもしれないのですがまだちゃんと調べてないです。

もし適用方法をご存知の方がいらっしゃいましたら教えてもらえると嬉しいです。 (PRもらえるともっと嬉しいです)

終わりに

G Suiteにも対応しておりなかなか便利だと思います。
Terraform好きな方はぜひお試しくださいー。

以上です。