Gmailのフィルタを管理するためのTerraformプロバイダーを作った
少し前にこちらの記事でgmailfiltersというツールを知りました。
gmailfiltersはとても良さそうなのですが、なんでもTerraformおじさん的にはTOMLよりHCLで設定を書きたいなと思ったので この土日でTerraformプロバイダーを実装してみました。
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
すると以下のようになります。
利用例: 添付メールに 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
などの便利機能を提供していますが、このプロバイダーではその辺を提供せず、GmailのAPIをそのままTerraformでラップしたような形としました。
入力/編集できる項目や値はAPIドキュメントを見ればわかるようになっています。
Terraformを使う層であれば自分でAPIドキュメントを読むくらいするだろうという想定です。
なので出来ることの詳細はGmailのAPIをみていただくのが一番早いと思います。
- Gmail:ラベルAPI: https://developers.google.com/gmail/api/v1/reference/users/labels
- Gmail:フィルターAPI: https://developers.google.com/gmail/api/v1/reference/users/settings/filters
注意事項
このプロバイダーでは転送先アドレスの管理は実装していません。 もしフィルタで転送を行いたい場合はあらかじめWebブラウザなどから転送先アドレスを登録しておく必要があります。 参考: Gmail のメールを他のアカウントに自動転送する
また、フィルタを作成しても既存のメールには適用されないようでした。
APIで出来るのかもしれないのですがまだちゃんと調べてないです。
もし適用方法をご存知の方がいらっしゃいましたら教えてもらえると嬉しいです。 (PRもらえるともっと嬉しいです)
終わりに
G Suiteにも対応しておりなかなか便利だと思います。
Terraform好きな方はぜひお試しくださいー。
以上です。