❄️

Terraformのsnowflake_grant_privileges_to_roleでハマった話

2023/09/13に公開

はじめに

私が所属しているライフイズテックのデータ基盤グループでは、Snowflakeの権限管理にTerraformを用いています。

TerraformでSnowflakeのアクセス制御を管理するで紹介しているように、導入当初のTerraformバージョンでは、権限設定のコードが冗長で管理が難しくなるという課題を抱えていました。
そこで、v0.68.0で導入されたsnowflake_grant_privileges_to_roleでの権限設定へ更新した際にOWNERSHIPについての設定でハマった問題をまとめます。

起こったこと

以前のsnowflake_database_grantsnowflake_schema_grantなどを使っていた際は、OWNERSHIPUSAGEと同様に下記にように設定が可能でした。

database.tf
resource "snowflake_database_grant" "g1" {
  database_name = snowflake_database.xxx.name
  privilege = "OWNERSHIP"
  roles = [
    "ACCOUNTADMIN"
  ]
  with_grant_option = false
}

resource "snowflake_database_grant" "g2" {
  database_name = snowflake_database.xxx.name
  privilege = "USAGE"
  roles = [
    "ACCOUNTADMIN"
  ]
  with_grant_option = false
}

そのためOWNERSHIPの権限についても他の権限と同様にsnowflake_grant_privileges_to_roleを使うように修正を加えました。しかしOWNERSHIP以外の権限を設定した場合は成功するにも関わらず、OWNERSHIPに関するリソースについては失敗するという事象に悩まされました。

成功例
resource "snowflake_grant_privileges_to_role" "g1" {
  role_name         = "SYSADMIN"
  privileges        = ["USAGE", "MONITOR"]

  on_account_object {
    object_type = "DATABASE"
    object_name = snowflake_database.xxx.name
  }
}
失敗例
resource "snowflake_grant_privileges_to_role" "g1" {
  role_name         = "ACCOUNTADMIN"
  privileges        = ["OWNERSHIP"]

  on_account_object {
    object_type = "DATABASE"
    object_name = snowflake_database.xxx.name
  }
}

OWNERSHIPを使ったリソースについては下記のエラーが発生しました。
GRANT OWNERSHIPのドキュメントを確認すると、依存権限が存在する場合は依存権限を事前に取り消すか、明示的にコピーするかしないといけないということが原因でした。

Error: error granting privileges to account role: 003036 (23001): SQL execution error: Dependent grant of privilege 'ADD SEARCH OPTIMIZATION' on securable 'XXX' to role 'YYY' exists.  It must be revoked first.  More than one dependent grant may exist: use 'SHOW GRANTS' command to view them.  To revoke all dependent grants while transferring object ownership, use convenience command 'GRANT OWNERSHIP ON <target_objects> TO <target_role> REVOKE CURRENT GRANTS'.

対応策

Snowflakeのエンジニアのコメントによると、snowflake_grant_privileges_to_roleOWNERSHIPを操作するためには、作られていないとのことで、今後登場するsnowflake_grant_ownershipを待つ必要があります。
image.png

ということで、当面の間は以前のままsnowflake_database_grantsnowflake_schema_grantを利用し続けるという回避を行うことになります。

resource "snowflake_database_grant" "g1" {
  database_name = snowflake_database.xxx.name
  privilege = "OWNERSHIP"
  roles = [
    "ACCOUNTADMIN"
  ]
  with_grant_option = false
}

宣伝

ライフイズテック サービス開発部では、月毎に気軽にご参加いただけるカジュアルなイベントを実施しています。開催予定のイベントは、 connpass のグループからご確認ください。興味のあるイベントがあったらぜひ参加登録をお願いいたします。皆さんのご参加をお待ちしています!

Discussion