Help us understand the problem. What is going on with this article?

TerraformでService Accountのprivate keyをFastlyと共有する

つい先日(2019年6月28日)にTerraformのFastly Providerでv0.12のサポート版がリリースされました:tada:
https://github.com/terraform-providers/terraform-provider-fastly/blob/master/CHANGELOG.md#080-june-28-2019

Terraform v0.12からは待望のjsonencode関数が使えるようになっています。
これらを使うことでTerraformでGCPのService Accout KeyとFastly Serviceとをシームレスに連携させることができます。
具体的にみていきましょう。

fastly_service_v1 resource

FastlyのログをGCSやBigQueryにexportする場合、fastly_service_v1gcsloggingbigqueryloggingを使用します。
この場合、連携に使用するService Accountの認証情報をsecret_keyというattributeで渡す必要があります。
あるいは環境でFASTLY_GCS_SECRET_KEYFASTLY_BQ_SECRET_KEYで指定する必要がありました。

google_service_account_key resource

一方で、Service AccountやそのkeyはGoogle providerで提供されているgoogle_service_account, google_service_account_key resourceで管理可能です。

前述のjsondecode関数を使用することでこれらをシームレスに扱えるようになりました。

jsondecodeを使った連携

以下のようなgoogle_service_account_keyがあるとします。

resource "google_service_account" "fastly-logs" {
  account_id   = "fastly-logs"
  display_name = "Fastly Logs"
}

resource "google_service_account_key" "fastly-key" {
  service_account_id = google_service_account.fastly-logs.name
}

例としてgcslogginでの連携を考えます。
Bucketの生成とService Accountへの権限を付与も以下のように管理できます。

resource "google_storage_bucket" "fastly-logs" {
  name     = "my-project-fastly-logs"
  location = "asia-northeast1"
}

resource "google_storage_bucket_iam_member" "fastly-logs-viewer" {
  bucket = google_storage_bucket.fastly-logs.name
  role   = "roles/storage.objectViewer"
  member = "serviceAccount:${google_service_account.fastly-logs.email}"
}

resource "google_storage_bucket_iam_member" "fastly-logs-creator" {
  bucket = google_storage_bucket.fastly-logs.name
  role   = "roles/storage.objectCreator"
  member = "serviceAccount:${google_service_account.fastly-logs.email}"
}

そうするとfastly_service_v1は以下のように設定できるようになります。

resource "fastly_service_v1" "my-service" {
  name        = "my-service"
  ...
  gcslogging {
    name        = "My Service logging"
    email       = google_service_account.fastly-logs.email
    bucket_name = google_storage_bucket.fastly-logs.name
    secret_key  = jsondecode(base64decode(google_service_account_key.fastly-key.private_key)).private_key
    format      = "%h %l %u %t \"%r\" %\u003es %b"
  }
}

途中はしょってますが、重要なのはgcslogging.secret_keyに設定した長文です。
google_service_account_key.private_keyはbase64エンコードされたJSON文字列がはいっています。
なので、base64decodeしてからjsondecodeすることで必要なprivate_keyを取り出して渡しています。
v0.11まではjsonencode関数はありましたが、jsondecode関数はなく、この連携ができませんでした。

ちなみに以前のFastly providerではこのsecret_keyがplan時に毎回差分が発生し、keyが漏れようになっていたので、lifecyle.ignoreを使っていたりしましたが、これも不要になりました。

(追記 2019/10/31)
Providerのドキュメントによると

A typical format for the key is PEM format, containing actual newline characters where required.

https://www.terraform.io/docs/providers/fastly/r/service_v1.html#secret_key

とあるのでちゃんと改行いれると差分でなくなるらしい(自分では未確認)。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした